第十五回 传递Range提升自定义函数,巧用属性分辨公式型内容
1. 如何确定一个range对象的行列循环i与j?
1. first way(**重点**)
'使用range.row规则来直接确定一个range对象的行列i与j的循环
for i=range.row to range.row+range.rows.count-1
for j=range.column to range.column+range.columns.count-1
2. second way
'二维数组读取range对象后,使用bound函数来确定二维数组行列i与j的循环
for i=LBound(a, 1) to UBound(a, 1)
for j=LBound(a, 2) to UBound(a, 2)
例如a = Range("A1:F10")
LBound(a, 1)=1; UBound(a, 1)=10
LBound(a, 2)=1; UBound(a, 2)=6
PS:上面有两种方法,适用对象有一定的差异性。
第一种方法常常是用于直接对range对象的操作,后续可以直接根据i,j值对cells(i,j)进行操作。
第二种方法是针对二维数组对象进行的操作,具有一定的局限性。后续操作都是基于数组的,不能直接对cells操作。
例如当range("A3:D6")时,二维数组相当于一个4×4的区域
a = Range("A3:D6")
'此时默认4×4的区域是从1开始的,所以是a(1 to 4,1 to 4).
LBound(a, 1)=1; UBound(a, 1)=4
LBound(a, 2)=1; UBound(a, 2)=4
bound函数相关知识点
Ubound(s):一维数组最大下标
Lbound(s):一维数组最小下标
Dim s(2 to 5,3 to 7)
Ubound(s,1) Ubound(s,2):二维数组第一维5和第二维最大下标7
Ubound(s,1) Ubound(s,2):二维数组第一维5和第二维最大下标7
2.不用i、j双循环,将range中的每个单元格进行逐一运算。
重点:for each 单元格 in range
例如:给一个工作簿中所有worksheet里的range中填充为红色的数据进行汇总
Dim r as range,r1 as range,w as worksheet,s%
'将变量s初始化为0,然后用于逐步累加红色数字
for each w in worksheets
s=0
set r=w.usedrange
for each r1 in r
If r1.Font.Color=vbRed Then
s=s+rl.Value
End If
'将累加结果s写入本工作表单元格内
w. Cel1s(1,1)=s
Next w
3.range为一个单元格时,判断是否为公式?
Range.hasFormula 属性
当该Range为一个单元格时,若是公式则返回True,否则返回False。
Range.Formula 属性
当该Range为一个单元格时,若是公式则返回公式文本(例如:”=C4“),否则与Value属性一样,返回单元格内容(例如:“25”)。