2014-11-19 7 views
0

У меня есть макрос, который работает хорошо. Но проблема у меня есть с InputBox. Макрос работает с ошибками, когда пользователь нажимает CANCEL или X из InputBox. Пользователь может ввести до 15 значений для поиска и ввести 0 для начала поиска. Я хочу сделать его более надежным, поэтому я не столкнусь с этими ошибками. Пожалуйста помоги.VBA Excel inputbox ошибка времени выполнения 13 несоответствие типа

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 

ответ

1

Определить строку переменной Dim LSearchString as String и присвоить ему значение, возвращаемое вашей InputBox: LSearchString = InputBox(...). Теперь вы можете проверить ввод на числовой: If IsNumeric(LSearchString) и обработать неправильный ввод. В случае успеха вы можете перейти к преобразованию в целое число: LSearchValue = CInt(LSearchString). Вы должны знать, что CInt() всегда возвращает 0, если аргумент не является числом.

Следующий фрагмент кода представляет собой измененную выписку из вашего кода. Неверные входы просто игнорируются.

UPDATE

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 
+0

привет спасибо за это. можете ли вы поместить его в код, пожалуйста, я действительно его обработаю – kay

+0

вы можете поместить это в скрипт? пытался его и не работал для меня – kay

+0

@kay: Это может быть что-то вроде этого (см. обновление). Вы должны были заменить часть вашего кода на поле ввода. – Fratyx

1

Если вы хотите, чтобы обращаться с Отменить, использовать промежуточный Variant,

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 
+0

Pefect, который хорошо работает на моей кнопке отмены .. отлично. Если пользователь X отключен, я сталкиваюсь с той же ошибкой. – kay

+0

этот код работает, я пытался сделать выход, когда пользователь нажимает кнопку отмены, вместо того, чтобы поле ввода снова появлялось – kay

Смежные вопросы