【问题标题】:Check All Values in Range1 Against All Values in Range 2 for Exact Match检查 Range1 中的所有值与 Range 2 中的所有值是否完全匹配
【发布时间】:2022-01-09 18:39:04
【问题描述】:

我正在尝试比较 Range1 中的所有值(活动行的 U:X 中的单元格),不包括空格,与 Range2 中的所有值(m,n),不包括空格,并且 - 如果两者之间存在完全匹配范围 - 更改活动行中 Y 列的颜色,否则不更改颜色。

例子:

Range1 包含 Dog, Cat, Bird, [空白单元格], Range2 包含 Dog, Cat, Bird, [多个空白单元格] = MATCH

Range1 包含 Dog、Cat、[空白单元格]、[空白单元格],Range2 包含 Dog、Cat、Bird,[多个空白单元格] = NO MATCH

这是我目前所拥有的,但是当完全匹配时 yColumn 不会改变颜色。我需要另一个循环吗?

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim cVal As String
    Dim tRow, lRow As Long
    Dim pID As String
    Dim yColumn As Integer
    cVal = Sheet1.Cells(Target.Row, Target.Column).Value
    tRow = Target.Row
    yColumn = 25
    lRow = Sheet4.Range("A1200").End(xlUp).Row
    pID = Sheet1.Range("A" & tRow).Value
    
' Check for ALL Cells Match
        If Not Intersect(Target, Range("U2:X1500")) Is Nothing Then
            Sheet1.Cells(tRow, yColumn).Interior.Color = xlNone
                For m = 2 To lRow
                    If Sheet4.Range("A" & m).Value = pID Then
                For n = 11 To 28
                        If Sheet4.Cells(m, n).Value = cVal And Sheet4.Cells(m, n).Value <> "" And Target(Range("U2:X1500")) = Sheet4.Cells(m, n).Value Then
                        Sheet1.Cells(tRow, yColumn).Interior.Color = 914271
                        Exit Sub
                        End If
                Next n
                    End If
                Next m
        End If
End Sub

【问题讨论】:

  • 您对cVal = Sheet1.Cells(Target.Row, Target.Column).Value 有什么期望?你对Target(Range("U2:X1500")) = Sheet4.Cells(m, n).Value 有什么期望?
  • 请更好地描述比较这些范围的方式。在Sheet4.Range("A" &amp; m) 中是否有更多可能出现pIDRange 中的 Dog, Cat, Bird 和第二个中只有 Dog, Cat 呢?没有空单元格怎么办?
  • 该事件是Sheet1 上的宏,但不在模块中。 Range1 是活动行上 U:X 列中的单元格区域,Range2 是 Sheet4 中从包含基于 cVal 的相应值的行返回的列 (K:AB) 的范围。那部分工作正常。 cVal = Sheet1.Cells(Target.Row, Target.Column).Value 定义的值决定了 Sheet1 和 Sheet4 中的哪两行正在比较范围。 Target(Range("U2:X1500")) = Sheet4.Cells(m, n).Value 应将目标行或活动行的 U:X 与 m 和 n 循环返回的值进行匹配。
  • pID 在 A 列的 Sheet1 和 Sheet4 中只出现一次。该宏在 Sheet1 的活动行的 A 列中获取 pID,并在 Sheet4 的 A 列中搜索 pID .定位后,它开始将 Sheet1 中活动行的 U:X 与 Sheet4 中已定位行的 (K:AB) 进行比较以进行匹配。预期结果是,如果 Sheet1 中具有值的所有单元格与 Sheet4 中具有值的所有单元格匹配,则忽略任何空白单元格,Sheet1 中活动行的 Y 列会更改颜色,否则不会发生任何事情。
  • 但是如果Sheet1 中具有值的所有单元格都与Sheet4 中具有值的所有单元格匹配,但Sheet4 中有更多值(非空白)

标签: excel vba


【解决方案1】:

请测试下一个方法:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lRow As Long, pID As String, yColumn As Long, m As Long
    Dim arrUX, arrKAB, El1, El2, boolFound As Boolean
    yColumn = 25
    lRow = Sheet4.Range("A" & rows.Count).End(xlUp).row
    pID = Me.Range("A" & Target.row).Value
    
        If Not Intersect(Target, Range("U2:X1500")) Is Nothing Then
            Target.Interior.color = xlNone
            For m = 2 To Target.row
                If Sheet4.Range("A" & m).Value = pID Then
                    arrUX = Me.Range(Me.cells(Target.row, "U"), Me.cells(Target.row, "X")).Value
                    arrKAB = Sheet4.Range(arrKAB.cells(m, "K"), Sheet4.cells(m, "AB")).Value
                    For Each El1 In arrUX
                        boolFound = False
                        For Each El2 In arrKAB
                            If El1 <> "" Then
                                If El1 = El2 Then boolFound = True: Exit For
                            End If
                        Next
                        If Not boolFound Then Exit Sub 'if one element of the first array is not found, existing
                    Next El1
                    If boolFound Then
                        Application.EnableEvents = False
                         Target.Interior.color = 914271
                        Application.EnableEvents = True
                        Exit Sub 'since only one occurrence should exist...
                    End If
                End If
            Next m
        End If
End Sub

【讨论】:

  • 谢谢!还在测试这个。在Next m 上出现“Next without For”错误。
  • @katech725 Ups...我在Exit Sub 之后错过了End If。请尝试更新的代码。无论如何,它只检查第一个范围和第二个范围。如果它有效,从这个角度来看,根据您的需要,我也可以对其进行调整以进行反向检查。
  • 这很棒。我相信我可以使用您演示的内容,感谢您更新的脚本。
  • @katech725 您应该只重复以arrKAB 开头的迭代,并注意boolFound 的使用。
【解决方案2】:
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim v, lr As Long, tRow As Long
    Dim s1 As String, s2 As String
    Dim pID As String, c As Range
    
    If Intersect(Target, Range("U:X")) Is Nothing Then
         Exit Sub
    End If
    
    tRow = Target.Row
    For Each c In Sheet1.Range("U1:X1").Offset(tRow - 1)
        If Len(c) > 0 Then
            s1 = s1 & Trim(c) & "|"
        End If
    Next

    ' find on sheet 4
    pID = Sheet1.Range("A" & tRow).Value
    With Sheet4
        lr = .Cells(.Rows.Count, "A").End(xlUp).Row
        v = Application.Match(pID, .Range("A1:A" & lr), 0)
        If IsError(v) Then Exit Sub
        
        For Each c In .Range("K1:AB1").Offset(v - 1)
            If Len(c) > 0 Then
                 s2 = s2 & Trim(c) & "|"
            End If
        Next
        
        If s1 = s2 Then
            Sheet1.Cells(tRow, 25).Interior.Color = 914271
        Else
            Sheet1.Cells(tRow, 25).Interior.Color = xlNone
        End If
       
    End With
    
End Sub

【讨论】:

  • 谢谢!我无法让它工作。我用简单的MsgBox 替换了最后的Interior.Color 行,以查看工作表中的某些条件格式是否会阻止颜色更改而没有运气。将继续测试。
猜你喜欢
  • 2023-03-19
  • 2019-11-26
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2015-04-28
相关资源
最近更新 更多