传递Range提升自定义函数 巧用属性分辨公式型内容
主要内容:
一、使用UBound,LBound。代替固定行列数
举例1:
dim s(5).UBound(s)=5,LBound(s)=0
dim s(2 to 5,3 to 7).UBouund(s,1)=5,UBound(s,2)=7;LBund(s,1)=2
二、结构化程序互相调用
举例2:
Sub 结构化函数调用()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Cells(1, 1) = redCount(ws.UsedRange)
Next ws
End Sub
Function redCount(r As Range)
Dim a As Long, r1 As Range
For Each r1 In r
If r1.Font.Color = vbRed Then
a = a + r1.Value
End If
Next r1
redCount = a
End Function
提示1:定义一个fuction redCount的子函数,主程序调用函数。这样结构清晰。
提示2:主程序接收一个Range类型的变作为参数,然后扫描每一个单元格,将其中红色数字汇总返回。
举例:3
Function mySum(r As Range)
Dim a&, b&, c&, d&
d = 0
For a = r.Row To r.Row + r.Rows.Count - 1
c = 1
For b = r.Column To r.Column + r.Columns.Count - 1
c = c * Cells(a, b)
Next b
d = d + c
Next a
mySum = d
End Function
提示1:用&代替aslong ,用符号声明变量,见第三回
提示2:求和的变量初始化为0,但求乘积的变量初始化要为1.
三、Range对象的转化文本属性
1.Range.hasFormula属性
当该Range为一个单元格时,若是公式则返回True,否则返回False
2.Range.Formula属性
当该Range为一个单元格时,若是公式则返回公式文本,否则与Value属性一样,返回单元格的内容。
3.属性应用,仅粘贴格式
举例4:
Sub 仅粘贴格式()
Dim w As Worksheet, r As Range
For Each w In Worksheets
For Each r In w.UsedRange
r.Value = r.Value
Next r
Next w
举例5:
End Sub
Sub 仅粘贴格式()
Dim w As Worksheet
For Each w In Worksheets
w.UsedRange.Value = w.UsedRange.Value
Next w
End Sub
提示1:举例5为举例4的简化版本,该程序可以作为固定的子程序,用来将最终结果转化为仅保留数值或文本。
提示2:Formula和Value属性都可以将单元格的内容设置为公式。
cells(2,3).Formula="=25*2"
cells(2,3).Value="'Sheet3'!C2+10"
以上两个表达方式效果相同。