Vba 将范围与具有多个值的单个单元格进行比较

Vba 将范围与具有多个值的单个单元格进行比较,vba,excel,Vba,Excel,我试图根据单元格范围隐藏一个工作簿/工作表中的行。我需要查看范围中的每个单元格,并确定初始工作簿/工作表中单个单元格的字符串中是否存在匹配项。 行的范围包含国家名称,如: 美利坚合众国 法国 安提瓜和巴布达 阿根廷 但是要比较的单元格如下所示: 美利坚合众国、法国、安提瓜和巴布达 我试图研究并整理代码,但我真的不知道我在做什么。这是我的。我确信问题在于If语句 vwb.Activate ActiveWorkbook.Sheets(tabName).Select For Each c In vwb

我试图根据单元格范围隐藏一个工作簿/工作表中的行。我需要查看范围中的每个单元格,并确定初始工作簿/工作表中单个单元格的字符串中是否存在匹配项。 行的范围包含国家名称,如:

美利坚合众国

法国

安提瓜和巴布达

阿根廷

但是要比较的单元格如下所示:

美利坚合众国、法国、安提瓜和巴布达 我试图研究并整理代码,但我真的不知道我在做什么。这是我的。我确信问题在于If语句

vwb.Activate
ActiveWorkbook.Sheets(tabName).Select
For Each c In vwb.Worksheets(tabName).Range("A121:A345").Text

If Application.WorksheetFunction.CountIf(InStr(1, twb.Worksheets("Basic_Info”).Range("COS"), c.Value)) Then
Else
vwb.Worksheets(tabName).Rows(c.Row).EntireRow.Hidden = True

End If
Next 

这比你想象的要简单得多,你走的路可能很混乱:

请参阅下面的内容,如果您不理解此代码与您所做的有何不同,请提出任何问题:

Dim searchRange as Range, findRange as Range, c as Range
Set searchRange = vwb.Worksheets(tabName).Range("A121:A345")
Set findRange = twb.Worksheets("Basic_Info”).Range("COS")

For Each c In searchRange

    If findRange.Find(c.Value, lookin:=xlPart) is Nothing Then

        c.EntireRow.Hidden = True        

    End If

Next 

下面是一个示例框架,如果您试图隐藏COS范围中存在匹配项的行。为了便于测试,我将twb改为vwb。如果要隐藏不匹配的位置,请使用InStr1,c.Value,countriesArri,1=0


因此,循环RangeA121:A345,如果找到rangeCOS中的任何国家,则隐藏该行?听起来你可能需要两个循环。另外,你正在比较两本工作手册,这是你想要的吗?你还有一个“你想要的地方是的,我正在比较两本工作手册。”。这就是让我更困惑的地方。是的,看看RangeA121:A345,如果找到了rangeCOS中的任何国家,那么将行隐藏在原始范围内。COS范围只是一个由逗号分隔的串联值的单个单元格。您可以使用Split函数,然后在值上创建数组。请参阅我的编辑或使用Scott的更简单的方法。
Option Explicit

Sub test()

Dim vwb As Workbook
Set vwb = ThisWorkbook

Dim c As Range
Dim tabName As String
tabName = "Sheet1"

Dim i As Long

Dim countriesArr() As String
'countriesArr = vwb.Worksheets("Basic_Info").Range("COS").Value  'twb.
countriesArr = Split(vwb.Worksheets("Basic_Info").Range("COS").Value, ",")
Dim unionRng As Range

For Each c In vwb.Worksheets(tabName).Range("A121:A345")

    For i = LBound(countriesArr) To UBound(countriesArr)

        If InStr(1, c.Value, countriesArr(i)) > 0 Then

            If Not unionRng Is Nothing Then

                 Set unionRng = Union(unionRng, c)

            Else

                Set unionRng = c

            End If

            Exit For

        End If

    Next i

Next c

If Not unionRng Is Nothing Then
    unionRng.EntireRow.Hidden = True
End If

End Sub