Excel VBA数组入门教程 (共10集)
[日期:2011-08-07]
来源:excel精英培训  作者:兰幻想
[字体: ]
1.前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。
2.数组的维数:
Sub数组示例()
  Dim x As Long, y As Long
  Dim arr(1 To 10, 1 To 3)  '创建一个可以容下103列的数组空间
  For x = 1 To 4
    For y = 1 To 3
      arr(x, y) = Cells(x, y)  '通过循环把单元格区域a1:c4的数据装进数组中
    Next y
  Next x
MsgBox arr(4, 3) '根据提供的行数和列数显示数组
arr(1, 2) = "我改一下试试" '你可以随时修改数组内指定位置的数据
MsgBox arr(1, 2)
End Sub
总结:二维是由行和列表示的数组,如ARR(3,2)表示数组中第3排第2列的元素。而一维数组只是由一个元素决定,如ARR4)表示数组中第4个元素
3.把单元格数据搬入内存:
一、声明:
          Dim arr as Variant  '声明一个变量,不能声明其他数据类型
          Dim arr(1 to 10, 1  to  2 ) ,这种声明也是错误的,固定大小的VBA数组是不能一次性装入单元格数据
      或:dim arr()  这种声明方式是声明一个动态数组,也可以装入单元格区域,构成一个VBA数组
  二、装入
          arr =range("a9:c100")  '装入很简单,变量 =单元格区域
三、读出
        装入数组后的单元格数值,可以按 数组名称(行数列数)直接读取该位置的值,如下面的代码。
          Msgbox  arr(3,2)  '就可以取出搬过去的而构成的数组第3行第2列的内容
四、示例
Sub s3()
    Dim arr() '声明一个动态数组(动态指不固定大小)
  Dim arr1  '声明一个Variant类型的变量
  arr = Range("a1:c7")  '把单元格区域A1C7的值装入数组arr
  arr1 = Range("a1:c7")  '把单元格区域A1C7的值装入数组arr1
  MsgBox arr(1, 1)  '读取arr数组中第1行第1列的数值
  MsgBox arr1(2, 3)  '读取arr1数组的第2行第3列的数值
End Sub
4.把单元格数据搬入内存:
Sub test()
  Dim arr    '声明一个变量用来盛放单元格数据
  Dim x As Integer
  arr = Range("a2:d5")    '把单元格数据搬入到arr里,它有44
  For x = 1 To 4    '通过循环在arr数组中循环
    arr(x, 4) = arr(x, 3) * arr(x, 2)    '数组的第4(金额)=3*2
  Next x
Range("a2:d5") = arr    '把数组放回到单元格中
End Sub
Sub test1()
  Dim arr(1 To 5) '声明一维数组
  For x = 1 To 5
    arr(x) = x * 2  '通过循环给每个位置赋值
  Next x
Range("A1:E1") = arr  '把数组导入到excel中的a1:e1单元格中
Range("A1:A5") = Application.Transpose(arr) '如果是放在一列中,就需要对数组进行转置后再存放
End Sub
5.动态数组的声明:
Sub darr()
  Dim arr()  '声明一个动态的arr数组(不知道它能盛多少数据)
  Dim k
  k = Application.WorksheetFunction.CountIf(Range("a2:a6"), ">10") '计算大于10的个数
  ReDim arr(1 To k)  '再次声明arr的大小,正好盛下k数量的值
  For x = 2 To 6
    If Cells(x, 1) > 10 Then
      m = m + 1
      arr(m) = Cells(x, 1)  '通过循环把大于10的数字装入数组
    End If
  Next x
  MsgBox arr(2)
End Sub
6.动态数组的声明:
    arr(-19 to 8) 这个数组的编号就是从-19开始的.那么它的最小编号就是-19,最大编号是8,如果用语句返回就是:
  Sub t1()
    Dim arr(-19 To 8)
    MsgBox UBound(arr) '返回最大编号,结果为8
    MsgBox LBound(arr) '返回最小编号,结果为-19
  End Sub
如果是有行列组成的二维数组呢?二维数组返回行的下标和列的下标见下例
      Sub t2()
        Dim arr(-19 To 8, 2 To 5)
    MsgBox UBound(arr) '返回第1(行的)最大编号,结果为8
array工艺详解
    MsgBox LBound(arr) '返回第1(行的)小编号,结果为-19
    MsgBox UBound(arr, 2) '返回第2(列的)最大编号,结果为5
    MsgBox LBound(arr, 2) '返回第2(列的)最小编号,结果为2
      End Sub
Sub t3()
        Dim arr
      arr = Sheets(1).UsedRange 'Usedrange的行数和列数是未知的
      MsgBox UBound(arr, 1) '可以计算这个区域有多少行
      MsgBox UBound(arr, 2) '可以计算出这个区域有多少列
End Sub
7.使用Array函数创建常量数组:
使用Array函数创建数组
        1维常量数组:Array("A",1,"C")
        2维常量数组: Array(Array("a", 10), Array("b", 20), Array("c", 30))
也可以调用excel工作表内存数组:
        1维数量:  [{"A",1,"C"}]
        2维数量: [{"a",10;"b",20;"c",30}]
内存常量数组有什么作用呢?
      1、简化赋值
            比如:我需要给数组arr分别赋值10 ,20,30,40,一般就需要分别赋值,即:
                    arr(1)=10
                    arr(2)=20
                    arr(3)=30
                    arr(4)=40
                而使用常量数量,只一句话:
                    arr=array(10,20,30,40)
        2、调用工作表函数时使用:
            Sub mylook()
                Dim arr
                arr =[{"a",10;"b",20;"c",30}]
            MsgBox Application.VLookup("b", arr, 2, 0)  '调用vlookup时可以作为第二个参数
            End Sub
8.数组的合并和字符串拆分(Join & Split):
多个字符的合并和字符串按规律的拆分是经常遇到的,如:
            A-REW-E-RWC-2-RWC按分隔符-拆分成6个字符放在一个数组中
          有一组数array(23,45,7,1,76)想用分隔符-连接成一个字符串
  上面两种情况VBA提供了一对函数,即:
            split(字符串,"分隔符" 拆分字符串
            join(数组,"分隔符")  用分隔连接数组的每个元成一个字符串
    Sub t1()
      Dim arr, myst As String
      myst = "A-REW-E-RWC-2-RWC"
    arr = Split(myst, "-")  '-分隔成一组数装入数组中
    'MsgBox arr(0) '显示数组的第一个数(分隔后的数组最小下标为0,不是1),显示结果为A
              MsgBox Join(arr, ",") '再用","把数组的每个值连接成一个字符串,结果为"A,REW,E,RWC,2,RWC"
          End Sub

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。