当将单元格区域转换为VBA数组时,该数组变量必须是Variant类型,生成的数组是二维数组,下界是1,不受Option Base语句的影响。二维是先垂直后水平,第一维是单元格区域的行方向,第二维是单元格区域的列方向。如下所示:

Sub xyf()

'定义一个变量用于存放单元格区域的值

'未指定类型默认为Variant类型

Dim arr

arr = Range("a1:a2")

'也可以先定义一个Variant类型的动态数组变量

Dim arr1()

arr1 = Range("a1:a2")

'生成的数组的维数为(1 to 2,1 to 1)

End Sub

如下图所示

由Array函数生成的数组是一维水平数组,可以直接赋值给水平的单元格区域。如下所示:

Sub xyf()

Dim arr()

arr = Array(1, 2, 3)

Range("a1:c1") = arr

End Sub

如下图所示

当将单列多行的单元格区域赋值给数组变量后,可以用Application.WorksheetFunction.Transpose转置降为一维水平数组。如下所示:

Sub xyf()

Dim arr()

'以下语句产生二维的arr(1 to 8,1 to 1)数组

arr = Range("a1:a8")

'通过转置降为一维的arr(1 to 8) 数组

arr = Application.WorksheetFunction.Transpose(arr)

End Sub

如下图所示

当将单行多列的单元格区域赋值给数组变量后,可以两次使用Application.WorksheetFunction.Transpose将数组降为一维水平数组。如下所示:

Sub xyf()

Dim arr()

'以下语句产生二维的arr(1 to 1,1 to 3)数组

arr = Range("a1:c1")

'通过两次转置降为一维的arr(1 to 3) 数组

arr = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(arr))

End Sub

如下图所示

当将多行多列的单元格区域赋值给数组变量后,可以用Application.WorksheetFunction.Index函数的行参数将二维数组的每行转换为一维水平数组,如下所示:

Sub xyf()

Dim arr()

Dim arrTemp()

'以下语句产生二维的arr(1 to 5,1 to 3)数组

arr = Range("a1:c5")

'定义一个与arr数组一维尺寸相同的一维数组变量用于存放提取出来的每行一维数组的结果

ReDim arrTemp(1 To UBound(arr))

For i = 1 To UBound(arr)

'Application.WorksheetFunction.Index函数的第二参数指定行数生成一维数组

arrTemp(i) = Join(Application.WorksheetFunction.Index(arr, i), ",")

Next

End Sub

Application.WorksheetFunction.Index函数将二维数组降维时,只有通过行参数才可以直接降维,通过列参数不能直接降维,如下所示:

Sub xyf()

Dim arr()

Dim arrTemp()

'以下语句产生二维的arr(1 to 5,1 to 3)数组

arr = Range("a1:c5")

'生成一维数组(1 to 3)

arrTemp = Application.WorksheetFunction.Index(arr, 1)

'生成一维数组(1 to 3)

arrTemp = Application.WorksheetFunction.Index(arr, 1, 0)

'通过Index的列参数不能降维 , arrTemp还是二维数组(1 to 5,1 to 1)

arrTemp = Application.WorksheetFunction.Index(arr, 0, 1)

End Sub