2013-10-26 12 views
6

Ich habe das folgende Stück Code:Griff Aufhebung der InputBox auszuwählen Bereich

dim selectRange as Range 
Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8) 

Wenn ein Benutzer die InputBox Aufforderung Abbrechen wählt, gibt sie error of Object not set.

Ich habe versucht, eine Variant Variablentyp zu verwenden, aber ich kann nicht damit umgehen. Im Fall des Abbrechens gibt es False zurück, während im Falle der Auswahl eines Bereichs der Bereich von InputBox zurückgegeben wird.

Wie kann ich diesen Fehler vermeiden?

+0

Das Problem ist nicht In diesen beiden Codezeilen ist es wahrscheinlich in den Zeilen, die ihnen folgen. Zeig uns diese Zeilen. – RBarryYoung

Antwort

4

Dies ist ein Problem bei der Auswahl eines Bereichs mit einer Eingabebox. Excel gibt einen Fehler zurück, bevor der Bereich zurückgegeben wird, und dieser Fehler wird beim Drücken von Abbrechen angezeigt.

Sie sollten daher diesen Fehler aktiv behandeln. Wenn Sie wollen nichts passieren, wenn Sie die Taste abbrechen, können Sie einfach den Code wie folgt verwenden:

Sub SetRange() 
    Dim selectRange As Range 

    On Error Resume Next 
     Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8) 
    Err.Clear 
    On Error GoTo 0 
End Sub 
+0

Danke dafür, ich denke, es ist stinkig, Fehler auf vbcancel so zu behandeln, aber es gibt keine andere Wahl. – Raystafarian

1

Ich habe festgestellt, dass für die „erforderliche Objekt“ Überprüfung Fehler, die Sie erwähnt ist eine Möglichkeit der Handhabung ein Abbruch

On Error Resume Next 
dim selectRange as Range 
' InputBox will prevent invalid ranges from being submitted when set to Type:=8. 
Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8) 
' Check for cancel: "Object required". 
If Err.Number = 424 Then 
    ' Cancel. 
    Exit Sub 
End If 
On Error GoTo 0 
4

Ich bin auf die Party hier spät, aber das war der einzige Ort, wo ich die warum erklärt finden konnte ich Probleme nur für nichts meine variable Kontrolle aufwies, wurde. Wie in der akzeptierten Antwort erklärt, wird vbCancel für ein Bereichsobjekt nicht wie ein Zeichenfolgenobjekt behandelt. Der Fehler muss mit einem Fehlerhandler abgefangen werden.

I hasse Fehlerhandler. So getrennt ich es seine eigene Funktion

Private Function GetUserInputRange() As Range 
    'This is segregated because of how excel handles cancelling a range input 
    Dim userAnswer As Range 
    On Error GoTo inputerror 
    Set userAnswer = Application.InputBox("Please select a single column to parse", "Column Parser", Type:=8) 
    Set GetUserInputRange = userAnswer 
    Exit Function 
inputerror: 
    Set GetUserInputRange = Nothing 
End Function 

Jetzt in meinem Hauptunter kann ich

dim someRange as range 
set someRange = GetUserInputRange 
if someRange is Nothing Then Exit Sub 

Wie auch immer das ist nicht die gleiche wie die akzeptierte Antwort, weil es dem Benutzer erlaubt nur handhaben diesen Fehler mit ein spezifischer Fehlerhandler und muss nicht resume next oder den Rest der Prozedur auf die gleiche Weise behandelt haben. Falls jemand hier landet wie ich.

4

Während diese Frage ein wenig älter ist, möchte ich immer noch die richtige Weise zeigen, es ohne Fehler zu tun. Sie können es entweder über Funktion oder mit einem Sub tun.

Ihr Hauptverfahren ist so etwas:

Sub test() 
    Dim MyRange As Range 

    testSub Application.InputBox("dada", , , , , , , 8), MyRange 'doing via Sub 
    Set MyRange = testFunc(Application.InputBox("dada", , , , , , , 8)) ' doing via function 

    If MyRange Is Nothing Then 
    Debug.Print "The InputBox has been canceled." 
    Else 
    Debug.Print "The range " & MyRange.Address & " was selected." 
    End If 
End Sub 

die Sub -Wege (lustig) wäre:

Sub testSub(ByVal a As Variant, ByRef b As Range) 
    If TypeOf a Is Range Then Set b = a 
End Sub 

Und die Funktion aussehen würde:

Function testFunc(ByVal a As Variant) As Range 
    If TypeOf a Is Range Then Set testFunc = a 
End Function 

Jetzt einfach u so wie Sie möchten und löschen Sie die nicht verwendete Zeile.

Wenn Sie einen Sub oder eine Funktion aufrufen, müssen Sie den Parameter Set nicht eingeben. Es ist jedoch egal, ob InputBox ein Objekt zurückgibt oder nicht. Alles, was Sie tun müssen, ist zu überprüfen, ob der Parameter das Objekt ist, das Sie wollen oder nicht, und dann entsprechend zu handeln.

EDIT

Noch eine kluge Art und Weise das gleiche Verhalten mit einer Sammlung wie folgt verwendet:

Sub test() 
    Dim MyRange As Range 
    Dim MyCol As New Collection 

    MyCol.Add Application.InputBox("dada", , , , , , , 8) 
    If TypeOf MyCol(1) Is Range Then Set MyRange = MyCol(1) 
    Set MyCol = New Collection 

    If MyRange Is Nothing Then 
    Debug.Print "The inputbox has been canceled" 
    Else 
    Debug.Print "the range " & MyRange.Address & " was selected" 
    End If 
End Sub 

Wenn Sie noch Fragen haben, fragen Sie einfach;)