比较两个阵列与excel VBA

时间:2013-06-07 05:56:31

标签: arrays excel vba loops

至于问题,我需要能够将Variant数组A中的所有数据与Variant数组B中的所有数据进行比较。我知道我需要某种双循环(以便根据所有B值检查每个A值) ),但我无法弄清楚该怎么做。这是我到目前为止所做的:

Sub Button_Click()
Dim trgtRange As Variant
Dim tempRange As Variant
Set myRange = ThisWorkbook.Sheets(1).Range("L:L")
For Each cell In myRange
        If IsEmpty(cell) Then
            ActiveCell.Offset(-1, 0).Select
            currentRow = ActiveCell.Row
            Set trgtRange = Range("L2:L" & currentRow)
            Exit For
        End If
    Next cell
Set tempRange = Range("A1:A" & currentRow - 1)
' Insert a double loop here
End Sub

所以,trgtRange是变体A而tempRange是变体B.我知道我可以将变体B设置得更容易一点,但我已经这样做了。毕竟,代码应该作为最后的操作抛光。

您可能想知道为什么变体A和B完全相同。那么,那是因为我需要对它们进行比较,以便找到彼此接近的值(即10000和12000),并且我需要对它进行某种容忍。

1 个答案:

答案 0 :(得分:1)

这是我的答案。你为什么需要两个循环才能做到这一点。一些相对寻址很好地解决了这个问题。像这样设置一个电子表格,例如:

Spreadsheet Layout

您的代码就是这个

Sub Button_Click()
    Dim dblTolerance As Double
    Dim tmp As Range


    'Get source range
    Set tmp = ActiveSheet.Range("A2")

    'Get tolerance from sheet or change this to an assignment to hard code it
    dblTolerance = ActiveSheet.Range("D13")

    'use the temporary variable to cycle through the first array
    Do Until tmp.Value = ""

        'Use absolute function to determine if you are within tolerance and if so put match in the column
        'NOTE:  Adjust the column offset (set to 4 here) to match whichever column you want result in
        If Abs(tmp.Value - tmp.Offset(0, 2).Value) < dblTolerance Then
            tmp.Offset(0, 4).Value = "Match"
        Else
            tmp.Offset(0, 4).Value = "No Match"
        End If

        'Go to the next row
        Set tmp = tmp.Offset(1, 0)
    Loop

    'Clean up
    Set tmp = Nothing
End Sub

代码中的注释解释了它的工作原理。这优于双循环,因为相对引用更快,内存使用更有效,并且您只需要在每行进行一次传递。

如果出于某种原因需要使用双循环让我知道,但这种方法的性能较差。希望这会有所帮助。