我遵循程序将值调用到数组并比较值并给出结果。我在另一个帖子中问了这个问题。 VPA program for compare values in array and give a result (MS Excel)
这里我们可以看到赋值的一维数组。但我希望在IF
条件为真时调用多列中的值
Dim arr as variable
For i = 1 to u
if mycondition1 then
x = Cells(i, 2).Value
m = Application.WorksheetFunction.CountIf(Range("B4:B" & u), x)
ReDim arr(1 To m)
For j = 1 to u
if mycondition2 then
arr(y) = Cells(j, 27)
End If
Next j
对于一维数组,我使用代码arr(y) = Cells(j, 27)
。在这里,我想调用第27列的值。像这样,我想从不同的列中分配值(比如说27,28,29到32)。我知道我可以使用二维数组说arr(1 to m, 1 to 6)
而不是创建六个数组,并从每个列和行的单元格中获取值。但是不知道如何比较每列的值类似于下面给出的代码(这是一个列值的比较)。我不得不为每一列写一个比较代码。所以我的编码行更多,并且需要花费大量时间来执行。我想要for循环到u=100.000
行。有没有简单的方法
w = arr()
Res = Application.Match(Array("No", "-"), w, 0)
For Each r In Res
ThisWorkbook.Worksheets("Sheet1").Cells(i, 27) = "X"
If Not IsError(r) Then
ThisWorkbook.Worksheets("Sheet1").Cells(i, 27) = "O"
Exit For
End If
Next r
Erase arr()
Exitsinglepart:
End If
Next i
End Sub
请帮助我如何重写此代码以比较每列调用的值。
答案 0 :(得分:0)
首先,我必须说我不明白你想要什么。其次,我觉得你的方式是错误的。鉴于我的第一次观察,我道歉。这就是我的方式: -
Private Sub TestIsYes()
Dim Arr As Variant
Arr = Array("Yes", "-", "Yes", "yes", "Yes")
Debug.Print IsYes(Join(Arr, ","))
End Sub
Function IsYes(StrArr As String) As String
' 25 Mar 2017
Dim Fun As Boolean
Fun = CBool(InStr(1, StrArr, "no", vbTextCompare))
If Not Fun Then
Fun = CBool(InStr(StrArr, "-"))
End If
IsYes = Split("No Yes")(CInt(Fun) + 1)
End Function
如您所见,函数IsYes
收到一个字符串,如"是, - ,是,是"并返回"是"或"否"根据您的标准。您可以通过更改子TestIsYes
中参数数组的元素来测试该函数。 TestIsYes
可以将此结果直接写入工作表中的任何单元格。
此功能可能会以您需要的任何方式进行修改,但它仍然是您项目的核心。因此,问题是如何生成作为参数传递给IsYes
的字符串。您希望(或者应该希望)从范围中生成此字符串。下一个功能就是这样。
Private Function RangeToString(Rng As Range) As String
' 25 Mar 2017
Dim Fun As String
Dim Arr As Variant
Dim R As Long, C As Long ' rows / columns
Arr = Rng.Value
With Arr
For R = LBound(Arr) To UBound(Arr)
For C = LBound(Arr, 2) To UBound(Arr, 2)
Fun = Fun & Arr(R, C) & ","
Next C
Next R
End With
RangeToString = Fun
End Function
请注意,从Excel范围生成的任何数组都是3维的,即使它是从单个列中获取的。因此,上述函数会生成IsYes
所需范围内的字符串,无论其具有多少列。
我在工作表范围B2:C5中设置了一个测试(4行,2列 - 根据需要扩展或缩小),满足您的标准。我使用之前解释的函数创建了以下函数。
Function UDFIsYes(Rng As Range) As String
' 25 Mar 2017
UDFIsYes = IsYes(RangeToString(Rng))
End Function
您可以从输入=UDFIsYes(B2:C5)
的工作表中调用此功能。您可以从VBA过程调用相同的函数,如下所示。
Private Sub TestUDF()
Debug.Print UDFIsYes(ActiveSheet.Range(Cells(2, 2), Cells(5, 3)))
End Sub
我希望这会有所帮助。让我知道这些信息不符合您的需求。