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)
阿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 .