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的父对象。

评论