VBA笔记:数组

1.单维数组

1.1 声明数组

声明1个1~50的数组,可以将区间值写出来
Dim SZ(1 To 50) As String
也可以用"个数"来标识,比如上述的1 to 50可以用49来替代(0~49的意思,总计50个数字)
Dim SZ(49) As String
我们还可以模块的开始,就设定好数组的索引值从1开始(1~50)

Option Base 1
Dim SZ(50) As String
1.2 数组赋值

当数组声明好了之后,我们可以给数组赋值
比如,给数组的第15个元素赋值的方法如下:
SZ(14) = "100"
给一个数组集体赋值的方式:

Sub ShuZu()
     Dim SZ(1 To 10) As Integer, i As Integer
    For i = 1 To 10
        SZ(i) = i
    Next
End Sub 

2.多维数组

2.1 二维数组

VBA还支持 横向、纵向 同时存在的列表型数组,比如,我们声明一个3*20的数组
Dim SZ (1 to 3 , 1 to 20)
当然,也可以用个数来表示数组

Option Base 1
Dim SZ(3,20) As String
2.2 三维数组

假设,有4个高3层、宽5格的货架,用数组可以这样来表示

Option Base 1
Dim SZ(4,3,5) As String
2.3 多维数组的赋值方式

与单维数组的赋值方式一样

Sub dwsz()
    Dim SZ(3,2,4)As String
    SZ(1,2,3) = "Max"
End Sub

3.动态数组

3.1 声明数组

当无法确定数组的存储元素多少时,我们可以先声明一个空的数组:
Dim SZ ()
然后,再通过ReDim语句来重新声明数组的大小

Sub dtsz()
    '定义数组
    Dim arr() As String 
    Dim n As Long
    '统计A列有多少非空单元格
    n = Application.WorksheetFunction.CountA(Range("A:A"))
    ReDim arr(1 To n) As String '重新定义数组的大小
    MsgBox n
End Sub
3.2 数组赋值
方法1:使用Array函数

数组内,参数间用英文逗号分隔,参数支持数字、文本
数组的索引号默认从0开始,除非在模块中的第1句已经写入了"Option Base 1"语句

Sub ArrayTest()
    Dim arr As Variant  '定义变量时,类型必须为Variant型
    '将1到10十个自然数赋值给数组arr
    arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
    MsgBox "arr数组的第2个元素为" & arr(1)
End Sub
方法2:使用Split函数

数组内,参数间用英文逗号分隔,参数仅支持文本(需要确认)

Sub SplitTest()
    Dim arr As Variant
    arr = Split("Lee,Chen,Zhang,Kong,Feng,Mi", ",")
    MsgBox "arr数组的第2个元素为:" & arr(1)
End Sub

数组的索引号默认从0开始,无论是否已写入"Option Base 1"语句

方法3:使用Range函数

可以把一个单元格区域的值存到数组里,也可以把数组里的值写到单元格里去(单元格区域的大小必须一致)

Sub RngArr()
    Dim arr As Variant
    arr = Range("A1:B2").Value  '将A1:B2单元格的内容存到数组arr里
    Range("C1:D2").Value = arr  '将arr的数据写入到C1:D2单元格里去
End Sub

4.数组的其他操作

4.1 数组索引(UBound、LBound)

通过UBound和LBound函数,可以计算数组的最大、最小索引号
UBound(arr) ‘返回数组的最大索引号
LBound(arr) ‘返回数组的最小索引号
UBound(arr) - LBound(arr) +1 ‘返回数组一共有多少个元素

Sub arrcount()
    Dim arr(49)
    MsgBox "数组的最大索引号是:" & UBound(arr) & Chr(13) 
          & "数组的最小索引号是:" & LBound(arr) & Chr(13) 
          & "数组的元素个数是:" & UBound(arr) - UBound(arr) + 1
End Sub

如果是一个多位数组,还需要指定数组的维度,比如:

Sub arrcount2()
    Dim arr(49, 100)
    MsgBox "第1维的最大索引是:" & UBound(arr, 1) & Chr(13) & "第2维的最小索引是:" & LBound(arr, 2)
End Sub
4.2 数组拼接(join)

使用join函数,可以将数组里的所有元素,通过一个指定的拼接符号,拼成一个新的字串

Sub JoinTest()
    Dim arr As Variant, txt As String
    arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    txt = Join(arr, "~")
    '如果省略分割符,则默认使用空格作为分割符号
    MsgBox txt
    '最终输出结果:0~1~2~3~4~5~6~7~8~9
End Sub
4.3 将数组写入单元格(range)

使用range函数,可以将数组写入单元格、区域

Sub ArrToRng()
    Dim arr As Variant
    arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
    '将数组的第3个元素写入单元格A1
    Range("A1").Value = arr(3)
    '将数组批量写入单元格(横向)
    Range("B1", "J1").Value = arr
    '将数组批量写入单元格(纵向)
    Range("A2:A10").Value = Application.WorksheetFunction.Transpose(arr)
End Sub

无论1维数组还是2维数组,在写入单元格区域时,区域的大小,与数组的大小需要保持一致

Sub ArrToRng2()
    Dim arr(2, 3) As String
    arr(1, 1) = 1
    arr(1, 2) = "A"
    arr(1, 3) = "a"
    arr(2, 1) = 2
    arr(2, 2) = "B"
    arr(2, 3) = "b"
    Range("A1:C2").Value = arr
End Sub
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 定义数组的时候,数组开始是没有数据的,我们需要将数据放进数组,然后进行操作。 操作数组,一般遵从这样的流程。数组赋...
    叶知行阅读 10,212评论 0 3
  • VBA学习笔记 笔记摘抄自EXCEL精英培训-蓝色幻想 VBA学习笔记01(链接)VBA学习笔记02 (链接) 目...
    天天向上的orange阅读 3,458评论 2 32
  • 什么是数组?在Excel里数组就是一个自由缩放的‘工作表‘,可以自定义决定大小(几行几列)。但不能只是一个单元格,...
    叶知行阅读 744评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,306评论 0 9
  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,741评论 6 49