带数组下标的VLOOKUP超出范围

时间:2018-07-31 00:56:30

标签: arrays vba excel-vba vlookup

我正在尝试做我认为应该是一个简单公式的事情,但是事实证明这很困难。我试图通过VBA将单元格设置为等于公式。这是代码:

Dim pivotws_month As Worksheet
Dim departmentArray() As Variant
Dim i As Long
Dim x As Long
Dim lrow As Long

lrow = pivotws_month.Cells(Rows.Count, 2).End(xlUp).Row
ReDim departmentArray(1 to lrow)
departmentArray = pivotws_month.Range("B4:B" & lrow)

i = 4  
For x = 1 to UBound(departmentArray)
   pivotws_month.Cells(i,4).Value = pivotws_month.Cells(i,3) / Application.WorksheetFunction.VLookup(departmentArray(x), pivotws_month.Range("G4:H" & lrow), 2, False)
i = i + 1
Next x

我已经调试了变量,并且借用是正确的(297),数组中的项目数是正确的(294)。我不断在For循环中收到下标超出范围的错误,我不确定为什么。请帮忙,我一直在寻找答案。

1 个答案:

答案 0 :(得分:2)

您已经创建了2D数组;提供所有参考文献中的排名。

...

'this Redim is completely unnecessary
'ReDim departmentArray(1 to lrow)

...

with pivotws_month
    i = 4  
    lrow = .Cells(Rows.Count, 2).End(xlUp).Row
    'create a 2-D array of many 'rows' and one 'column
    departmentArray = .Range("B4:B" & lrow).value
    For x = LBound(departmentArray, 1) to UBound(departmentArray, 1)
       .Cells(i,4).Value = .Cells(i,3) / Application.VLookup(departmentArray(x, 1), .Range("G4:H" & lrow), 2, False)
        i = i + 1
    Next x
end with

从工作表范围始终加载变量数组将生成二维数组。从单行还是单列加载都没有关系。它还会在批量加载代码行之前将任何Option Base 0声明或ReDim命令丢弃到一维数组。

您可以在批量加载事件之后使用以下方法测试阵列的尺寸。

debug.print lbound(departmentArray, 1) & ":" & ubound(departmentArray, 1)
debug.print lbound(departmentArray, 2) & ":" & ubound(departmentArray, 2)

将第一个等级(例如ubound(departmentArray, 1))视为数组的“行”,将第二个等级(例如ubound(departmentArray, 2))视为数组的“列”可能会有所帮助。 / p>

该VLOOKUP上没有错误控制。一个简单的不匹配#N / A将使您的代码陷入混乱。可以将Application.Vlookup的结果放入一个变量中,并且可以使用IsError测试该变量。可以使用针对零变量的进一步测试来避免#DIV / 0!代码中除法运算的结果。