Dim ce As Range, tmp As String
For Each ce In Sheets("Units").Range("B6:B30")
If ce.Value <> "" Then
tmp = tmp & ", " & ce.Value
End If
Next ce
If Len(tmp) > 1 Then Sheets("NC-register").Range("D8").Value = Mid(tmp, 3, Len(tmp))
for each ciklussal végiglépkedsz a megfelelő_munkalap.range("B6:B30").cells gyűjteményen és egy változóba írod az értékeket vesszővel elválasztva sztring összefűzéssel (& operátor) és a végén kiiratod az értéket.
Kérdés, hogy mit szeretnél az üres cellákkal kezdeni?
Ha pl. a végén levő üres cellákat el akarod hagyni:
s = Join(Application.WorksheetFunction.Transpose(Worksheets("Units").Range("b6:b30").Value), ",")
While Right(s, 2) = ",,"
s = Left(s, Len(s) - 2)
Wend
If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)
Worksheets("NC-register").Range("d8").Value = s
Max. 25 darab cella esetén valszeg sem a memóriahasználat, sem a sebesség nem kritikus.
Egyébként a 2. esetben sem kellene a ciklus, csak a Range("b31").End(xlUp).row-ig kell a tartományt kiválasztani, bár ezt ciklus esetén is meg lehet tenni.
Azért ha már felmerült, hogy mi a "drága", akkor az "ár" egyik eleme:
x = Timer
y1 = ""
For Each c In Range("a1:A11000")
y1 = y1 & "," & c.Value
Next
y1 = Mid(y1, 2)
x2 = Timer
y2 = Join(Application.Transpose(Range("a1:a11000").Value), ",")
x3 = Timer
Debug.Print x2 - x & " " & x3 - x2
A sebesség:
0,09375 0,0078125
0,09375 9,765625E-03
0,1015625 9,765625E-03
0,1015625 9,765625E-03
0,1015625 9,765625E-03
Azért elég jelentős előny a join + transpose számára
Dim ce As Range, tmp As String
For Each ce In Sheets("Units").Range("B6:B30")
If ce.Value <> "" Then
tmp = tmp & ", " & ce.Value
End If
Next ce
If Len(tmp) > 1 Then Sheets("NC-register").Range("D8").Value = Mid(tmp, 3, Len(tmp))
t1 = Timer
s1 = ""
For Each c In Range("a1:a60000")
s1 = s1 & c.Value & ","
Next
t2 = Timer
Debug.Print t2 - t1
s2 = ""
While Timer - t2 < t2 - t1
s2 = s2 & Join(Application.WorksheetFunction.Transpose(Range("a1:a60000").Value), ",")
Wend
t3 = Timer
Debug.Print t3 - t2
Debug.Print Len(s1), Len(s2)
Debug.Print "szorzo ~~~:", 1# * Len(s2) / Len(s1)
Mert én egy őskori, csiga lassú gépen 15-23 szorost, egy gyorsabb gépen 50-75 szorost.
Amíg nem áll fenn a out of memory veszélye, addig a transpose nagyságrendekkel gyorsabb a for each-hez képest. Persze out of memory-nél bukott a mutatvány( ), de valamit valamiért...
A belső gépeinket kb. 8-17x-es különbség a ciklus javára. Ha a ciklust úgy futtatjuk (ez van a kódunkban), hogy előbb tömbbe írjuk az adatokat és a végén van csak egy join, akkor 21 - 37x-es különbség a ciklus javára. Kb. 1 hete futottunk bele ebbe a problémába, adiig nálunk is a transpose-os változat futott, de nagyon lassú volt, ezért írtuk át előbb sima ciklusra majd a tömb - join-os változatra. Azóta a sebesség elfogadható. Már készül az sql változat, addig csak kitart.
Sziasztok.
Meg szeretném kérdezni, hogy van-e egyszerűbb makró a következőhöz. Szeretnék összefűzni 4 cellát 1 cellába...
például:
Cells(1, 8) = Cells(1, 9) & "-" & Cells(1, 10) & "-" & Cells(1, 11) & "-" & Cells(1, 12)
Vagy Range("h1") = stb...
De ez körülbelül nekem a h1-es cellától a h1200-as sorig kellene, hogy megtörténjen.
Tehát...
Cells(1, 8) = Cells(1, 9) & "-" & Cells(1, 10) & "-" & Cells(1, 11) & "-" & Cells(1, 12)
Cells(2, 8) = Cells(2, 9) & "-" & Cells(2, 10) & "-" & Cells(2, 11) & "-" & Cells(2, 12)... stb.
De nem igazán szeretnéha ilyen sok sorom lenne és leírni sem lenne egyszerű.
Van erre valami egyszerűbb és összetettebb képlet, hogy ne kelljen 1200 sort leírnom?
Tud valaki segíteni?
Próbálkoztam, ilyennel próba képpen kevesebb sorral, mert nem tudtam pontosan, hogy reagál:
For x = 1 to 12 (1200 helyett)
For y = 1 to 12 (1200 helyett)
For z = 1 to 12 (1200 helyett)
Cells(x, 8) = Cells(y, 9)) & "-" & Cells(z, 10)...stb
Next
Next
Next
de csak a cellákban pörgette meg az összefűzéseket és végül minden sorban a 12.sorban lévő összefűzni való adatokat jelenítette meg.
Valaki tud megoldást?
Köszönöm.
Ennek így nem sok értelme van, felesleges ennyi ciklust pörgetni, meg pont emiatt is rossz az eredmény:
For x = 1 to 12 (1200 helyett)
For y = 1 to 12 (1200 helyett)
For z = 1 to 12 (1200 helyett)
Cells(x, 8) = Cells(y, 9)) & "-" & Cells(z, 10)...stb
Next
Next
Next
Helyett ennyi:
For x = 1 to 12 (1200 helyett)
Cells(x, 8) = Cells(x, 9) & "-" & Cells(x, 10)...stb
Next
Sub p2()
x = Timer
y1 = ""
t = Range("a1:A11000")
For Each c In t
y1 = y1 & "," & c
Next
y1 = Mid(y1, 2)
x2 = Timer
y2 = Join(Application.Transpose(Range("a1:a11000").Value), ",")
x3 = Timer
Debug.Print x2 - x & " " & x3 - x2
End Sub
Sziasztok. Köszönöm Robi80-nak és Micu-nak is a választ, mind kettő működik.
Micunak a képleténél, annyit kellett hozzátennem, hogy a kijelölés
megszűnjön,
de ez semmit nem von le a megoldásból, mert ilyet nem közöltem az elején.
Ha van ilyen én megosztanám a max. pontot kettőtök között.
Köszi a segítséget...Üdv.