从Excel单元格读取数组创build2d数组

我正在尝试读取Excel VBA中的数组的单元格值列表。 我正在通过这样做:

Dim varHrArray As Variant varHrArray = Range(Cells(TITLE + 1, HR_LOCATION), Cells(TITLE + intHrLength, HR_LOCATION)).Value 

虽然这工作,它正在创build一个二维数组,我不确定为什么。 这已经被消息框所证实, MsgBox (varHrArray(1, 1))按预期工作,但MsgBox (varHrArray(1))给出'下标超出范围'错误,并通过直接检查监视窗口中的variables – varHrArray显示为Variant/Variant(1 to 7, 1 to 1) varHrArray Variant/Variant(1 to 7, 1 to 1) (对于列表的长度varHrArray Variant/Variant(1 to 7, 1 to 1) 7是正确的)。

我不清楚为什么会发生这种情况,或者如何停止。

无论何时使用单元格范围创build数组,创build的数组总是一个二维数组 。 这是因为电子表格存储两维的值,即行和列。 所以第一维是行,第二维是列。

而且,数组的下界总是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数组时,该数组始终是二维的。 第一个维度是行,第二个维度是列。 所以,在上面的例子中,Arr的大小隐含为Arr(1到5,1到3) ,其中5是行数,3是列数。 即使工作表数据在单行或单列中(例如,Arr(1到10,1到1)),也会创build2维数组。 加载工作表数据的数组始终具有等于1的下限(LBound) ,而不pipe您在模块中可能具有哪个Option Base指令。 你不能改变这种行为。

以上是本文的一部分。

Application.Transpose是将单个列或行范围传递给1d变体数组的一种很好的方法。 例如:

 v = Application.Transpose(Range("A1:A5")) 

请注意,您的范围是由此function转置。 这意味着一个列的范围变成了一个第一行variables数组,并且反过来也是如此,所以你可能需要在将它返回到工作表之前再次转置它:

 Range("B1:B5").Value = Application.Transpose(v) 

…或者,在开始时转置两次:

 v = Application.Transpose(Application.Transpose(Range("A1:A5"))) 

如果你想传递一个数组,有一个技巧,使用移调两次。 喜欢这个:

 Public Sub TestMe() Dim rngRange As Range Dim varArr As Variant Set rngRange = Range("A1:C1") With Application varArr = .Transpose(.Transpose(rngRange)) End With End Sub