VBA Excel输入框运行时错误13类型不匹配

时间:2014-11-19 12:39:50

标签: excel vba input vb6

我有一个运行良好的宏。但我遇到的问题是InputBox。当用户从InputBox中按CANCEL或X 时,宏会遇到错误。 用户最多可以输入15个值进行搜索,输入0表示搜索开始。我想让它更强大,所以我不会遇到这些错误。请帮忙。

Sub FindValues()    
    Dim LSearchRow As Integer
    Dim rw As Integer, cl As Range, LSearchValue As Long, LCopyToRow As Integer
    Dim iHowMany As Integer
    Dim aSearch(15) As Long
    Dim i As Integer

    ' clear the sheets before it runs so to accurate number of funds opend.

    Sheet2.Cells.ClearContents
    Sheets("tier 2").Cells.ClearContents
    Sheets("tier 3").Cells.ClearContents
    Sheets("tier 4").Cells.ClearContents
    Sheets("tier 5").Cells.ClearContents

    On Error GoTo Err_Execute
    FixC
    Sheet2.Cells.Clear
    Sheet1.Select
    iHowMany = 0
    LSearchValue = 99

    'this for the end user to input the required A/C to be searched

    Do While LSearchValue <> 0
        LSearchValue = InputBox("Please enter a value to search for. Enter a zero to indicate finished" & _
    "entry.", "Enter Search value")
        If LSearchValue <> 0 Then
            iHowMany = iHowMany + 1
            If iHowMany > 15 Then
                MsgBox "You are limited to 15 search numbers.", vbOKOnly, "Limit reached"
                iHowMany = 15
                Exit Do
            End If
            aSearch(iHowMany) = LSearchValue
        End If
    Loop

    If iHowMany = 0 Then
        MsgBox "No selections entered.", vbOKOnly + vbCritical, "No Search data"
        Exit Sub
    End If

    LCopyToRow = 2

    For rw = 1 To 1555
        For Each cl In Range("D" & rw & ":M" & rw)
        '------------------------------------------------
            For i = 1 To iHowMany
                Debug.Print cl.Row & vbTab & cl.Column
                LSearchValue = aSearch(i)
                If cl = LSearchValue Then
                    cl.EntireRow.Copy
                    'Destination:=Worksheets("Sheet2")
                    '.Rows(LCopyToRow & ":" & LCopyToRow)
                    Sheets("Sheet2").Select
                    Rows(LCopyToRow & ":" & LCopyToRow).Select
                    'Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
                    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
                       xlNone, SkipBlanks:=False, Transpose:=False
                    'Move counter to next row
                    LCopyToRow = LCopyToRow + 1
                    'Go back to Sheet1 to continue searching
                    Sheets("Sheet1").Select
                End If
            Next i
            'LSearchRow = LSearchRow + 1
        Next cl
    Next rw
    'Position on cell A3
    'Application.CutCopyMode = False
    'Selection.Copy
    Sheets("Sheet2").Select
    Cells.Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

    Application.CutCopyMode = False
    Sheet2.Select
    MsgBox "All matching data has been copied."
Exit Sub

2 个答案:

答案 0 :(得分:1)

定义一个字符串变量Dim LSearchString as String并为其指定InputBox的返回值:LSearchString = InputBox(...)。现在您可以检查输入是否为数字:If IsNumeric(LSearchString)并处理错误的输入。如果成功,您可以继续将其转换为整数:LSearchValue = CInt(LSearchString)。您必须知道,如果参数不是数字,CInt()总是返回0。

以下代码段是代码中的修改后的摘录。 错误的输入只是被忽略了。

<强>更新

Dim LSearchValue As Integer
Dim LSearchString As String

'..........

LSearchValue = 99

Do While True
    LSearchString = InputBox( _
           "Please enter a value to search for. " & _
           "Enter a zero to indicate finished entry", _
           "Enter Search value")

    If IsNumeric(LSearchString) Then
        LSearchValue = CInt(LSearchString)
        If LSearchValue = 0 Then Exit Do

        iHowMany = iHowMany + 1
        If iHowMany > 15 Then
            MsgBox "You are limited to 15 search numbers.", vbOKOnly, "Limit reached"
            iHowMany = 15
            Exit Do
        End If
        aSearch(iHowMany) = LSearchValue
    End If
Loop

答案 1 :(得分:1)

如果您要处理取消,,请使用中间变体

Sub dural()
    Dim v As Variant, LSearchValue As Long
    v = InputBox("Please enter a value to search for. Enter a zero to indicate finished" & "entry.", "Enter Search value")
    If v = "" Then
        MsgBox "I guess you don't want to search"
    Else
        LSearchValue = CLng(v)
        MsgBox "I will search for " & LSearchValue
    End If
End Sub