多维数组并比较每个数组中的值并为每个数组

时间:2017-03-25 06:55:38

标签: excel-vba multidimensional-array compare vba

我遵循程序将值调用到数组并比较值并给出结果。我在另一个帖子中问了这个问题。 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

请帮助我如何重写此代码以比较每列调用的值。

1 个答案:

答案 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

我希望这会有所帮助。让我知道这些信息不符合您的需求。