2016 - 2024

感恩一路有你

Excel中VBA数组与单元格区域的相互转换

浏览量:4961 时间:2024-01-27 11:34:08 作者:采采

在使用VBA批量操作Excel工作表单元格区域时,经常会遇到将单元格区域转换为VBA数组的需求,同样也会遇到将VBA数组输出到单元格区域的情况。本文将介绍VBA数组与单元格区域的相互转换方法。

1. 单元格区域

单元格区域指至少包含两个单元格的区域,单独的单元格不算是单元格区域。

2. 一维水平数组

一维水平数组指数组的值在Excel单元格区域中按照水平方向输出,即按照Excel列的顺序输出。

3. 一维垂直数组

一维垂直数组指数组的值在Excel单元格区域中按照垂直方向输出,即按照Excel行的顺序输出。

4. 将单元格区域转换为VBA数组

当将单元格区域转换为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

5. 由Array函数生成的一维水平数组

使用Array函数生成的数组是一维水平数组,可以直接赋值给水平的单元格区域。

Sub xyf()
    Dim arr()
    arr  Array(1, 2, 3)
    Range("A1:C1")  arr
End Sub

6. 降维转换为一维数组

由于将单元格区域转换为VBA数组时,生成的数组是二维数组,内置的VBA数组函数都是针对一维数组,所以需要将二维数组降维转换为一维数组。

7. 单列多行的单元格区域转换为一维水平数组

当将单列多行的单元格区域赋值给数组变量后,可以使用函数将数组转置降为一维水平数组。

Sub xyf()
    Dim arr()
    ' 以下语句产生二维的arr(1 to 8, 1 to 1)数组
    arr  Range("A1:A8")
    ' 通过转置降为一维的arr(1 to 8)数组
    arr  (arr)
End Sub

8. 单行多列的单元格区域转换为一维水平数组

当将单行多列的单元格区域赋值给数组变量后,可以两次使用函数将数组降维转换为一维水平数组。

Sub xyf()
    Dim arr()
    ' 以下语句产生二维的arr(1 to 1, 1 to 3)数组
    arr  Range("A1:C1")
    ' 通过两次转置降为一维的arr(1 to 3)数组
    arr  ((arr))
End Sub

9. 多行多列的单元格区域转换为一维水平数组

当将多行多列的单元格区域赋值给数组变量后,可以使用函数的行参数将二维数组的每行转换为一维水平数组。

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)
        ' 函数的第二参数指定行数生成一维数组
        arrTemp(i)  Join((arr, i), ",")
    Next
End Sub

10. 列参数不能直接降维

在使用函数将二维数组降维时,只有通过行参数才可以直接降维,通过列参数是不能直接降维的。

Sub xyf()
    Dim arr()
    Dim arrTemp()
    ' 以下语句产生二维的arr(1 to 5, 1 to 3)数组
    arr  Range("A1:C5")
    ' 生成一维数组(1 to 3)
    arrTemp  (arr, 1)
    ' 生成一维数组(1 to 3)
    arrTemp  (arr, 1, 0)
    ' 通过Index的列参数不能降维, arrTemp还是二维数组(1 to 5, 1 to 1)
    arrTemp  (arr, 0, 1)
End Sub

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。