VBA比较2个阵列循环>>突出显示并将差异复制到第3列

时间:2018-05-29 10:55:48

标签: excel vba excel-vba

我有一个类似帖子VBA macro to compare two columns and color highlight cell differences上的问题。

我用它作为参考点,但现在我被困了几个小时来解决我的情况。 下面的代码,我将首先解释我的案例,以便更好地理解并更容易理解。

案例: 在进行任何操作之前,我都有以下工作表。我正在比较列“A:B”和“D:E”等(从第3行到最后使用的行)。请参阅下面的屏幕截图,以获得更好的可视化效果(这只是数据的一部分)。

Worksheet Before

现在我想看到执行了2个操作

  1. 突出显示A列和D列中不属于B和E列的单元格 - 我将这些单元格称为错误
  2. 将错误的值(突出显示的单元格(来自A和D))复制到C和F列中(这是“查看列” - 相对于初始列,它始终是右侧的2列)< / LI>

    请参阅下面的屏幕截图以获得更好的可视化效果

    Worksheet After1

    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
    

    问题:

    1. 我正在尝试用深红色背景突出显示错误单元格。但是这段代码正好相反(突出显示匹配的值)。
    2. 如何在“检查栏”中显示错误值(突出显示的错误值)。
    3. 我非常感谢你能给我的任何建议和支持

      非常感谢你,祝你有个美好的一天

3 个答案:

答案 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