在"with"块内调用一个函数?

Hel*_*uys 4 excel vba excel-vba

是否可以在"with"块内调用函数?我一直收到错误"无效或无条件参考".我如何在"with"语句中引用父对象?谢谢!

Sub Test()
    Set wb = Workbooks.Open(“C:\Book1.xls", True, True)

    With wb.Worksheets("Sheet1")
        lRow = LastRow()
        msgbox(lRow)
    End With

    With wb.Worksheets("Sheet2")
        lRow = LastRow()
        msgbox(lRow)
    End With

    wb.Close False
End Sub

Function LastRow()
    LastRow =.Cells.Find(What:="*", _
            After:=Range("A1"), _
            LookAt:=xlPart, _
            LookIn:=xlFormulas, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlPrevious, _
            MatchCase:=False).Row
End Function
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 6

With块可容纳的对象引用; 该对象引用的作用域是With块所在的过程,生成With并死亡和埋藏End With:With块变量不会突然变为全局/瞬态.编译器有一个更加语法的代码视图,你要求的是需要只能在运行时存在的上下文.

但是,该函数可以轻松地从参数中获取该上下文:

'...

With wb.Worksheets("Sheet1")
    lRow = LastRow(.Cells)
    MsgBox lRow
End With

'...
Run Code Online (Sandbox Code Playgroud)

避免在调用Function(或Property Get)时使用VB6/VBA中的括号而不将其返回值捕获到局部变量中,或者在调用Sub过程时使用.这不是编码风格的问题,语法上多余的括号会改变代码的语义,并且不可避免地会导致问题(在编译和运行时).

我添加了一个显式访问修饰符和一个显式返回类型,source参数和一些验证:

Private Function LastRow(ByVal source As Range) As Long

    Dim result As Range
    Set result = source.Find(What:="*", _
                             After:=source.Range("A1"), _
                             LookAt:=xlPart, _
                             LookIn:=xlFormulas, _
                             SearchOrder:=xlByRows, _
                             SearchDirection:=xlPrevious, _
                             MatchCase:=False)

    If Not result Is Nothing Then
        LastRow = result.Row
    Else
        'source is empty
        LastRow = -1
    End If

End Function
Run Code Online (Sandbox Code Playgroud)

Range.FindNothing当它找不到它想要的东西时返回.在这种情况下,给定一个空source,.Row将被调用 Nothing,这将在您的代码中抛出运行时错误91:您永远不能假设Range.Find将返回有效的对象引用;-)

After:=Range("A1")不一定是在同一张纸上如source.Range("A1"),如果该功能是写在一个标准的代码模块(.BAS) -不合格的,Range将是一个隐式引用[_Global].Range,一个返回参考隐藏应用程序范围模块上的公共属性对ActiveSheet.在这种情况下,这不是什么大问题,但在其他情况下,使用Excel对象模型中的其他函数,使用一个工作表限定方法,并使用另一个工作表中的范围进行参数化,可能意味着抛出一个神秘的运行时错误1004 .