Excel 防御性地使用application.inputbox()

Excel 防御性地使用application.inputbox(),excel,vba,Excel,Vba,我有以下几点: 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,

我有以下几点:

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

如果用户点击cancel,则
Set colRange=
将失败,因为它希望将对象分配给该变量。我是否必须使用错误结构来防御此错误,还是有更优雅的方法?

是的,您必须

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

是的,你必须离开

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

是的,你必须离开

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

是的,你必须离开

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

在我看来,分配对象和值的不同语法是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与预期对象匹配,则始终重新运行给定对象;如果typename与预期对象不匹配,则始终重新运行给定对象。

分配对象和值的不同语法是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与预期对象匹配,则始终重新运行给定对象;如果typename与预期对象不匹配,则始终重新运行给定对象。

分配对象和值的不同语法是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与预期对象匹配,则始终重新运行给定对象;如果typename与预期对象不匹配,则始终重新运行给定对象。

分配对象和值的不同语法是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与期望值匹配,则始终重新运行给定对象;如果不匹配,则重新运行任何对象。

确保此对象存在。@Santosh-道歉-一段稍微令人困惑的代码-
fTableRange
是使用表单范围声明的userform中的私有字段确保此对象
fTableRange
存在。@Santosh-道歉-稍微让人困惑的一段代码-
fTableRange
是用表单范围声明的userform中的私有字段确保此对象
fTableRange
存在。@Santosh-道歉-稍微让人困惑的一段代码-
fTableRange
是表单中的私有字段使用窗体范围声明的userform请确保此对象
fTableRange
存在。@Santosh-道歉-一段稍微令人困惑的代码-
fTableRange
是使用窗体范围声明的userform中的私有字段