Hallo,
habe eine mögliche Lösung gefunden:
Sub AdjustmentData()
Dim wsh As Worksheet, wshSearch As Worksheet
Dim rngSearch As Range
Dim datDate As Date, datDateResult As Date
Dim sGroup As String, sProd As String
Dim rng As Range, rngResult As Range
Set wsh = Tabelle1
Set wshSearch = Tabelle2
Set rngSearch = wshSearch.UsedRange
Application.ScreenUpdating = False
For Each rng In wsh.UsedRange.Rows
If rng.Row > 1 Then
datDate = rng.Cells(1, 1).Value
sProd = rng.Cells(1, 3).Value
If wshSearch.FilterMode Then
rngSearch.AutoFilter
End If
rngSearch.AutoFilter Field:=1, Criteria1:=sProd
rngSearch.AutoFilter Field:=34, Criteria1:="=AA", Operator:=xlOr, Criteria2:="=AB"
For Each rngResult In rngSearch.SpecialCells(xlCellTypeVisible).Rows
If rngResult.Row > 1 Then
datDateResult = rngResult.Cells(1, 44).Value + rngResult.Cells(1, 45).Value
If datDate <= DateAdd("s", 3600, datDateResult) And datDate >= DateAdd("s", -3600, datDateResult) Then
rng.Cells(1, 1).Value = datDateResult
End If
End If
Next
If wshSearch.FilterMode Then
rngSearch.AutoFilter
End If
'VBA.DoEvents
End If
Next
Application.ScreenUpdating = True
End Sub
Diese Lösung läuft nicht performant. Bei etwa 10.000 Datensätzen braucht diese Lösung bereits mehrere Minuten, um diese einmal durchlaufen zu können.
Wenn es zu lange dauert, sollte etwa alle 30 Sekunden einmal der Befehl VBA.DoEvents aufgerufen werden. Andernfalls wird das Excel-Fenster von Windows als in reagierende Anwendung markiert.
Die Ursache liegt im Autofilter. Dieser muss von Excel für jeden gesuchten Eintragneu initialisiert und ausgeführt werden.
Besser ist es, wenn Access-Methoden in Excel angewandt werden können. Hierzu muss allerdings auf dem System Microsoft Access zur Verfügung stehen.
Mit Access-Methoden kann eine beliebige Excel-Tabelle als Quelle herangezoegn werden. Mit Hilf einer Aktualisierungs-Abfrage können schnell x-beliebige Datensätze abgeglichen werden.
Bei Bedarf kann ich auch ein VBA-Code erstellen, das mit Access-Methoden arbeitet.
LG, Ben
|