我有一个类似帖子VBA macro to compare two columns and color highlight cell differences上的问题。
我用它作为参考点,但现在我被困了几个小时来解决我的情况。 下面的代码,我将首先解释我的案例,以便更好地理解并更容易理解。
案例: 在进行任何操作之前,我都有以下工作表。我正在比较列“A:B”和“D:E”等(从第3行到最后使用的行)。请参阅下面的屏幕截图,以获得更好的可视化效果(这只是数据的一部分)。
现在我想看到执行了2个操作:
请参阅下面的屏幕截图以获得更好的可视化效果
CODE:
Sub compare_cols()
Dim Report As Worksheet
Dim i As Integer, j As Integer
Dim lastRow As Integer
Set Report = Excel.Worksheets("Check_Sheet")
lastRow = 80
arrInputCheckSheet= Array("A", "D", "G", "J", "M", "P", "S", "V", "Y") 'I will use these columns to compare against the next array
arrMDCheckSheet = Array("B", "E", "H", "K", "N", "Q", "T", "W", "Z") 'I will use these columns as reference
Application.ScreenUpdating = False
For a = LBound(arrInputCheckSheet) To UBound(arrInputCheckSheet)
For i = 3 To lastRow
For j = 3 To lastRow
If Report.Cells(i, arrInputCheckSheet(a)).Value <> "" Then 'This will omit blank cells at the end (in the event that the column lengths are not equal.
If InStr(1, Report.Cells(j, arrMDCheckSheet(a)).Value, Report.Cells(i, arrInputCheckSheet(a)).Value, vbTextCompare) > 0 Then
Report.Cells(i, arrInputCheckSheet(a)).Interior.Color = RGB(156, 0, 6) 'Dark red background
Report.Cells(i, arrInputCheckSheet(a)).Font.Color = RGB(255, 199, 206) 'Light red font color
Exit For
Else
End If
End If
Next j
Next i
Next a
Application.ScreenUpdating = True
End Sub
问题:
我非常感谢你能给我的任何建议和支持
非常感谢你,祝你有个美好的一天
答案 0 :(得分:2)
我建议使用WorksheetFunction.Match Method而不是第二个j循环。并使用Range.Offset Property寻址偏移单元格以复制值。
以下是屏幕截图中显示的数据示例。
asset()
答案 1 :(得分:1)
如评论中所述,您需要检查InStr函数是否返回零(请参阅MSDN page on InStr),不大于零。请注意,使用InStr也会匹配部分匹配(如果A列中有“a”,那么它将匹配B列中包含“a”的任何字符串)。如果您想要更精确的匹配,请使用=或Like关键字(与UCASE函数一起使用以匹配不同情况)。但是,单独不起作用的原因是,如果A列单元格不等于所有列B单元格,则会执行此操作。它检查第一个,如果它不等于它突出显示,并检查到行A中的第二个条目重复。如果匹配,你需要一个If-Else做某事,你需要检查每个条目(语句的出口需要在匹配的情况下)。要将突出显示的单元格复制到C,F等列...当您在内部If语句中时,可以从当前A列偏移两列。
If UCase(Report.Cells(j, arrMDCheckSheet(a)).Value) Like UCase(Report.Cells(i, arrInputCheckSheet(a)).Value) Then
Report.Cells(i, arrInputCheckSheet(a)).ClearFormatting
Exit For
Else
Report.Cells(i, arrInputCheckSheet(a)).Interior.Color = RGB(156, 0, 6) 'Dark red background
Report.Cells(i, arrInputCheckSheet(a)).Font.Color = RGB(255, 199, 206) 'Light red font color
Report.Cells(i, arrInputCheckSheet(a)).Offset(0,2).Value = Report.Cells(i, arrInputCheckSheet(a)).Value ' This copies to the 3rd column
End If
或使用InStr:
If InStr(1,Report.Cells(j, arrMDCheckSheet(a)).Value,Report.Cells(i, arrInputCheckSheet(a)).Value) = 0 Then
使用while语句而不是for循环也会更快,直到遇到空白单元格,这样就不会继续检查空白单元格。
i = 3
Do While Report.Cells(i, arrInputCheckSheet(a)).Value <> ""
j = 3
Do While Report.Cells(j, arrMDCheckSheet(a)).Value <> ""
' this would be the if statements, use exit do instead of exit for
j = j + 1
Loop
i = i + 1
Loop
答案 2 :(得分:0)
另一种可能性;制作arrMDCheckSheet-array的字符串 (我更改了Instr函数并为第三列添加了一行,以保持原始代码的原样)
For a = LBound(arrInputCheckSheet) To UBound(arrInputCheckSheet)
For i = 3 To lastRow
For j = 3 To lastRow
If Report.Cells(i, arrInputCheckSheet(a)).Value <> "" Then 'This will omit blank cells at the end (in the event that the column lengths are not equal.
If InStr(1, Join(Application.Transpose(Report.Range(Cells(3, arrMDCheckSheet(a)), Cells(lastRow, arrMDCheckSheet(a)))), "|"), Report.Cells(i, arrInputCheckSheet(a)).Value, vbTextCompare) = 0 Then
Report.Cells(i, arrInputCheckSheet(a)).Interior.Color = RGB(156, 0, 6) 'Dark red background
Report.Cells(i, arrInputCheckSheet(a)).Font.Color = RGB(255, 199, 206) 'Light red font color
Report.Cells(i, arrInputCheckSheet(a)).Offset(, 2) = Report.Cells(i, arrInputCheckSheet(a)) 'added
Exit For
Else
End If
End If
Next j
Next i
Next a