我正在设置一个子例程来在两个工作表之间执行匹配。数组是从第一个数据单元到最后一个单元的一维数组,该数组保存在变量中。
数组中的数据不是数字的,但是如果我将它们重新字符串化为字符串,则会在初始化中遇到类型不匹配的情况。
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
答案 0 :(得分:0)
Search()
是2D数组,并且代码将其用作1D数组。
通常,将范围传递给数组并不复杂,但是您应该注意一些技巧。第一个技巧-只要像这样通过范围:
search = Range(wksv.Cells(2, 11), wksv.Cells(FirstLastRow, 11))
传递给二维数组。在屏幕截图上看到蓝色突出显示的行:
二维数组的问题在于它们是二维的。例如,您应该寻找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