从Excel单元格中读取数组,创建2d数组

时间:2017-08-29 10:58:53

标签: arrays excel vba excel-vba

我正在尝试将单元格值列表读入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对于列表的长度是正确的。)

我不清楚为什么会这样或者如何停止。

2 个答案:

答案 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文章的一部分。