ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 浅谈Variant型变量及数组变量

浅谈Variant型变量及数组变量

作者:绿色风 分类: 时间:2022-08-18 浏览:128
楼主
水星钓鱼
如果在变量的声明中没有说明数据类型,则变量的缺省数据类型为Variant。
举例如下:
  1. Sub a()
  2. Dim 变量1 As Integer, 变量2
  3. Dim 变量3 As Variant
  4. Dim 变量4
  5. End Sub

其中变量2,变量3,变量4都是Variant数据类型。所以如果要声明一个变量为Variant的数据类型,只需Dim 加 变量名即可,无须As Variant。
一个Variant类型的变量可以存储任何类型的数据
举例如下:
  1. Sub a()
  2. Dim 变量1 As Integer
  3. Dim 变量2 As String
  4. Dim 变量3
  5. 变量1 = 2
  6. 变量2 = "文本"
  7. 变量3 = "文本"
  8. 变量3 = 2
  9. '下面这句赋值语句将报错,因为 _
  10. 数值型变量无法存储字符型变量
  11. 变量1 = "文本"
  12. End Sub


对Variant类型的变量除了可以像其它标准数据类型一样操作外,Variant类型的变量还可以包含三个特定的值:Empty,Null,Error。其中Variant类型的变量在还未赋值前具有Empty值。如上例的变量3,在还未赋值前具有Empty值,可以通过Isempty函数来测试。这里不再详细阐述。
2楼
水星钓鱼
首先要说明的是,数组不是一种数据类型。简单的说就是一组数,这组数有个名称,就是数组名,其中的每个数据都是数组的元素。比如全所员工的姓名,姓名可以看做是数组名,每个员工的姓名是元素,而姓名一般是字符,没有人用数字做姓名,所以每个员工的姓名的数据类型是String。专业点说,数组是一种可包含多个元素的数据结构,数组中的每个元素类型相同,且按一定的顺序排列(用下标表示元素的顺序)。
举例如下:
  1. Sub a()
  2. Dim 姓名(9) As String
  3. 姓名(0) = "张朝阳"
  4. 姓名(9) = "马云"
  5. End Sub

如上所示,定义了一个数组变量。姓名是变量名,也是数组名,用来存储10个人的姓名。其中As String表示这个数组中的所有元素的数据类型都是字符型。第一个人的姓名是张朝阳,第10个人的姓名是马云。为什么第一个人的姓名不是姓名(1),而是姓名(0)呢,因为数组的元素的默认下限是从0开始的,当然这个下限可以改变。这里将不进行详细阐述。
       如何区分数组变量与变量,数组变量是变量名+()。任何一个变量如果声明为变量名+()的形式,则这个变量就成了数组变量,可以用来存储一组数据。
如:Dim arr() As Integer,则arr就是一个数组变量。
       数组中的每个元素的数据类型都一样,当然也可以都是Variant类型。这时,数组的每个元素都可以包含不同类型的数据。反过来,因为一个Variant类型的变量可以用来存储任意数据,所以它也可以用来存储数组。
       举例如下:
  1. Sub a()
  2. Dim arr1
  3. Dim arr2(9)
  4. Dim i
  5. For i = 0 To 9
  6.     arr2(i) = i
  7. Next
  8. arr1 = arr2
  9. For i = 0 To 9
  10.     Debug.Print arr1(i)
  11. Next
  12. End Sub

从以上可以看出,arr2是一个元素的数据类型为Varaint的数组变量,它有10个元素。而arr1则是一个数据类型为Variant的非数组变量。当把一个数组变量赋值给arr1后(arr1=arr2),arr1可以像数组变量一样操作,即通过下标来引用它的元素(在这里就是Debug.Print arr1(i))。虽然一个包含数组的Variant类型的变量在概念上与元素的类型为Variant的数组变量是不一样的。但是可以用同样的方式来获得数组的元素,即变量名+(下标)的格式来引用数组的元素。
3楼
水星钓鱼
不是只有变量才有数据类型,当把一个值赋值给一个属性的时候,这个属性有个数据类型,函数的参数,函数的返回值都有数据类型,只有类型匹配的数据之间才能相互赋值。比如Array函数,它返回的是一个Variant类型的数据,只不过是它是一个包含了数组的Varaint。既可以用上面所说的变量名加下标的形式来引用。确却的说默认情况下Array函数返回的是一个Variant类型的数据,这个数据是一个一维的下限为0的数组。
举例如下:
  1. Sub a()
  2. Dim arr
  3. arr = Array(1, "我和你", False, True)
  4. Debug.Print LBound(arr), UBound(arr), arr(2)
  5. End Sub
也许会有人有这样的疑问,既然Variant类型的数据可以容纳数组,而我们又可以预知array函数返回的数组的维数和下限,为什么不可以直接将Array函数返回的结果整体赋值给数组呢?
如下所示
  1. Sub a()
  2. Dim arr(0 To 2)
  3. arr = Array("a", "b", "c")
  4. End Sub
但编译时会报错“不能给数组赋值“,事实上对数组变量的元素赋值,只能逐个赋值,不能整体赋值。
        在EXCEL中,最常处理的对象就是Range对象(单元格区域)。当Range对象包含不止一个单元格时,Range.Value返回的是一个Varaint类型的数据,它是一个以行号为第一维,列号为第二维的二维数组,下限都是1。
        前面说过只要数据类型是一样的,就可以相互赋值,因为Range.Value返回的是Variant类型,而Array返回的也是Variant类型,虽然一个是二维的数组,一个是一维的数组,但只要它们不是数组变量就可以相互赋值。所以同理,凡是结果是Variant类型的数组,都可以整体赋值。当然Varaint类型的数据可以被任意类型的数据赋值。
举例如下

  1. Sub a()
  2. Range("a1:c1").Value = Array(1, 2, 3)
  3. Range("e1:g4").Value = Array(1, 2, 3)
  4. 'split函数返回的是字符串类型的数组,因为Range.Value _
  5. 属性的数据类型是Variant,所以可以给它赋值。
  6. Range("a5:f5").Value = Split("1 2 3 4 5 6")
  7. End Sub
怎样知道属性,变量等的数据类型呢?用Vartype函数,具体用法看帮助文件。
4楼
LOGO
学习了,留下脚印备查。
5楼
wqfzqgk
VBA中的定义变量可能是最能适应的,尽量去掉这些东西,和以后的版本不兼容,养成良好的习惯

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap