我正在尝试将单元格值列表读入Excel VBA中的数组。我这样做是通过:
Dim varHrArray As Variant
varHrArray = Range(Cells(TITLE + 1, HR_LOCATION), Cells(TITLE + intHrLength, HR_LOCATION)).Value
虽然这有效,但它正在创建一个二维数组,我不确定为什么。这已通过消息框确认,MsgBox (varHrArray(1, 1))
按预期工作但MsgBox (varHrArray(1))
给出'下标超出范围'错误并通过直接检查观察窗口中的变量 - varHrArray
是显示为Variant/Variant(1 to 7, 1 to 1)
(顺便说一下,7对于列表的长度是正确的。)
我不清楚为什么会这样或者如何停止。
答案 0 :(得分:4)
.unbreakable td{
width: 100% !important;
}
.unbreakable tr{
page-break-inside: avoid !important;
}
是将单个列或行范围传递到1d变量数组的好方法。例如:
Application.Transpose
请注意,您的范围由此功能转置。这意味着列范围变为1d行变量数组,反之亦然,因此您可能希望在将其返回到工作表之前再次转置它:
v = Application.Transpose(Range("A1:A5"))
...或者,在开始时将其转置两次:
Range("B1:B5").Value = Application.Transpose(v)
答案 1 :(得分:2)
每当使用单元格范围创建数组时,创建的数组将始终为二维数组。这是因为电子表格以二维(即行和列)存储值。所以第一个维度是行,第二个维度是列。
此外,数组的下限始终为1,即LBound(varHrArray)= 1.
您可以将数组循环为
For i = 1 To UBound(arr)
some_var = arr(i, 1) 'or arr(i, 2),arr(i, 3) as per column
Next
虽然有方法可以将二维数组转换为一维数组。其中一个是
For i = 1 To UBound(varHrArray, 1)
tempArr(i) = varHrArray(i, 1)
Next
将工作表范围读取到VBA数组
读取工作表上的范围并将其放入VBA中的数组非常简单。例如,
Dim Arr()As Variant'声明一个未分配的数组。
Arr =范围(" A1:C5")' Arr现在是一个已分配的数组将数据从工作表引入VBA数组时,该数组始终为2维。第一个维度是行,第二个维度是列。因此,在上面的示例中,Arr隐式地调整为 Arr(1到5,1到3),其中5是行数,3是列数。即使工作表数据在单行或单列(例如,Arr(1到10,1到1))中,也会创建二维数组。加载工作表数据的数组始终具有等于1的下限(LBound),无论您在模块中使用哪个Option Base指令。你无法改变这种行为。
以上是this文章的一部分。