-
IT café
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
Mutt
senior tag
válasz
hallgat #18980 üzenetére
Hello,
A megoldásom egy másik módszert használ, az eredeti lapból csak a hasznos (ahol a cella nem üres vagy 0) adatokat átemeli egy másik lapra (a neve output, de lent állíthatod ezt).
Egyszerre 3 sor hasznos adatát egy tömbben tárolja. A sor végén pedig kiíratja a másik lapra a tömböt. Utána 3 sorral feljebb megy és azon is végig megy és kiír.
Nekem 11-16 másodperc alatt lefut egy 1422x190-es táblán, remélem nálad is rendben fog menni.
Kommenteltem, hogy könnyen javítható legyen.Sub Torol3asaval()
Dim arrEredmeny() 'dinamikus tömb az értékek tárolásához
Const LastRow As Integer = 1422 'utolsósor
Const LastColumn As Integer = 190 'utolsóoszlop
Dim vRow As Long 'változó a vizsgált sorok nyomonkövetéséhez
Dim vColumn As Long 'változó a vizsgált oszlopok nyomonkövetéséhez
Dim vHits As Long 'változó a soronként a feltételeknek megfelelő eredményekhez
Dim i As Long
Dim vStartTime
Dim wsOutput As Worksheet
Const wsName As String = "output" 'ide tesszük az eredményt
Dim wsActiveSheet As String
'nézzük meg mennyi idő alatt fut le
vStartTime = Time
'elmentjük az eredeti lapot
wsActiveSheet = ActiveSheet.Name
'megnézzük hogy van-e a keresett névvel munkalap a füzetben
For i = 1 To Sheets.Count
If Sheets(i).Name = wsName Then vHits = 1
Next i
'ha nincs akkor létrehozzuk a lapot, különben megnyitjuk
If vHits <> 1 Then
Set wsOutput = Sheets.Add
wsOutput.Name = wsName
Else
Set wsOutput = Sheets(wsName)
wsOutput.Cells.Clear
End If
'visszamegyünk az eredti lapra
Sheets(wsActiveSheet).Activate
'kikapcsoljuk a képernyő frissítést hogy gyorsabb legyen
Application.ScreenUpdating = False
'utolsó sortól elindulunk vissza
For vRow = LastRow To 1 Step -3
'töröljük a tömb tartalmát
Erase arrEredmeny
'ide gyűjtük hogy hány oszlop van ahol nem üres vagy 0 van az utolsó sorban
vHits = 0
'végig megyünk a sor oszlopain
For vColumn = 1 To LastColumn
'ha az érték nem üres vagy nulla akkor egy tömbbe elmentjük a sor és feletti 2 értéket
If Cells(vRow, vColumn).Value <> 0 And Cells(vRow, vColumn).Value <> "" Then
'növeljük a sikeres találatok számlálóját
vHits = vHits + 1
'átméretezzük a tömböt hogy új találatokat is tudjon tárolni
ReDim Preserve arrEredmeny(1 To 3, 1 To vHits)
arrEredmeny(1, vHits) = Cells(vRow - 2, vColumn).Value
arrEredmeny(2, vHits) = Cells(vRow - 1, vColumn).Value
arrEredmeny(3, vHits) = Cells(vRow, vColumn).Value
End If
Next vColumn
'kiírjuk a találatokat, ha van mit
If vHits Then
'az első 3 sor elé újabb 3 sort szúrunk be
wsOutput.Rows("1:3").Insert Shift:=xlDown
For i = 1 To vHits
With wsOutput
'az első 3 sorba beírjuk a korábbi találatokat
.Cells(1, i) = arrEredmeny(1, i)
.Cells(2, i) = arrEredmeny(2, i)
.Cells(3, i) = arrEredmeny(3, i)
End With
Next i
End If
Next vRow
'visszakapcsoljuk a frissítést
Application.ScreenUpdating = True
Debug.Print "Futási idő: " & Format(Time - vStartTime, "s") & " sec"
End Subüdv
Új hozzászólás Aktív témák
- Milyen egeret válasszak?
- Audiokultúra - Hi-Fi-ről hifisen
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Ukrajnai háború
- Elkezdte felszámolni a GPU-s PhysX támogatását az NVIDIA
- Vezeték nélküli fülhallgatók
- Kávé kezdőknek - amatőr koffeinisták anonim klubja
- Valami baja van a tápomnak
- Autós topik
- Végre bemutatkozott a Google Pixel 4a
- További aktív témák...