1 区分好VBA中的不同数据类型:
1.1 VBA对象,Excel--application对象,变量,数组
- object
- fso
- scripting.dictionary
- VBA中A(application=excel)的对象:
- cells()
- range()
- sheet()
- workbook() 等等
- 常量
- 变量
- 数组
1.2 对象和非对象的区别
- 只有对象才可以用方法,比如 cells().value
- 只有对象才有属性
1.3 特殊对象----怀疑是VBA特殊处理了
- range() 这种对象比较灵活,既是对象,又是数组
- range().value 只有对象才可以这么用
- range() 也可以当数组用,一般来说,直接返回的是二维数组。
2 对象之间的转化
2.1 常用的range对象
- EXCEL的原生对象,range,可以赋值给变量,直接成为(2维)数组
- range().resize()
- cells().resize() 得到的都是range对象
2.2object对象,即使被赋值为range()不能直接当做数组,但是变量倒手后却可以
- 虽然range() 返回的对象,默认可以当二维数组用
- object对象并不是数组
- range() 也可以赋值给其他对象,VBA对象,但对象不是数组,不能当数组用
- 但是可以倒手一次,这个对象赋值给变量了。就可以当数组了
2.3 代码
Sub test801()
Dim c As Object
a = 6
Cells(1, 1).Resize(2, 10) = a
Cells(1, 1).Resize(2, 10).Interior.ColorIndex = 6
Cells(4, 1).Resize(2, 10) = 8
Cells(4, 1).Resize(2, 10).Interior.ColorIndex = 8
'range() 可以直接当数组使用
For Each i In Range("a1:a5")
Debug.Print i
Next
Debug.Print
'变量被EXCEL对象,赋值为数组是没问题的
b = Cells(1, 1).Resize(5, 1)
For i = LBound(b, 1) To UBound(b, 1)
For j = LBound(b, 2) To UBound(b, 2)
Debug.Print b(i, j);
Next
Debug.Print
Next
Debug.Print
Set c = Cells(1, 1).Resize(5, 1)
'会报缺少数组
'Excel的 cells() range() [] selection 都是对象
'For i = LBound(c, 1) To UBound(c, 1)
' For j = LBound(c, 2) To UBound(c, 2)
' Debug.Print c(i, j);
' Next
' Debug.Print
'Next
d = c
'这样可以,变量可以直接被数组,或range对象等,赋值改完为数组
For i = LBound(d, 1) To UBound(d, 1)
For j = LBound(d, 2) To UBound(d, 2)
Debug.Print d(i, j);
Next
Debug.Print
Next
End Sub