将参数传递给数组时下标超出范围

时间:2019-07-14 22:34:15

标签: excel vba

我正在设置一个子例程来在两个工作表之间执行匹配。数组是从第一个数据单元到最后一个单元的一维数组,该数组保存在变量中。

数组中的数据不是数字的,但是如果我将它们重新字符串化为字符串,则会在初始化中遇到类型不匹配的情况。

SheetOneLastRow和SheetTwoLastRow是子例程,它们查找要在变量FirstLastRow和SecondLastRow中保留的每张工作表的最后一行,这些变量在全局中声明,因为它们在其他子控件中使用。

编辑1:错误在行上:

  

如果search(i)= arr(j)然后

FirstLastRow的值为9589,而SecondLastRow的值为20750。 仅在此处使用ReDim声明了search和arr。

Sub Match()

SheetOneLastRow
SheetTwoLastRow
Dim i, j As Integer
ReDim arr(SecondLastRow - 2) As Variant
ReDim search(FirstLastRow - 2) As Variant

search = Range(wksv.Cells(2, 11), wksv.Cells(FirstLastRow, 11))
arr = Range(wkst.Cells(2, 6), wkst.Cells(SecondLastRow, 6))

For i = 2 To FirstLastRow
    For j = 2 To SecondLastRow
        If search(i-2) = arr(j-2) Then
        wkst.Cells(j, 3) = wksv.Cells(i, 3)
        End If
    Next j
Next i

End Sub

1 个答案:

答案 0 :(得分:0)

Search()是2D数组,并且代码将其用作1D数组。

通常,将范围传递给数组并不复杂,但是您应该注意一些技巧。第一个技巧-只要像这样通过范围:

search = Range(wksv.Cells(2, 11), wksv.Cells(FirstLastRow, 11))传递给二维数组。在屏幕截图上看到蓝色突出显示的行:

enter image description here

二维数组的问题在于它们是二维的。例如,您应该寻找Search(2,1)而不是Search(2)。或在上面的代码中,它应该是:If Search(i,1) = arr(j,1) Then

可能有更好的方法来解决此问题,例如将范围传递到一维数组,如此处的示例-https://stackoverflow.com/a/52467171/5448626

如果将范围强制为一维数组,则会发生这种情况:

Sub Match()

    Dim i, j As Integer
    FirstLastRow = 9589
    SecondLastRow = 20750

    ReDim arr(SecondLastRow - 2) As Variant
    ReDim Search(FirstLastRow - 2) As Variant

    With Worksheets(1) 'put wksv
        Search = Application.Transpose(.Range(.Cells(2, 11), .Cells(FirstLastRow, 11)))
    End With

    With Worksheets(2) 'put wkst
        arr = Application.Transpose(.Range(.Cells(2, 6), .Cells(SecondLastRow, 6)))
    End With

    For i = 2 To FirstLastRow - 2  '-2 is needed because of ReDim arr(SecondLastRow - 2)
        For j = 2 To SecondLastRow - 2
            If Search(i) = arr(j) Then
                Worksheets(1).Cells(j, 3) = Worksheets(2).Cells(i, 3)
            End If
        Next j
    Next i

End Sub

enter image description here