VBA学习笔记4:再说数组赋值
之前以为自己把数据的概念搞清楚了,在工作中多次涉及到相关知识点,但还是有一次出了问题。在给数组变量赋值时,发现直接引用单元格的方式行不通了,提示“类型不匹配”。我用了如下语句:
Dim sht()
sht = Worksheets(1).Range("B4:B6")
在《VBA学习笔记2:数组的使用》中,我曾总结:直接引用区域也是创建数组的办法,因为range的默认方法是value,所以直接使用arr=range("A1:B6")这样的语句就能为数组赋值了。
但是用sht = Worksheets(1).Range("B4:B6")
却出现错误。使用Debug检查发现一些问题。
首先用Debug.Print TypeName(Worksheets(1).Range("B4:B6"))
检查了数据类型,返回“range”,而dim sht()时,sht的默认属性是variant,是否是这个原因造成无法赋值呢?
但是当我把Worksheets(1)去掉时,这个语句居然奏效了,虽然Debug.Print TypeName(Range("B4:B6"))
出来的还是“range”类型,但sht = Range("B4:B6")的赋值确实是有效的。
那如果我要赋值的数据不是当前工作表呢?试着把Dim sht()去掉,也就是说赋值前不声明数组变量,sht = Worksheets(1).Range("B4:B6")
居然也奏效了,Debug.Print TypeName(Worksheets(1).Range("B4:B6"))
依然返回“range“。
再试一下,如果直接声明Dim sht,或Dim sht as variant,则后面的语句无论加不加worksheets都能生效。
这让人感觉有点混乱,稍微一个不小心就会出错。在微软官方文档并没有找到相关说明。
总结了一下引用区域对数组赋值的两个规则:
1.range对象可以为未声明变量或variant变量(Dim x)赋值,其值会转换为variant类型。
2.声明数组变量后再赋值,只适合当前工作表,不能引用range的父对象。
评论
发表评论
Say something