Arrays 从Excel单元格读取数组创建二维数组

Arrays 从Excel单元格读取数组创建二维数组,arrays,vba,excel,Arrays,Vba,Excel,我正在尝试将Excel VBA中的单元格值列表读取到数组中。我是通过以下方式做到这一点的: Dim varHrArray As Variant varHrArray = Range(Cells(TITLE + 1, HR_LOCATION), Cells(TITLE + intHrLength, HR_LOCATION)).Value 虽然这是可行的,但它正在创建一个2d数组,我不确定确切的原因。消息框证实了这一点,MsgBox(varHrArray(1,1))按预期工作,但MsgBox(va

我正在尝试将Excel VBA中的单元格值列表读取到数组中。我是通过以下方式做到这一点的:

Dim varHrArray As Variant
varHrArray = Range(Cells(TITLE + 1, HR_LOCATION), Cells(TITLE + intHrLength, HR_LOCATION)).Value
虽然这是可行的,但它正在创建一个2d数组,我不确定确切的原因。消息框证实了这一点,
MsgBox(varHrArray(1,1))
按预期工作,但
MsgBox(varHrArray(1))
给出“下标超出范围”错误,并通过直接检查监视窗口中的变量-
varHrArray
显示为
变量/变量(1到7,1到1)
(顺便说一下,7对于列表的长度是正确的)


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

每当使用单元格范围创建数组时,创建的数组将始终是一个二维数组。。这是因为电子表格将值存储在两个维度中,即行和列。因此,第一个维度是行,第二个维度是行列

此外,数组的下界始终为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()作为变量“声明未分配的数组。
Arr=Range(“A1:C5”)“Arr现在是一个已分配的数组

将数据从工作表引入VBA数组时,数组始终是二维的。第一个维度是行,第二个维度是列。因此,在上面的示例中,Arr的大小隐式为Arr(1到5,1到3)其中5是行数,3是列数。即使工作表数据位于单行或单列中,也会创建二维数组(例如,Arr(1到10,1到1))。加载工作表数据的数组始终具有下限(LBound)等于1,无论模块中可能有哪个选项基指令。您无法更改此行为


以上是本文的一部分。

每当使用单元格范围创建数组时,创建的数组将始终是一个二维数组。。这是因为电子表格以两个维度存储值,即行和列。因此,第一个维度是行,第二个维度是列

此外,数组的下界始终为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()作为变量“声明未分配的数组。
Arr=Range(“A1:C5”)“Arr现在是一个已分配的数组

将数据从工作表引入VBA数组时,数组始终是二维的。第一个维度是行,第二个维度是列。因此,在上面的示例中,Arr的大小隐式为Arr(1到5,1到3)其中5是行数,3是列数。即使工作表数据位于单行或单列中,也会创建二维数组(例如,Arr(1到10,1到1))。加载工作表数据的数组始终具有下限(LBound)等于1,无论模块中可能有哪个选项基指令。您无法更改此行为


以上是文章的一部分。

应用程序。转置是将单个列或行范围传递到1d变量数组的一种很好的方法。例如:

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

请注意,您的范围被此函数转置。这意味着列范围变为1d行变量数组,vica变为1d行变量数组,因此您可能希望在将其返回工作表之前再次转置:

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


Application.Transpose
是将单个列或行范围传递到1d变量数组中的好方法。例如:

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

请注意,您的范围被此函数转置。这意味着列范围变为1d行变量数组,vica变为1d行变量数组,因此您可能希望在将其返回工作表之前再次转置:

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


你知道数组通常是以0为基础的,因此你可以通过在第1列而不是第0列中写入来扩大它。你知道数组通常是以0为基础的,因此你可以通过在第1列而不是第0列中写入来扩大它。喊得好。很好,很简单:)我不知道的好把戏。肯定比循环快。这是最好的回答。很好很简单:)我不知道的好把戏。肯定比循环快。这是最好的答案