【原创】VBA学习笔记(311)VBA的range() 是特例可以当做变量/对象,但range()如果是obejct不能被直接当成数组

1 区分好VBA中的不同数据类型:

1.1 VBA对象,Excel--application对象,变量,数组

  • VBA中vb的对象:
  1. object
  2. fso
  3. scripting.dictionary
  • VBA中A(application=excel)的对象:
  1. cells() 
  2. range()   
  3. sheet() 
  4. workbook() 等等
  • VBA中的数据结构: 
  1. 常量
  2. 变量
  3. 数组

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
发布了370 篇原创文章 · 获赞 45 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/103735523