Sub 单元格区域转化为数组()
Dim f As Variant f = ActiveSheet.Range('a1:c4') Debug.Print f(1, 1) End Sub 在这一段代码里,如果将“dim f as variant”,改为“dim f() as variant”,提示“类型不匹配”的错误 Sub 动态数组演示() Dim myArr() As String ReDim myArr(0) myArr(0) = '一车间' ReDim Preserve myArr(2) myArr(1) = '二车间' myArr(2) = '三车间' Debug.Print myArr(0), myArr(2) End Sub 在这一段代码里,如果将“Dim myArr() As String'改为“Dim myArr As String”,提示“缺少数组”的错误 我的困惑在于,定义数组时,数组名后面到底什么时候需要加括号,加不加括号有什么区别?或是说什么情况下需要加括号,什么情况下不需要加括号? ![]() 2楼 wpxxsyzx LV16 2014-10-8 17:21
简单的说,执行f = ActiveSheet.Range('a1:c4')之前,f就是一个变体变量,执行之后成为一个数组,不能将单元格区域直接赋值给一个数组,所以,你最后的问题也就不存在了
3楼 liu-aguang LV6 2014-10-8 17:58
ActiveSheet.Range('a1:c4')
这个区域它被组织为一个Variant变量下包含数组(当然还有其它),所以语句: Dim f As Variant f = ActiveSheet.Range('a1:c4') 将之赋与一个Variant变量(f),则转化为变量f包含一个数组. 而语句: Dim f() As Variant f = ActiveSheet.Range('a1:c4') 是把一个Variant变量赋与一个数组,所以提示'类型不匹配' 但可以: Dim f() As Variant f = ActiveSheet.Range('a1:c4').value 这样明确指定区域的值,它本身就是一个数组,所以可以直接传递给Variant数组. 4楼 liu-aguang LV6 2014-10-8 18:09
本帖最后由 liu-aguang 于 2014-10-8 18:10 编辑
如果在Range前面不加限定则下面语句都可以正常执行: dim f,k() f=range('a1:c4') f=range('a1:c4').value k=range('a1:c4') k=range('a1:c4').value 原因是Range的默认属性是Value,它是一个数组. 上面前两句与后两句其意义是不同: 前两句是将数组赋与一个Variant变量,让其包含一个数组. 后两句是将一个数组整体传递给另一个数组. 5楼 香川群子 LV7 2014-10-8 20:23
简单说,是这样子: 一、在VBA中自己定义数组时,需要用() 如: Dim arr(1 To 10) 【必须使用常量】 或 ReDim arr(1 To m) 【可以使用变量、且可以ReDim改变最后一维的大小】 注意,这样的数组变量不能用 arr=Range的方式赋值。(两者类型不同、后者是Variant类型变量) 教条的定义数组方式为: Dim arr() ReDim arr(1 To 5) 呵呵,之前的Dim应该是多余的。 ………… 二、Dim arr 或 Dim arr as Variant 此时,可以把工作表Range区域直接赋值给arr得到一个Variant类型的二维数组。 这里,Variant是变量类型,而二维数组是其结果。实际上不能认为这里的arr是一个数组类型的变量。 ……………… 总结: 一、如果你想要把工作表Range区域读入VBA数组变量,那么不允许使用括号,即不能 Dim arr() 二、如果你想在VBA中直接定义数组变量(往往会通过直接循环计算来赋值),那么应该用括号 Dim arr() |
|