So, beim Essen dachte ich mir, dass ich so eine konfuse Antwort nicht stehen lassen kann...
Hier mal dein Code ein wenig weiter entwickelt, wie ich das mit VBA machen würde:
Sub counter_anders()
Dim LastRow As Long
Dim Zle As Long
Dim Count_OK As Long
Dim bool As Boolean
Dim dicRow As Object 'Dictionary, Keys: Bauteilnummern aus C, Values: Index von Array data
Dim countBauteil As Long
Set dicRow = CreateObject("Scripting.Dictionary")
Dim data(1 To 100000, 1 To 3) As Variant 'Array für Ergebnisse (Nummer, letzter Timestamp, Entscheid)
countBauteil = 0 ' In VBA ist ein Long bereits mit 0 initialisiert, der Code liest sich aber besser.
LastRow = Range("C65536").End(xlUp).Row
For Zle = 1 To LastRow
If Range("B" & Zle).Value Like "Anlage*" Then 'braucht es das? evtl. einfach in 2.Zeile starten
If Not dicRow.Exists(Cells(Zle, 3).Text) Then
countBauteil = countBauteil + 1
dicRow.Add Cells(Zle, 3).Text, countBauteil
End If
If data(dicRow(Cells(Zle, 3).Text), 2) < CDate(Cells(Zle, 1)) Then 'ist Timestamp Maximum?
data(dicRow(Cells(Zle, 3).Text), 1) = Cells(Zle, 3) 'Nummer
data(dicRow(Cells(Zle, 3).Text), 2) = CDate(Cells(Zle, 1)) 'Timestamp
data(dicRow(Cells(Zle, 3).Text), 3) = Cells(Zle, 4) 'OK, NOK oder RW
End If
End If
Next
Range("K1").Resize(countBauteil, 3).Value = data
End Sub
Das ist jetzt noch nicht ganz "meine" Version, aber hier kannst du schön den Einsatz eines Dictionarys sehen und ein Array.
Integer vs. Long: meiner Meinung nach kommt es bei kleinen Skripten nicht auf Speicherplatzbedarf an (idR). Ein Long kann alles aufnehmen, was ein Integer aufnehmen kann, anders herum nicht. Ich verwende inzwischen (für Ganzzahlen) ausschließlich den Typ Long. Angeblich sind die Prozessoren auch für Long optimiert, sodass man sogar (leichte) Geschwindigkeitsvorteile hat, die habe ich selbst noch nicht versucht zu messen, da gibt es (auch in diesem Code) aber ganz andere Zeitfresser bei denen es sich mehr lohnt, Gedanken darauf zu verwenden. Ich benutze Long primär desshalb, weil ich dann nicht nachdenken muss und damit alle meine Code-Schnipsel zueinander passen:
Zum Beispiel kann bei aktuellen Excelversionen die Zeilennummer zu groß werden um sie in einer Integer-Variablen zu speichern. Allein das reicht mir schon, um den Typ Long zu benutzen => weniger fehleranfällig.
Du könntest das Dictionary mal mit early-binding deklarieren (https://excelmacromastery.com/vba-dictionary). Dann hilft dir auch Intellisense (https://www.online-excel.de/excel/singsel_vba.php?f=4). Es lohnt sich, das Tutorial zu lessen!
Grüße, Ulrich
|