你的宏没有冻结,你只是没有给它足够的时间来完成 - 这是一个lonnnngggg时间。 Excel的行数限制为1,048,576行,并且您将每行中的每个单元格与另一行中的每个单元格进行比较。这是共计1,099,511,627,776个单元格比较。假设您可以每秒进行100,000次比较(这可能是一次延伸,即使是而没有的格式),但这最终会在127天内完成。
我建议做几件事情。首先,当你指定范围内这样的列...
Set rng1 = Worksheets("Main").Range("B:B")
...你让每一个可能细胞 - 不仅仅是使用的。查找每一列中的最后一个非空单元格,并设置可根据您的范围:
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
这可能让你的运行时间在几分钟或几秒钟而不是几天的顺序,除非你有一个庞大的数据集。为了进一步提高他们,停在要求的时间从工作表中一个单独的值,并将其拉入数组:
Dim BValues As Variant
BValues = ColumnB.Value
然后,只需遍历并在内存中比较值。它看起来更多的东西像这样(我把格式化了成子):
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
我也想关闭的最起码ScreenUpdates如果你的表现仍然太低。
你需要努力做到这一点你自己。我们通常不会为您编写代码,而是帮助您解决遇到的特定问题。要开始,您需要查看[Range.Find方法](https://msdn.microsoft.com/en-us/library/office/ff839746.aspx)。如果您遇到困难,请编辑您的问题以包含您尝试过的代码。 – tigeravatar