Keresés

Részletes keresés

Sánta Kutya (SK) Creative Commons License 2010.07.11 0 0 12297
Index fórum. :-DDD Ilyenkor attól jön meg, ha még egyet beírunk. Onnan tudod, hogy balra a kedvencekben azért látszik, csak a topicban nem.
Előzmény: Gavriel (12296)
Delila_1 Creative Commons License 2010.07.11 0 0 12293

Van az A oszlopodban egy halom keresztnév, mellettük a B és C oszlopokban összegek. A feladat, hogy a sorban, ahol a Vilhelmina név szerepel, a D oszlopba a B és C szorzata kerüljön. Többezer sor van.

 

Sub szoroz()
    Dim sor As Integer
   
    For sor = 2 To Range("A65536").End(xlUp).Row
        If Cells(sor, 1) = "Vilhelmina" Then
            Cells(sor, 4) = Cells(sor, 2) * Cells(sor, 3)
            Exit For
        End If
    Next
End Sub

A feltétel az If-es sor. Tudjuk, hogy csak 1 Vilhelmina van, ezért a művelet elvégzése után nem nézetjük tovább a rengeteg további nevet, hanem kilépünk a ciklusból. Ebben az esetben Exit Sub is lehetett volna a kilépés.

 

Nem életszerű a példa, de talán érthető. :)

Előzmény: Redlac (12292)
Redlac Creative Commons License 2010.07.11 0 0 12292
Amit Delila írt, az szimpatikus és érthető :-)

Nálad azt értem, hogy feltételt vizsgálok, csak azt nem tudom, hogyan.
Előzmény: Gavriel (12291)
Delila_1 Creative Commons License 2010.07.11 0 0 12290
A Sub Gomb9_Kattintás() makróban a Range("A12:AD65000").Select sor helyett
ezt írd:

Range("A12").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

Akkor azt a területet jelölöd ki rendezésre, amelyik adatokat tartalmaz, nem lesznek üres sorok.

Lehet, hogy Gavriel nem erre gondolt, én nem látok Do-Loop ciklust.
Előzmény: Redlac (12289)
Redlac Creative Commons License 2010.07.11 0 0 12289
Ez jól hangzik...bár nem értem :-)


Tudnál segíteni, hogy az alább mellékelt kódot, hogyan kellene módosítani?
Előzmény: Gavriel (12288)
Törölt nick Creative Commons License 2010.07.09 0 0 12286
Nincs mit.
Arra figyelj, hogy ebben a makróban a Target tartomány jelöli a megváltozott cellákat.
Egyszerre ugyanis nem csak egy, hanem több cella is megváltozhat, pl. értékek törlésekor, másolás-beillesztéskor, stb.
Nagyon kifinomult szűréseket is lehet csinálni arra nézve, hogy milyen Target esetén fusson le a makró, és mikor ne. Én most azt a feltételt adtam meg, hogy a megváltozott tartomány egyoszlopos legyen, és ez az egy oszlop az első (A) oszlop legyen.
Nem tudom, hogy a céljaidnak mi a legmegfelelőbb.
Előzmény: motinka (12285)
motinka Creative Commons License 2010.07.09 0 0 12285
köszönöm megvan csak előbb írtam mint gondolkoztam :o)

mégy egyszer köszönöm
Előzmény: motinka (12284)
motinka Creative Commons License 2010.07.09 0 0 12284
már csak azt kellene tudnom, hogy mit változtassak ha a pl: E oszlopba szeretnék írni és ennek hatására a 15-ik oszlopba kellene hogy beírja az időpontot
Előzmény: motinka (12282)
Törölt nick Creative Commons License 2010.07.09 0 0 12283
Igazándiból, ebből számomra nem látszik, hogy mitől lassult le, de, ha vannak a munkalapon képletek, ennek folyamatos újraszámoltatása okozhatott lassulást.

Ebből kiindulva az újraszámolás ki/be kapcsolása segíthetett.

Előzmény: Redlac (12279)
motinka Creative Commons License 2010.07.09 0 0 12282
nagyon köszönöm ! ez a megoldás
Előzmény: Törölt nick (12281)
Törölt nick Creative Commons License 2010.07.09 0 0 12281
Próbáld ki :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If (Target.Columns.Count = 1) And (Target.Column = 1) Then
For Each c In Target.Offset(, 2)
If c = "" Then c = Now
Next
End If
End Sub
Előzmény: motinka (12280)
motinka Creative Commons License 2010.07.09 0 0 12280

sziasztok,

 

segítségre lenne szükségem:

egy excel táblában azt szeretném, hogy pl: az A oszlop egyik cellájába adatbevitelkor, az ugyanabban a sorban lévő C oszlopba írja be a bevitel dátumát, idejét és ez frissítéskor ne változzon meg.

Eljutottam odáig hogy ide célszerú VB-t használni.

A következő már majdnem jó:

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Const LNG_OSZLOP As Long = 3
        Dim lngSor As Long
        lngSor = ActiveCell.Row - 1
               If Cells(lngSor, LNG_OSZLOP) = "" Then
                        Cells(lngSor, LNG_OSZLOP) = Now()
              End If
End Sub

 

csak itt az a probléma, hogy akárhova írok a táblázatba, beteszi a dátumot/időt, holott csak az A oszlop azonos sorába íráskor kellene hogy működjön.

 

ha valaki tud segítsen pls.

 

előre is köszönöm

Redlac Creative Commons License 2010.07.09 0 0 12279
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Not Intersect(Target, Range("B12:B65000")) Is Nothing Then
Target.Value = Date
Cancel = True
End If

If Not Intersect(Target, Range("Q12:AC65000, G12:G65000, K12:K65000")) Is Nothing Then
Target.Value = "IGEN"
Cancel = True
End If

End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

If Not Intersect(Target, Range("K12:K65000")) Is Nothing Then
Target.Value = "NEM"
Cancel = True
End If

If Not Intersect(Target, Range("G12:G65000")) Is Nothing Then
Selection.ClearContents
Cancel = True
End If

End Sub


EDDIG ezek futottak vánszorogva. Aztán a tegnapi hóka-móka (amit ajánlottál) után, már rendesen futnak.

Aztán ezek mellett vannak még ezek:
Sub Gomb9_Kattintás()
Range("A12:AD65000").Select
Selection.Sort Key1:=Range("A12"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A12").Select

Ez(ek) a fejlécgomb(ok) sorba rendezik az adott oszlop alapján az egész táblát. Ez is kínkeserves volt. Ez elé, illetve mögé nem írtam semmit, de már ez is normálisan fut.
Törölt nick Creative Commons License 2010.07.09 0 0 12278

Az Application.EnableEvents = false volt a ludas, ezt ki kell venni, illetve a kattintások közötti feldolgozási rész eljére tenni (a végén pedig visszakapcsolni). Egyébként még be lehet illeszteni a képernyő frissítések ki/be kapcsolását is, ez is lassíthat.

 

Application.ScreenUpdating = False 'kikapcsolás

Application.ScreenUpdating = True 'bekapcsolás

 

Mondjuk, a leghatékonyabban úgy tudnánk segíteni, ha mutatnál kódot (kódrészletet) ami lassan fut. 

Előzmény: Redlac (12277)
Redlac Creative Commons License 2010.07.08 0 0 12277
Na, ezt most nem értem.

1. Beírtam a kérdéses makró elejére és végére, amit ajánlottál.
2. Erre gyorsan (nem vacakolva) beírt egyet, de utána a dupla klikk, illetve maga a makró nem működött.
3. Mentettem, bezártam
4. Újra megnyitottam, a dupla klikk és a makró ugyanúgy nem működött.
5. Töröltem az általad leírtakat a makró elejéről-végéről, majd ment/bezár
6. Megnyitottam újra, és tökéletesen működik, semmi tökölés, villámgyorsan ír be, de az eredeti állapothoz képest (elvileg) nem változott semmi.
Előzmény: Törölt nick (12275)
Törölt nick Creative Commons License 2010.07.08 0 0 12276
Érdemes lehet szemügyre venni magukat a makrókat is.
Általában lehet a meglévőnél hatékonyabb algoritmust találni.
Tipikus hiba, amikor ciklusban sorra Select-áljuk a cellákat. Semmi értelme, viszont hálából 10-szeres lassulást okoz.
Előzmény: Redlac (12272)
Törölt nick Creative Commons License 2010.07.08 0 0 12275
Ha sok a képlet a munkalapon, esetleg érdemes kikapcsolni a képletek újraszámolást, mert minden változáskor ez lefut. Aztán még meg lehet próbálni az események futását is kikapcsolni a makró futásának idején, hátha ez is lassít valamit:

Application.EnableEvents = False ' ne fussanak az események
Application.Calculation = xlCalculationManual 'ne számolja újra a képleteket

Ne felejtsd el a nakró végén ezeket visszakacsolni:

Application.EnableEvents = True ' fussanak az események
Application.Calculation = xlCalculationAutomatic 'mehet a képletek újraszámolása


Előzmény: Redlac (12272)
Sánta Kutya (SK) Creative Commons License 2010.07.08 0 0 12274
Már megint lenyelte az index a hozzászólásomat? Pedig megjelent a nevem a kedvencekben.
Sánta Kutya (SK) Creative Commons License 2010.07.08 0 0 12273
Ezen a ponton már érdemes foglalkozni az algoritmusok hatékonyságával. Például egy rendezésnél, aminek a lépésszáma az elemszámmal közel négyzetesen nő, bizony előfordulhat ez. Tehát érdemes körülnézni a rendezési algoritmusok elméletében.
Előzmény: Redlac (12272)
Redlac Creative Commons License 2010.07.08 0 0 12272
Azért nem, mert egy "üres" lapot tölt ki a felhasználó adatokkal. Ebben az "üres" lapban vannak adatbevitelt könnyítő makrók, valamint sorba rendező makrók amiknek természetesen az egész lapon kellene működniük.

De, ha bármilyen okból több ezer sort vizsgálnánk (mert szükséges), akkor természetes ez a lassulás?
Előzmény: Törölt nick (12259)
Törölt nick Creative Commons License 2010.07.08 0 0 12271
Tiszta igaz. Még szerencse, hogy lehet saját függvényt írni és ezzel megoldani az érték pontos meghatározását.
Előzmény: Sánta Kutya (SK) (12270)
Sánta Kutya (SK) Creative Commons License 2010.07.08 0 0 12270
Meglehetősen bonyolult megoldás csak azért, mert a tervező kifelejtett egy teljesen logikus és kézenfekvő metódust.
Előzmény: Törölt nick (12269)
Törölt nick Creative Commons License 2010.07.08 0 0 12269
Jó a kérdésed, őszintén szólva, most kipróbáltam, szóval, ha az adott oszlop 65536. sorában van valami adat, akkor is az ettől felfelé az első értéket képviselő sort adja eredményül, vagyis, ebben az esetben nem ad jó eredményt...

Jó, hogy felvetetted, használat előtt ezentúl már ezt is vizsgálni fogom pl. így:

If Range("A" & Rows.Count) = "" Then
MsgBox "Az 'A' oszlop utolsó sora: " & Range("A" & Rows.Count).End(xlUp).Row
Else: MsgBox "Az 'A' oszlop utolsó sora: " & Rows.Count
End If
Előzmény: Sánta Kutya (SK) (12268)
Sánta Kutya (SK) Creative Commons License 2010.07.08 0 0 12268
Köszönöm, így már teljesen világos. Ha én írtam volna ezt a Basicet, lenne valami egyszerűbb megoldás, amit megérteni is egyszerűbb lenne, mondjuk Last néven. :-) Jut eszembe, ez a megoldás akkor is működik, ha a 65536. sorban is van adat? Mert a lenti kísérletem nem erre utal.
Előzmény: Törölt nick (12267)
Törölt nick Creative Commons License 2010.07.08 0 0 12267

Jimmy válaszát alapul véve:

 

Rows.Count = a munkalap utolsó sorának száma (Excel2003 esetében ez 65536)

End(xlUp).Row = az utolsó sorhoz képest felfelé az első értéket képviselő sor

Range("A" & Rows.Count).End(xlUp).Row = az "A" oszlopban az utolsó értéket képviselő sor, és mindegy, hogy előtte vannak üres sorok is vagyis nem folytonos a kitöltés.

 

 

Előzmény: Sánta Kutya (SK) (12265)
madbazsi Creative Commons License 2010.07.08 0 0 12266

Sziasztok!

 

Valakinek van ötlete, hogy megvalósítható-e a következö excelben?

VAn egy értékem (szám), amelynek kombinációit keresem egy mátrixban.

Pl: érték=24,5

mátrix: 12  11  13,45  21  5,5  7

akkor kijelölné: a 12 + 5,5 + 7-t??

Köszi

Sánta Kutya (SK) Creative Commons License 2010.07.08 0 0 12265
Köszi, így már tisztább.
Előzmény: Törölt nick (12264)
Törölt nick Creative Commons License 2010.07.08 0 0 12264
Hát igen, nehéz egy mondatban összefoglalni, de pontosan arról van szó, amit leírtál. Talán azt lehetne mondani, hogy az aktuális összefüggő adattartomány adott irányba eső végére ugrik, ha pedig éppen a végén vagy, akkor a következő, adott irányba eső összefüggő adattartomány közelebbi végére.

A teljességhez hozzátartozik, hogy makróban az End művelet az aktív cellát nem viszi sehová, nincs is semmi köze az aktív cellához. Csak átdefiniálja a tartományt, amelyre a tényleges művelet majdan vonatkozni fog. Ez a sor

Range("C122")

önmagában semmi, csak egy tartománydefiníció. Ehhez adódnak hozzá módosítók, mint pl. az End, Offset, Resize, stb.

Range("C122").End(xlUp)

A Range("C122") -höz képest megkeresi a következő adattartomány-határt, és ez lesz a módosult tartománydefiníció. Módosítókat halmozni is lehet, pl

Range("C122").End(xlUp).Offset(1).Resize(2, 4)

És a végén jön a tulajdonképpeni művelet:

Range("C122").End(xlUp).Offset(1).Resize(2, 4).Copy
Előzmény: Sánta Kutya (SK) (12262)
drog Creative Commons License 2010.07.08 0 0 12263

tudom macerás, nem automata, de megoldás, miszerint, ha pl a böngészőben az éppen olvasott weblapot mentés másként címmel lementitek, akkor az excel simán meg tudja nyitni, mindent lehet vele csinálni.

hogy kevesebbet kelljen mentegetni, itt akár 500 hozzászólás is lehet egy filécske.

 

vagy van pl. winhtrack nevű oldalletöltögető progi, ami az egész, összes hozzászólást lementi, persze be kell állítani, hogy ne keressen túl távoli linkek után, tehát ne töltsön az igényeidnek mélyebb fastruktúrát.

ilyesmi oldal letöltögető természetesen elég sok féle van, ki melyikre esküszik.

 

a lényeg, hogy a bármimódon lementett html, vagy mht, vagy bármi webformátumot az excel simán kezeli.

Sánta Kutya (SK) Creative Commons License 2010.07.08 0 0 12262
Ez kicsit zavaros. Ha üres cellán állok, felugrik a fölötte levő legalsó adatra. Ha nem üres a cella, de felette üresek vannak, akkor felugrik a "luk" feletti legalsó adatra. Ha viszont folytonosak az adatok, akkor átugorja a felette levőket, és a folyamatos adattartomány legfelső nem üres cellájára ugrik. Ha nincs a cella fölött adat, akkor meg az oszlop tetejére.
Előzmény: Törölt nick (12261)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!