Ihr Makro friert nicht ein, Sie geben ihm einfach nicht genug Zeit, um fertig zu werden - was eine lange Zeit ist. Excel hat eine Zeilenbegrenzung von 1.048.576 Zeilen und Sie vergleichen jede einzelne Zelle in jeder Zeile mit jeder einzelnen Zelle in der anderen Zeile. Das sind insgesamt 1.099.511.627.776 Zellvergleiche. Angenommen, Sie können 100.000 Vergleiche pro Sekunde durchführen (was wahrscheinlich sogar eine Ausdehnung von ohne Formatierung ist), wird dies schließlich in etwas mehr als 127 Tagen abgeschlossen sein.
Ich würde vorschlagen, ein paar Dinge zu tun. Erstens, wenn Sie einen Bereich an eine Spalte wie folgt zuweisen ...
Set rng1 = Worksheets("Main").Range("B:B")
... Sie erhalten jede möglich Zelle - nicht nur die Gebrauchten. Hier finden Sie die letzte nicht leere Zelle in jeder Spalte, und stellen Sie Ihre Bereiche basierend auf, dass:
Dim LastRow As Long
Dim ColumnB As Range
With Worksheets("Main")
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
Set ColumnB = .Range("B1:B" + LastRow)
End With
Dies könnte erhalten Sie Ihre Laufzeiten auf die Größenordnung von Minuten oder Sekunden statt Tagen, wenn Sie eine große Datenmenge haben. Um sie weiter zu verbessern, stoppt aus dem Arbeitsblatt einzelnen Werten anfordert einen nach dem anderen, und ziehen Sie sie in Arrays:
Dim BValues As Variant
BValues = ColumnB.Value
Dann nur Schleife durch und vergleichen Werte im Speicher. Es aussehen könnte mehr so etwas wie diese (Ich zog die in einen Unter Formatierung out):
Private Sub CommandButton4_Click()
Dim LastRow As Long, MainSheet As Worksheet, CsvSheet As Worksheet
Set MainSheet = Worksheets("Main")
Set CsvSheet = Worksheets("CSV Transfer")
Dim MainValues As Variant
With MainSheet
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
MainValues = .Range("B1:B" & LastRow).Value
End With
Dim CsvValues As Variant
With CsvSheet
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
CsvValues = .Range("D1:D" & LastRow).Value
End With
Dim MainRow As Long, CsvRow As Long
For MainRow = LBound(MainValues) To UBound(MainValues)
For CsvRow = LBound(CsvValues) To UBound(CsvValues)
If MainValues(MainRow) = CsvValues(CsvRow) Then
FormatCell MainSheet, MainRow, 2
FormatCell CsvValues, CsvRow, 4
End If
Next
Next
End Sub
Private Sub FormatCell(sheet As Worksheet, formatRow As Long, formatCol As Long)
With sheet.Cells(formatRow, formatCol)
With .Font
.Bold = True
.ColorIndex = 2
End With
With .Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
End With
End Sub
ich auch ScreenUpdates bei dest ausschalten würde, wenn Ihre Leistung immer noch zu niedrig ist.
Sie müssen sich bemühen, dies selbst zu tun. Wir schreiben im Allgemeinen keinen Code für Sie, sondern helfen Ihnen, bestimmte Probleme anzugehen, denen Sie begegnen. Um zu beginnen, sollten Sie sich die [Range.Find-Methode] (https://msdn.microsoft.com/en-us/library/office/ff839746.aspx) ansehen. Wenn Sie nicht weiterkommen, bearbeiten Sie Ihre Frage so, dass sie den Code enthält, den Sie ausprobiert haben. – tigeravatar