Arrays 循环使用多个IF AND和一个数组作为值的行

Arrays 循环使用多个IF AND和一个数组作为值的行,arrays,excel,vba,countif,Arrays,Excel,Vba,Countif,我有一个工作表,有3列A-C文本 我想写一个VBA脚本来循环每一行,如果(在每一行中)列a=(文本1或文本2)和列b=(文本5或文本6或文本7或文本8)和列c=(文本20或文本22)在D列中输入yes 我正在考虑将要搜索的文本值放入多个数组中: Dim Search1 As Variant Dim Search2 as Variant Dim Search3 as Variant Search1 = Array("Cat", "Dog") Search2 = Array("Red", "Bro

我有一个工作表,有3列A-C文本

我想写一个VBA脚本来循环每一行,如果(在每一行中)列a=(文本1或文本2)和列b=(文本5或文本6或文本7或文本8)和列c=(文本20或文本22)在D列中输入yes

我正在考虑将要搜索的文本值放入多个数组中:

Dim Search1 As Variant
Dim Search2 as Variant
Dim Search3 as Variant

Search1 = Array("Cat", "Dog")
Search2 = Array("Red", "Brown", "Blue")
Search2 = Array("House", "Condo")
然后在各行之间进行循环:

Dim i尽可能长
对于i=1到rg.Rows.Count

我陷入困境的是搜索逻辑:

Application.CountIFs(Cells(i,1),Search1, Cells(i,2), Search2, Cells(i,3), Search4)) > 0 then
sh.Cells(i, "F").Value = "yes"
i = i + 1
End if
Next i
比如:

A    B       C      D       
Dog    Brown House  Y       A=(Dog or Cat) AND  B=(Brown or Blue or Red)  AND C =( House or Condo)
Bird   Blue  House          
Cat    Brown Condo  Y       
Cat    Pink  Condo          
Cat    Blue  House  Y       
Horse  Red   Condo          
Cat    Green House          
Dog    Pink  Condo          
Horse  Blue  House      
我希望这是有意义的…我真的在寻找如何对每一行进行计数(范围,数组,范围,数组,范围,数组)

谢谢大家!

三连胜
选项显式
亚三重匹配()
'定义常量。
常量SheetName为String=“Sheet1”
Const Cols As String=“A:C”
常量第一行长度=2
常量TargetColumn的长度=4
Const StringValue为String=“Yes”
变光搜索(2)作为变型
搜索(0)=数组(“猫”、“狗”)
搜索(1)=数组(“红色”、“棕色”、“蓝色”)
搜索(2)=阵列(“房屋”、“公寓”)
'将源范围的值写入源数组。
将ws设置为工作表
设置ws=ThisWorkbook.Worksheets(SheetName)
第一列的长度相同
FirstColumn=ws.Columns(Cols.Column)
变暗rng As范围
Set rng=ws.Columns(FirstColumn.Find(“*”,xlValues,,xlPrevious)
如果rng为空,则退出Sub
如果rng.Row<第一行,则退出Sub
变暗源
Source=Intersect(ws.Range(ws.Cells(FirstRow,FirstColumn),rng)_
.EntireRow.Rows、ws.Columns(列))
'检查源阵列并写入目标阵列。
变暗目标
重拨目标(1对UBound(源),1对1)
我和我一样长,我和我一样长
对于i=1到UBound(源)
GoSub校验值
接下来我
'将目标数组的值写入目标范围。
ws.Cells(第一行,TargetColumn).Resize(UBound(Target)).Value=Target
'通知用户。
MsgBox“三重匹配成功完成”,vbInformation,“成功”
出口接头
校验值:
对于j=1至UBound(震源,2)
如果IsError(Application.Match(Source(i,j),Search(j-1),0))那么
返回
如果结束
下一个j
目标(i,1)=字符串值
返回
端接头

COUNTIFS不会以这种方式工作。您需要循环每个数组并将其与正确的值进行比较。@BigBen countif使用数组执行
操作时,如果数组之间没有一对一的关系,则只允许两个数组,一个垂直,一个水平。哦,是的@史考特克拉纳。。。nvm,删除了评论。哇,谢谢!我要开始学习其中的每一个元素。谢谢你的回答!
Option Explicit

Sub TripleMatch()

    ' Define constants.
    Const SheetName As String = "Sheet1"
    Const Cols As String = "A:C"
    Const FirstRow As Long = 2
    Const TargetColumn As Long = 4
    Const StringValue As String = "Yes"
    Dim Search(2) As Variant
    Search(0) = Array("Cat", "Dog")
    Search(1) = Array("Red", "Brown", "Blue")
    Search(2) = Array("House", "Condo")

    ' Write values of Source Range to Source Array.
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(SheetName)
    Dim FirstColumn As Long
    FirstColumn = ws.Columns(Cols).Column
    Dim rng As Range
    Set rng = ws.Columns(FirstColumn).Find("*", , xlValues, , , xlPrevious)
    If rng Is Nothing Then Exit Sub
    If rng.Row < FirstRow Then Exit Sub
    Dim Source As Variant
    Source = Intersect(ws.Range(ws.Cells(FirstRow, FirstColumn), rng) _
      .EntireRow.Rows, ws.Columns(Cols))

    ' Check Source Array and write to Target Array.
    Dim Target As Variant
    ReDim Target(1 To UBound(Source), 1 To 1)
    Dim i As Long, j As Long
    For i = 1 To UBound(Source)
        GoSub CheckValue
    Next i

    ' Write values of Target Array to Target Range.
    ws.Cells(FirstRow, TargetColumn).Resize(UBound(Target)).Value = Target

    ' Inform user.
    MsgBox "TripleMatch finished successfully.", vbInformation, "Success"

    Exit Sub

CheckValue:
    For j = 1 To UBound(Source, 2)
        If IsError(Application.Match(Source(i, j), Search(j - 1), 0)) Then
            Return
        End If
    Next j
    Target(i, 1) = StringValue
    Return

End Sub