尝试将一个值与多个多维数组进行比较
Trying to compare a value to multiple, multiple dimension arrays
我有一个包含多列数据的电子表格。在 VBA 中,我试图根据其他三列中任意一列中的数据在每一行中设置一个值。它将始终是这些数据之间的 OR 比较,并且需要 return 五个值之一。
所以我创建了五个数组(它们是多维的,因为它们是按范围读取的,但是,如果需要的话,它们可以是一维的,我想),我打算将这三列与那些数组进行比较一堆 IF-THEN 语句到 return 必要的值。
创建数组很简单,但我不知道如何正确创建 IF-THEN 过程。该过程的示例如下:
IF A1 is in ArrayA THEN
D1="Dog"
ELSEIF A1 is in ArrayB THEN
D1="Cat"
ELSEIF B1 is in ArrayC THEN
D1="Bird"
ELSEIF B1 is in ArrayD THEN
D1="Monkey"
ELSEIF C1 is in ArrayE THEN
D1="Blue"
ELSE
D1="Other"
我不确定这是否是完成我正在尝试做的事情的最有效方法,因此我绝对乐于接受有关不同方法的建议。谢谢。
好的,这就是我如何让它工作的。其中大部分来自另一个人,但他们删除了他们的评论,所以我无法感谢他们。
arrCols = Array(arrA, arrB, arrC, arrD, arrE)
arrVals = Array("Dog", "Cat", "Bird", "Monkey", "Blue")
For i = 2 To rCnt
pID = Cells(i, 2).Value
pName = Cells(i, 3).Value
pGroup = Cells(i, 4).Value
ans = ""
For j = LBound(arrCols) To UBound(arrCols)
If Not IsError(Application.Match(pGroup, arrCols(j), 0)) Then
ans = arrVals(j)
Exit For
ElseIf Not IsError(Application.Match(pName, arrCols(j), 0)) Then
ans = arrVals(j)
Exit For
ElseIf Not IsError(Application.Match(pID, arrCols(j), 0)) Then
ans = arrVals(j)
Exit For
End If
Next j
Cells(i, 5) = IIf(ans = "", "Other", ans)
Next i
我创建了一个数组数组来进行搜索。 i 循环遍历所有行。 j 循环循环遍历主数组中的数组。检查三个不同的列需要三个 IF 语句。返回值默认为 "Other" 除非在其中一个数组中找到它。
我唯一能够添加到此代码的是检查行中三个不同列所需的内容。
这是一个不循环的例子
If Len("," & Join(ArrayA, ",") & ",") <> Len("," & Replace(Join(ArrayA, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Dog"
ElseIf Len("," & Join(ArrayB, ",") & ",") <> Len("," & Replace(Join(ArrayB, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Cat"
ElseIf Len("," & Join(ArrayC, ",") & ",") <> Len("," & Replace(Join(ArrayC, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Bird"
ElseIf Len("," & Join(ArrayD, ",") & ",") <> Len("," & Replace(Join(ArrayD, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Monkey"
ElseIf Len("," & Join(ArrayE, ",") & ",") <> Len("," & Replace(Join(ArrayE, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Blue"
Else
Range("D1").Formula = "Other"
End If
将数组连接到一个字符串,然后检查 len 与字符串的 len,关键字 (Range("A1")) 替换为空。在两边放一个逗号以确保它是完整的单词(不要像 Catfish to return as a Cat)
同样使用 InStr 代替:
If InStr(1, "," & Join(ArrayA, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Dog"
ElseIf InStr(1, "," & Join(ArrayB, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Cat"
ElseIf InStr(1, "," & Join(ArrayC, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Bird"
ElseIf InStr(1, "," & Join(ArrayD, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Monkey"
ElseIf InStr(1, "," & Join(ArrayE, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Blue"
Else
Range("D1").Formula = "Other"
End If
我有一个包含多列数据的电子表格。在 VBA 中,我试图根据其他三列中任意一列中的数据在每一行中设置一个值。它将始终是这些数据之间的 OR 比较,并且需要 return 五个值之一。
所以我创建了五个数组(它们是多维的,因为它们是按范围读取的,但是,如果需要的话,它们可以是一维的,我想),我打算将这三列与那些数组进行比较一堆 IF-THEN 语句到 return 必要的值。
创建数组很简单,但我不知道如何正确创建 IF-THEN 过程。该过程的示例如下:
IF A1 is in ArrayA THEN
D1="Dog"
ELSEIF A1 is in ArrayB THEN
D1="Cat"
ELSEIF B1 is in ArrayC THEN
D1="Bird"
ELSEIF B1 is in ArrayD THEN
D1="Monkey"
ELSEIF C1 is in ArrayE THEN
D1="Blue"
ELSE
D1="Other"
我不确定这是否是完成我正在尝试做的事情的最有效方法,因此我绝对乐于接受有关不同方法的建议。谢谢。
好的,这就是我如何让它工作的。其中大部分来自另一个人,但他们删除了他们的评论,所以我无法感谢他们。
arrCols = Array(arrA, arrB, arrC, arrD, arrE)
arrVals = Array("Dog", "Cat", "Bird", "Monkey", "Blue")
For i = 2 To rCnt
pID = Cells(i, 2).Value
pName = Cells(i, 3).Value
pGroup = Cells(i, 4).Value
ans = ""
For j = LBound(arrCols) To UBound(arrCols)
If Not IsError(Application.Match(pGroup, arrCols(j), 0)) Then
ans = arrVals(j)
Exit For
ElseIf Not IsError(Application.Match(pName, arrCols(j), 0)) Then
ans = arrVals(j)
Exit For
ElseIf Not IsError(Application.Match(pID, arrCols(j), 0)) Then
ans = arrVals(j)
Exit For
End If
Next j
Cells(i, 5) = IIf(ans = "", "Other", ans)
Next i
我创建了一个数组数组来进行搜索。 i 循环遍历所有行。 j 循环循环遍历主数组中的数组。检查三个不同的列需要三个 IF 语句。返回值默认为 "Other" 除非在其中一个数组中找到它。
我唯一能够添加到此代码的是检查行中三个不同列所需的内容。
这是一个不循环的例子
If Len("," & Join(ArrayA, ",") & ",") <> Len("," & Replace(Join(ArrayA, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Dog"
ElseIf Len("," & Join(ArrayB, ",") & ",") <> Len("," & Replace(Join(ArrayB, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Cat"
ElseIf Len("," & Join(ArrayC, ",") & ",") <> Len("," & Replace(Join(ArrayC, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Bird"
ElseIf Len("," & Join(ArrayD, ",") & ",") <> Len("," & Replace(Join(ArrayD, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Monkey"
ElseIf Len("," & Join(ArrayE, ",") & ",") <> Len("," & Replace(Join(ArrayE, ","), "," & Range("A1").Value & ",", "") & ",") Then
Range("D1").Formula = "Blue"
Else
Range("D1").Formula = "Other"
End If
将数组连接到一个字符串,然后检查 len 与字符串的 len,关键字 (Range("A1")) 替换为空。在两边放一个逗号以确保它是完整的单词(不要像 Catfish to return as a Cat)
同样使用 InStr 代替:
If InStr(1, "," & Join(ArrayA, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Dog"
ElseIf InStr(1, "," & Join(ArrayB, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Cat"
ElseIf InStr(1, "," & Join(ArrayC, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Bird"
ElseIf InStr(1, "," & Join(ArrayD, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Monkey"
ElseIf InStr(1, "," & Join(ArrayE, ",") & ",", Range("A1").Value) > 0 Then
Range("D1").Formula = "Blue"
Else
Range("D1").Formula = "Other"
End If