首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA实战技巧05: 动态调整数组以存储所需数据

VBA实战技巧05: 动态调整数组以存储所需数据

作者头像
fanjy
发布2020-04-14 16:07:46
发布2020-04-14 16:07:46
4.2K00
代码可运行
举报
文章被收录于专栏:完美Excel完美Excel
运行总次数:0
代码可运行

学习Excel技术,关注微信公众号:

excelperfect

数组是一种常用的数据结构,可用来存储一组相同类型的数据,你可以将一个数组变量视为一个迷你的电子表格,通过引用数组中的位置来存储或者获取数据。

下图1所示的示例是一个名为MyArray的一维数组,包含有6个元素。注意,数组的索引通常从0开始。

图1

下图2所示的示例是一个名为MyArray的3×4二维数组,包含有12个元素,像不像一个电子表格。注意,其行列的基准值都是从0开始的。

图2

当然,还可以使用三维甚至更高维度的数组,但我们最常使用的是一维数组或二维数组。如果你想详细学习数组的相关知识,可参阅相关文章:

Excel VBA解读|进阶篇(152):数据结构——谈谈数组

Excel VBA解读|进阶篇(153):数据结构——基本的数组操作

Excel VBA解读|进阶篇(154):数据结构——数组常用操作示例代码

Excel VBA解读|进阶篇(155):数据结构——数组相关的函数

VBA进阶|数组基础01:用最浅显的介绍来帮你认识数组

VBA进阶|数组基础02:简单的数组操作

……等等系列文章

快速了解数组后,我们来讲解在存储数据时动态调整数组大小的一些方法。

方法1:预先调整数组大小

在数组中存储数据之前,将数组大小调整为所要存储的数据数量。这非常适合事先知道需要存储的数据有多少的情形。

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray1()
    Dim MyArray() As Variant
    Dim rngData As Range
    Dim rng As Range
    Dim i As Long
   
    '确定要存储的数据
    Set rngData = ActiveSheet.UsedRange
   
    '在存储数据前调整数组大小
    ReDim MyArray(rngData.Cells.Count)
   
    '遍历单元格并在数组中存储数据
    For Each rng In rngData.Cells
        MyArray(i) = rng.Value
        i = i + 1
    Next rng
End Sub

方法2:随时调整数组大小

VBA在调整数组大小时,会清除掉原先存储的数据。如果调整数组大小的同时,想要保留之前存储在数组中的数据,则需要使用Preserve关键字,告诉VBA在增加数组存储容量时,保留原来存储在数组中的数据。

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray2()
    Dim MyArray() As Variant
    Dim rngData As Range
    Dim rng As Range
    Dim i As Long
   
    '确定要存储的数据
    Set rngData = ActiveSheet.UsedRange
   
    '遍历单元格区域并在数组中存储数据
    For Each rng In rngData.Cells
        ReDim Preserve MyArray(i)
        MyArray(i) = rng.Value
        i = i + 1
    Next rng
End Sub

方法3:从带有分隔符的字符串中创建数组

分隔符是用于分隔数值的指定字符,例如CSV文件就是由逗号分隔的值组成的文件,我们可以将由分隔符组成的字符串拆分成数组。例如,下面的代码首先将数值转换成由“;|;”分隔成的字符串,然后将该字符串转换成数组。

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray3()
    Dim MyArray As Variant
    Dim myString As String
    Dim rngData As Range
    Dim rng As Range
   
    '确定要存储的数据
    Set rngData =ActiveSheet.Range("C1:C100")
   
    '遍历单元格区域并以指定的分隔符连接数值
    '并将其存储在字符串中
    For Each rng In rngData.Cells
        myString = myString &";|;" & rng.Value
    Next rng
   
    '移除字符串末尾的分隔符(;|;)
   myString = Right(myString, Len(myString) - 3)
   
    '使用Split函数创建数组
    MyArray = Split(myString, ";|;")
End Sub

如果已经有一个带分隔符的字符串,那么可以使用代码很方便地将其拆分成数组:

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray4()
    Dim MyArray As Variant
    Dim myString As String
   
    '使用分隔符的字符串
    myString = "一年级;|;二年级;|;三年级;|;四年级;|;五年级;|;六年级"
   
    '使用Split函数创建数组
    MyArray = Split(myString, ";|;")
End Sub

方法4:直接赋值

可以直接将单元格区域赋值给数组变量来创建数组:

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray5-1()
    Dim MyArray() As Variant
   
    '创建数组
    MyArray =Application.Transpose(Range("A1:A6"))
End Sub

还可以创建二维数组:

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray5-2()
    Dim MyArray() As Variant
   
    '创建数组
    MyArray = Range("A1:D3")
End Sub

方法5:从表中提取数据直接创建数组

这个方法在表中的数据变化时,代码仍正常运行,也就是说,表使数组也具有了自动扩展功能。

代码语言:javascript
代码运行次数:0
运行
复制
Sub PopulateArray6()
    Dim MyArray() As Variant
    Dim myTable As ListObject
   
    '设置表变量
    SetmyTable = ActiveSheet.ListObjects("表1")
   
    '创建数组
    MyArray =Application.Transpose(myTable.DataBodyRange.Columns(1))
End Sub

注意,方法4和方法5创建的数组其索引从1开始。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档