0

我有以下内容:

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 =失败,因为它正在寻找一个对象分配给这个变量。我是否必须使用 On Error 结构来防御此错误,还是有更优雅的方法?

4

2 回答 2

2

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

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

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

探索这一点,我的目的和替代解决方案,确实不比错误处理解决方案更好:

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不匹配,则始终返回给定的对象。

于 2013-10-11T08:58:20.540 回答
1

是的,你必须 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
于 2013-10-10T15:39:33.667 回答