使用application.inputbox()防守

我有以下几点:

Private Sub cmdColumnLetter_Click() Dim colRange As Range Set colRange = Excel.Application.InputBox( _ Prompt:="Please Select Any Cell In ""Splitter"" Column", _ Title:="Column", _ Default:=fTableRange.Columns(1).Column, Type:=8) fColNumber = colRange.Column TxBoxColumnNum = fColNumber End Sub 

如果用户点击取消,则Set colRange =失败,因为它正在寻找一个对象给这个variables。 我是否必须使用On Error结构来防范这个错误,还是有一个更优雅的方法?

是的,你将不得不去OERN

 Sub Test() Dim colRange As Range Dim fColNumber As Long, TxBoxColumnNum As Long On Error Resume Next Set colRange = Excel.Application.InputBox( _ Prompt:="Please Select Any Cell In ""Splitter"" Column", _ Title:="Column", Default:=fTableRange.Columns(1).Column, Type:=8) On Error GoTo 0 If colRange Is Nothing Then Exit Sub fColNumber = colRange.Column TxBoxColumnNum = fColNumber End Sub 

分配对象和值的不同语法是IMO,VBA的一个缺点。

因此,返回对象或值的InputBox函数会导致错误。

但是,传递语法的函数参数是相同的。

探索这个,我的目的和替代解决scheme,确实不是更好的error handling解决scheme:

 Function SetObject(v, ByVal ExpectedTypeName As String) As Object If TypeName(v) = ExpectedTypeName Then Set SetObject = v End Function Private Sub cmdColumnLetter_Click() Dim colRange As Range Set colRange = SetObject(Excel.Application.InputBox("input", Type:=8), "Range") If Not colRange Is Nothing Then Debug.Print "..." End If End Sub 

SetObject接受一个对象或一个值,但如果typename匹配预期的对象,则总是回退给定的对象,或者如果不匹配则返回Nothing