全民一起VBA提高篇-第十五回

传递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"

以上两个表达方式效果相同。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容