【问题标题】:Comparing unique strings in two columns Excel VBA比较两列Excel VBA中的唯一字符串
【发布时间】:2018-02-18 06:15:17
【问题描述】:

我正在尝试在 D 列和 H 列中查找一个字符串,如果它们符合某些条件,则在 W 列中插入字符串“匹配”。

例如,如果字符串“Auditorium”出现在 D 列中,而字符串“INTERNAL”出现在同一行的 H 列中,则在 W 列中插入字符串“Match”。

我的代码在 W 列中插入字符串“Match”,以针对包含字符串“INTERNAL”的所有行,而不考虑 D 列中的字符串!

任何建议将不胜感激!

行 | D 栏 | H 栏 | W栏

1 |礼堂 |马丁(内部)|匹配

2 |礼堂 |约翰 |

3 |剧院 |爱德华(内部)|匹配

4 |剧院 |乔治 |匹配

Dim celA
Dim celB
    For Each celA In Range("D1:D50")
        For Each celB In Range("H1:H50")
                If InStr(1, celA.Value, "Auditorium") <> 0 And InStr(1, celB.Value, "INTERNAL") <> 0 Then celB.Offset(0, 10).Value = "Match"
        Next celB
    Next celA

【问题讨论】:

  • 既然可以使用本机 Excel 做同样的事情,为什么还要使用 VBA?
  • @AJD 所说的是正确的。在单元格 W1 中,您可以输入 =IF(AND(D1="auditorium",ISNUMBER(SEARCH("internal",H1,1))),"Match","") 并根据需要复制下来。

标签: vba excel multiple-columns string-comparison


【解决方案1】:

你不需要你的内循环。找到单词 auditorium 后,只需在同一行中查找 internal 并在 W 列中设置值(如果找到)。

Dim celD
For Each celD In Range("D1:D50")
    If cbool(InStr(1, lcase(celD.Value), "auditorium")) then
        If cbool(InStr(1, lcase(celD.offset(0, 4).Value), "internal")) then
            celD.offset(0, 19) = "Match"
        end if
    end if
Next celD 

【讨论】:

  • 您好 Jeeped,谢谢您的回复。当我运行您提供的程序时,我收到消息“编译错误:参数数量错误或属性分配无效”,并且第 3 行突出显示了“LCase”一词。
  • 过失;我把右括号放在错误的地方。上面固定。
  • 嗨 Jeeped,效果很好。非常感谢您的帮助。
【解决方案2】:

已发布的其他变体

Dim celD As Range, SearchKey$
SearchKey = "*auditorium*internal*"
For Each celD In [D1:D50]
    If LCase(celD.Text & celD.Offset(, 4).Text) Like LCase(SearchKey) Then '.text instead of value|value2 is used to convert #errors into string (e.g. #N/A)
        celD.Offset(, 19) = "Match"
    End If
Next celD

【讨论】:

  • 您好 Vasily,您的回答也很完美。也感谢您今天的帮助。
【解决方案3】:

您也可以使用AutoFilter() 执行此操作,从而避免循环(cmets 中的解释):

With Range("H1", Cells(Rows.Count, "D").End(xlUp)) 'reference columns "H:D" range from row 1 down to column D last not empty row
    .AutoFilter Field:=1, Criteria1:="Auditorium" 'filter referenced range on its first column (i.e. column "D") with value "Auditorium
    .AutoFilter Field:=5, Criteria1:="*INTERNAL*" 'filter referenced range on its fifth column (i.e. column "H") with value containing "INTERNAL"
    If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 Then .Resize(, 1).Offset(, 19).SpecialCells(xlCellTypeVisible).Value = "MATCH" 'if any "data" (i.e. from 2nd row downwards) rows matching criteria then write "MATCH" in corresponding rows of 19th column of referenced range (i.e. column "W")
    If .Cells(1, 1).Value = "Auditorium" And InStr(.Cells(1, 5), "INTERNAL") > 0 Then .Cells(1, 20).Value = "MATCH" 'check first ("Headers") rows too
End With
ActiveSheet.AutoFilterMode = False 'remove filters

如果你的数据也有一个“标题”行,那么你可以省略End With之前的最后一行代码

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多