我正在尝试做我认为应该是一个简单公式的事情,但是事实证明这很困难。我试图通过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循环中收到下标超出范围的错误,我不确定为什么。请帮忙,我一直在寻找答案。
答案 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!代码中除法运算的结果。