1、数据类型
          数据类型告诉计算机如何将数据存储在内存中,如以整数、字符串、日期等。
          数据类型是变量的特性,数据类型包括:

数据类型
存储空间大小
范围
Byte 1 个字节 0 到 255
Boolean 2 个字节 True 或 False
Integer
2 个字节 -32,768 到 32,767
Long(长整型) 4 个字节 -2,147,483,648 到 2,147,483,647
Single (单精度浮点型) 4 个字节 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38
Double (双精度浮点型) 8 个字节 负数时从 -1.79769313486232E308 到
-4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308
Currency
8 个字节 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
(变比整型)
Decimal 14 个字节 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001
Date 8 个字节 100 年 1 月 1 日 到 9999 年 12 月 31 日
Object 4 个字节 任何 Object 引用
String
10 字节加字符串长度 0 到大约 20 亿
(变长)
String(定长) 字符串长度 1 到大约 65,400
Variant(数字) 16 个字节 任何数字值,最大可达 Double 的范围
Variant(字符) 22 个字节加字符串长度 与变长 String 有相同的范围
用户自定义
所有元素所需数目 每个元素的范围与它本身的数据类型的范围相同。
(利用 Type)


--------------------------------------------------------------------------------------
          2、变量
          变量是用于保存在程序运行过程中需要临时保存的值或对象。就相当于我们在操作工作表的时候插入的辅助单元格、辅助列或辅助表一样。
          同工作表的单元格一样,变量可以接纳很多种的数据类型,如其名,程序运行后,变量的值是可以改变的。

          如何定义变量?
          定义变量可以使用Dim语句:
  
                                        Dim 变量名 As 数据类型

定义变量除了可以使用Dim语句外,比较常的还有:static语句,Private语句,Public语句。使用不同的语句定义的变量不同的是它们的作用作用域不同,具体为:
          (1)如果在一个过程中包含了一个Dim或Static语句,此时声明的变量作用域为此过程,即本地变量
          (2)如果在一个模块的第一个过程之前包含了Dim或Prvate语句,此时声明的变量作用域为此模块里所有的过程,也就是在此模块里所有的过程都可以使用它,即模块作用域下的变量;         
          (3)如果在一个模块的第一个过程之前包含了Public语名,此时声明的变量作用域为所有模块,即公有变量

          变量的作用域是指变量保留其值的这段时间,也称为变量的生成周期,它决定变量可以用于哪个模块或过程中。

          给变量赋值
          用等号(=)是VBA里的赋值运算符。

          比如我们把"我在学习VBA变量!"这个字符串赋给变量A,则直接输入:

                                        A="我在学习VBA变量!"

          对了,你可以在立即窗口里试一下逐条输入:

                                        A="我在学习VBA变量!"
                                        Mgbox A

 

3、常量

          执行过程时,变量的值会发生改变,所以我们称它为“变量”,但有时候我们需要引用不会发生变化的数据,这就是常量。常量声明后,不以对它进行再赋值。
          声明常量设定常量的值,需要用Const语句:

                                        Const 常量名 As 数据类型 = 常量的值

4、数组
          除了变量和常量以外,数组也是我们常用到的。

          什么是数组?
          数组是具有相同数据类型并且共享一个名字的一组变量的集合。数组也是变量。
          数组中的元素通过索引数字加以区分。

          如何声明数组?
          可以用Dim语句或者Public语句声明数组。
                                        Dim/Public 数组名 (a to b) as 数据类型  

             a 和b 是数组中元素的个数,数组元素素最小值为a,最大值为b,元素个数为(b-a+1)个,当然,你也可以直接输入个数,此时默认最小索引号为0。   
                                   如: Dim myarr(5) As Integer

          这个数组的最小元素索引号为0,元素个数为6。
          上面定义的只是一维数组,你还可以定义二维、三维、四维…….
                                   如: Dim myarr(1 to 5,1 to 10) As Integer
          这就是一个二维数组,元素个数为5*10=50个。

          在程序设计的过程中,定义数组的时候我们可能不能确定数组的元素个数,对数组进行声明后,可以在运行时用ReDim语句重新指定数组的大小。

 

定义数组
  声名数组同声明其他变量的方式一样,唯一不同的是数组有大小,包含多个单个变量。
  初一学生报名入学后开始分班级,领导说,七(1)班分50个学生(确定了班级学生的个数最多只能有50个学生,再多一个都不行,因为没有座位了。),知道有50个学生后,老师拿到学生花名册就开始给学生编学号,建学籍。1号是谁?2号是谁?……50号是谁?
  这就是一个定义数组,并给数组赋值的过程,用语句来表示,可以这样:
  Dim 七(1)班(1 To 50)
  七(1)班(1) = "张三"
  七(1)班(2) = "李四"
  七(1)班(3) = "王王"
  .....
  七(1)班(50) = "赵六"

  这里,我们定义了一个50个元素的一维数组,并分别给数组的元素赋值。当然,这里用的只是一个模拟的语句。如果我们需要定义一个数组arr,存放1到100的整数集合,则代码为:
  

  1.   Sub ggsmart()
  2.     Dim arr(1 To 100) As Integer '声明数组名称及数据类型
  3.     For i = 1 To 100 '循环,为数组的元素赋值
  4.       arr(i) = i
  5.     Next
  6.   End Sub
  7.   
复制代码

  其实“Dim arr(1 To 100) As Integer”我们也可以写成“Dim arr(99) As Integer”,这样,定义的数组同样是100个元素的一维数组,因为如果不指定起始索引号的话,VBA默认从0开始。
  当然,你也是可以通过OPTION BASE 来修改数组默认的起始序号,在模块的第一句写上“OPTION BASE 1”这样,默认的数组起始序号就是1了。
  
  学习累了,恰好第二节课刚下,课间操时间,顺便可以到操场练练。可是,有些同学不认真啊,这不,老师在广播里叫上了:“七年级,(1)班的第五个同学请认真一点,七年级,(2)班的第三个同学注意队形……”
  天了,我惊奇地发现,原来我们生活中有这么多“数组”,可是,你知道上面的这两个同学共享了一个什么名字吗?
  是的,“七年级”就是它们共有的名字。
  新生分班时,校长就说了,550名新生,每班50人,分成11个班,到各个班级里,老师都给学生分了学号(1到50号),11个班级就有11个1号,也有11个50号。晕,一个班的学生名字我都记不住,如果11个班的学生全站在一起,我该怎么称呼?
  我高兴了,还好,我会数组。找到“moon2278”同学,我会说“七年级,1班,5号同学”,哈,难不了我。如果“宝贝有酒窝”同学是初一(9)班的25号,没关系,我也会说“七年级,9班,25号同学”。
  哇,好简单,前面加个班级的序号区分就行了。
  这里,“七年级”实际上是一个由11个一维数组(11个班)组成的二维数组,它的元素的个数是11*50(11个班,每个班级50名学生)个。习惯性,大家会说它是一个11*50的二维数组。
  如果要写成代码,那就是:
  Dim 七年级(1 To 11, 1 To 50)
  七年级(1, 1) = "张三"
  七年级(1, 2) = "李四"
  '......
  七年级(2, 1) = "钱林"
  七年级(2, 50) = "林平"
  '......
  七年级(11, 50) = "周六"
  我们说上面的数组是一个11*50的二维数组,放到表格里就相当于是一个11行50列的数组。
  如果我们想定义一个二维数组,第一列存放1到100的奇数,第二列存放1到100的偶数,代码为:
  

  1.   Sub ggsmart()
  2.     Dim i As Integer, j As Integer
  3.     Dim arr(1 To 50, 1 To 2) As Integer '定义一个50*2的二维数组(50行,2列)
  4.     j = 1       '数组1 to 50的索引号
  5.       For i = 1 To 100 Step 2
  6.           arr(j, 1) = i  '奇数赋值
  7.           arr(j, 2) = i + 1 '偶数赋值
  8.           j = j + 1 '索引号加1
  9.   Next
  10.   [a1:b65536].Clear '清除原有数据
  11.   [a1].Resize(50, 2) = arr '将数组赋值给A1单元格向下50行,向右2列的区域
  12.   End Sub
  13.   
复制代码

   <ignore_js_op> 1到100的奇偶数.rar (6.63 KB, 下载次数: 3185) 把代码复制到模块里,按F5可以看到程序运行的效果。
  
  上面,我们讲的是一维数组和二维数组,你也可以按同样的思路来理解三维、四维数组,甚至五维、六维……或者更多。
  无非就是将称呼moon2278同学的方式改为“XX中学、七年级、1班、5号同学”或“XX市、XX中学、七年级、1班、5号同学”而已,如果你喜欢,你还可以将这个称呼扩展,随你了,这里不再举例。
  
  三、动态数组
  声明一个数组,必须指定数组的大小,即它是几维数组,有多少个元素。
  但有些时候,我们在定义数组的时候,并不能确定数组的大小,这时,我们在首次定义数组的时候括号内为空(当然先指定一个大小也是可以的,但纯属是多余),在程序过程中用Redim语句去重新指定数组的大小,这就是动态数组。
  比如一个工作表的A列存储了学生姓名,现在我们需要把把有姓“张”的学生存储在数组arr中,预先我们并不知道A列姓张的学生有三十个还是五十个,所以,我们在定义时代码可以这样:
  

  1.   Sub ggsmart()
  2.     Dim i%, xrow%, j%, xcount%
  3.     Dim arr() As String
  4.     xrow = [a65536].End(3).Row '最后一个非空单元格行号
  5.     j = 1       '数组索引号
  6.     xcount = Application.WorksheetFunction.CountIf([a1:a65536], "张*") '统计有多少姓张的学生
  7.     ReDim arr(1 To xcount) '重新定义数组大小,元素共有xcount个
  8.     For i = 1 To xrow
  9.        If Left(Cells(i, 1).Value, 1) = "张" Then
  10.          arr(j) = Cells(i, 1).Value '给数组元素赋值
  11.          j = j + 1 '索引号加1
  12.        End If
  13.     Next i
  14.   [b1:b65536].Clear '清除原有数据
  15.   [b1].Resize(xcount, 1) = Application.WorksheetFunction.Transpose(arr) '将数组输入单元格区域
  16.   End Sub
  17.   
复制代码

   <ignore_js_op> 姓“张”的学生.rar (7.16 KB, 下载次数: 3940)   
  四、其他创建数组的几种方式
  其实在上面,我们已经接触了如何创建数组了。无非就是像给学生排座位一样,你坐第一排,我坐第二排,他坐第三排,然后你们大家统称为第一组。
  好简单,这里,我再介绍几种上面没讲到,但常见的方法:
  1、使用Array创建数组
  看以下代码:
  

  1.   Sub ggsmart()
  2.     Dim arr()
  3.     arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) '将1到10十个自然数赋给数组arr
  4.     [a1].Resize(1, 10) = arr '将数组的值输入单元格
  5.   End Sub
  6.   
复制代码

  这里使用Array函数将1到10的自然数赋给数组arr这里,我就不上传附件了,大家将代码复制到模块里查看效果。
  

  提醒一点:使用Array创建的数组索引号默认从0开始,当然,如果已经用“OPTION BASE 1”语句指定了的另当别论。
  


  需要提醒的是:如果赋的值是文本,那需要用英文引号引起来,如:
  

  1.   arr = Array("张祝", "徐国军", "陈茜", "王欢", "许松", "张小海", "陈飞", "张明元", "徐国东", "张款")
  2.   
复制代码

  2、使用Split创建数组
  Split的作用是把一个文本,根据指定的分隔符,建立一个数组。感觉就有点像我们基础操作中的“分列”。不同的是“分列”操作是将一个单元格的文本按指定的分隔符分开,存放在同行的多个单元格里,而Split的作用是将一个文本(也可以是存放在单元格里的)按指定的分隔符分开,存放在一个数组变量里。
  如果你使用过“分列”,再来看这个,就简单多了。
  还是上面的那串姓名“张祝,徐国军,陈茜,王欢,许松,张小海,陈飞,张明元,徐国东,张款”,只是这时,这些姓名是一个完整的字符串,此时,如果我们想把这些姓号按逗号(,)分开,存放在数组arr里,则代码为:
  

  1.   arr = Split("张祝,徐国军,陈茜,王欢,许松,张小海,陈飞,张明元,徐国东,张款", ",")
  2.   
复制代码

  你可以用上面的方式将生成的数组输入到单元格查看效果。当然,也可以在立即窗口里查看,这样就更方便了。
  特别强调一点:用Split把文本转换成数组,索引号总是从0开始。不管你是否使用了Option Base语句,这点和Array不同。
  3、通过Range创建数组
  (1)循环给单元格赋值
  比如想把A1:A100单元格的值给数组arr,则代码为:
  

  1.   Sub a()
  2.     Dim arr(1 To 100)
  3.       For i = 1 To 100
  4.          arr(i) = Cells(i, 1)
  5.       Next
  6.   End Sub
  7.   
复制代码

  (2)直接等于单元格区域
  这个很简单,直接数组名等于单元格区域就可以了。
  比如想把A1:A100单元格的值给数组arr,代码还可以简单写为:
  

  1.   arr = [a1:a100]
  2.   
复制代码

  好了,很简单,我就不再多说,大家自己去练习吧。
  两种方法哪种的效率高显而易见吧?呵呵……有兴趣,可以自己去比较一下。
  五、UBount和LBound函数
  我们定义数组时,我们可以指定数组的起始索引号不为0,而为1或其他的任意数。比如Dim arr(5 to 6)定义的这个数组起始索引号为5,共有两个元素。
  那么,对于一个已经定义了的数组,我们想知道它的最大索引号(上界)和最小索引号(下界)是多少,怎么办呢?别慌,用UBound和LBound两个函数就可以了。
  如,要想知道数组arr的上界是多少,则:UBound(arr)
  要想知道数组arr的下界是多少,则:LBound(arr)
  想知道数组有多少个元素,则:UBound(arr)- LBound(arr)+1
  如:
  

  1.   Sub ggsmart()
  2.    Dim arr(10 To 50)
  3.    MsgBox "数组的上标是:" & UBound(arr) & Chr(13) _
  4.           & "数组的下标是:" & LBound(arr) & Chr(13) _
  5.           & "数组的元素个数是:" & UBound(arr) - LBound(arr) + 1
  6.   End Sub
  7.   
复制代码

  如果是一个二维数组,想知道它的上界是多少,就得指定维数,看一看下面的例子:
  

  1.   Sub ggmsart()
  2.     Dim arr(1 To 10, 1 To 100)
  3.     MsgBox "第一维的上界是:" & UBound(arr, 1) & Chr(13) & _
  4.            "第二维的上界是:" & UBound(arr, 2)
  5.   End Sub
  6.   
复制代码

  六、Join函数
  Join的作用和Split的作用相反。Split是将字符按指定字符转为数组,Join是将数组以指定字符分开,连成一个字符串。如:
  

  1.   Sub ggsmart()
  2.     Dim arr(1 To 10), i As Integer, txt As String
  3.     For i = 1 To 10 '给数组赋值
  4.       arr(i) = i
  5.     Next i
  6.     txt = Join(arr, ",") '将arr数组的元素连成字符串,用逗号作分隔符
  7.     MsgBox txt
  8.   End Sub
  9.   
复制代码

  Join的第二参数,即分隔符可以不指定,在不指定时,默认为以空格作分隔符。
  七、将数组输入单元格区域
  1、使用循环输入
  如将存储了1到60000的数的数组写入A列,则:
  

  1.   Sub test1()
  2.    '创建数组,并赋值
  3.    Dim arr(1 To 60000), i As Long
  4.    For i = 1 To 60000
  5.        arr(i) = i
  6.    Next i
  7.    '将数组的值写入单元格(A列)
  8.    [a1:a65536].Clear '清除原有数据
  9.    Dim irow As Long
  10.    Dim startime As Double
  11.    startime = Timer
  12.    For irow = 1 To 60000
  13.        Cells(irow, 1) = arr(irow)
  14.    Next irow
  15.    MsgBox "数组写入共用了" & Timer - startime & "秒!"
  16.   End Sub
  17.   
复制代码

  以上程序是使用循环,将数组里的元素逐个写入单元格,为了对比不同的输入方式的效率,我加入了计算时间的代码,有了前面的基础,相信读上面的代码对大家来说,不会太困难。
  2、批量写入
  实际上用一条语句就可以将数的内容写入单元格区域中,即:单元格区域=数组名
  还是上面的例子,我们可改为:
  

  1.   Sub test2()
  2.    '创建数组,并赋值
  3.    Dim arr(1 To 60000), i As Long
  4.    For i = 1 To 60000
  5.        arr(i) = i
  6.    Next i
  7.    '将数组的值写入单元格(A列)
  8.    [a1:a65536].Clear '清除原有数据
  9.    Dim startime As Double
  10.    startime = Timer
  11.    [a1:a60000] = Application.WorksheetFunction.Transpose(arr)
  12.    MsgBox "数组写入共用了" & Timer - startime & "秒!"
  13.   End Sub
  14.   
复制代码

  这里,我们用“[a1:a60000] = Application.WorksheetFunction.Transpose(arr)”代替了上面代码For循环,在我的电脑上,程序的效率就提高了25倍以上。 <ignore_js_op> 数组写入单元格.rar (8.04 KB, 下载次数: 2674) 所以在大批量的数据需要写入时,我建议尽量不要用循环的方式写入。
  这种批量写入的方式在上面的例子里其实我已经用到了,相信大家不会陌生。
  这里,我再补充两点我个人在学习过程中的心得:
  (1)一维数组写入单元格区域时,这个单元格必须是水平方向的,也就是一个一行多列的单元格区域,如果想写入垂直区域,必须使用工作表的Transpose函数转换一下;
  (2)和工作表的多单元格数组公式一样,数组写入单元格时,单元格的区域必须和数组的大小一致。