Excel VBA (2010) - Ausgabe der Celle einer InputBox Auswahl

Allan Sche Sar

Lt. Commander
Registriert
Jan. 2004
Beiträge
1.891
Ich weiß, dass ich in letzte Zeit viel gefragt habe, aber ihr konntet mir ja auch gut helfen.

Heute habe ich ausprobiert mit einer InputBox eine Spalte abzufangen, die der Nutzer eingibt.
Diese heißt bei mir ganz einfach Auswahl.

Und ist wiefolgt aufgebaut:
Code:
 Set Auswahl = Application.InputBox _
        (prompt:="Auf welche Spalte soll die Formatierung nach durchgeführt werden. Bitte Spalte eingeben oder mit Maus auswählen", Type:=8)

Nun brauche ich daraus die Spalte. Wenn ich nun Auswahl.Column schreibe, dann bekomme ich in der MsgBox eine Zahl geliefert, was ich super finde, aber in nächste Schritt erscheint die Fehlermeldung:
Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen​

Konkret entsteht der Fehler, wenn ich das in einer Range Anweisung verarbeiten möchte:
Code:
Range(Cells(10, Auswahl.Column)).Select

Wie greife ich daher die Auswahl des Benutzers korrekt ab?
 
Zuletzt bearbeitet:
Ich weiß jetzt nicht wie du an den Code kommst; ich bin blöd und frage eine Spalte einfach so als String ab den ich in einen numerische Wert wandele.

Die Idee mit der Maus unter einer InputBox hrumzuwedeln ist mein Ding nicht; wenn ich dann noch eine Adresse würde eintippen müssen - "Auf welche Spalte […]" ist verfänglich wenn ich eben einen Range (!) statt einer Spalte (!) abliefern müsste - wäre mir das maximal unbequem.

Cells(10, Auswahl.Column).Select
…würde übrigens funktionieren. Range umgehe ich wo es geht so lange Cell reicht.
Range(Cells(10, Auswahl.Column), Cells(10, Auswahl.Column)).Select
…funktioniert. Range ist immer «zweidimensional», es will ein Oben-Links und ein Unten-Rechts haben. Würdest du Range(Auswahl.Address).Select benutzen wäre die Address zweidimensional, nur als Hinweis

Code:
Sub FuerPuristen()
'Dim Auswahl As Range
' Set Auswahl = Application.InputBox _
'  (prompt:="Auf welche Spalte soll die Formatierung nach durchgeführt werden. Bitte Spalte eingeben oder mit Maus auswählen", Type:=8)
' Range(Cells(10, Auswahl.Column), Cells(10, Auswahl.Column)).Select
Dim Spalte As Integer
 Spalte = Val(InputBox("Spalte eingeben"))
 If Spalte < 1 Then Spalte = 1
 Cells(10, Spalte).Select
End Sub
Das wäre die Variante für echtes altmodisches Eintippen ;)

CN8
 
Hi erstmal.

Wenn du aus deinem Code einfach eine Spalte auswählen willst dann mit Columns()
Code:
Columns(Auswahl.Column).Select

Das Auswahl-Fenster ermöglicht übrigens auch mehr als eine Spalte zu wählen.
In diesem Fall wird dann nur die kleinste Spalte ausgewählt.

Grüße
Mirakel
 
Damit sieht das ganze natürlich deutlich sauberer aus.
Das bei einer Mehrfachauswahl nur die kleinste Spalte genommen wird habe ich schon gesehen. Ich denke, dass ich das mit einer Fehler-If irgendwie noch abfangen muss, damit der Benutzer dann wieder in die Inputbox Routine geschickt wird, weil die Eingabe nicht eindeutig war.

Aber heute ist mir im Bezug auf die InputBoxen noch ein Problem gekommen. Ich habe folgenden Code:
Code:
Sub Formatierung()

Dim AuswahlFeucht As Object
Dim AuswahlTemp As Object

    'Bedingte Formatierung Feuchtigkeit Anfang'
    Do
        On Error GoTo Überspring_Feuchte
        Set AuswahlFeucht = Application.InputBox _
            (prompt:="Auf welche Spalte soll die Formatierung für die Feuchtigkeit durchgeführt werden." _
                & vbNewLine & "Bitte eine Spalte mit der Maus auswählen!" & vbNewLine & vbNewLine & _
                "Zum Abbrechen dieses Dialogs auf den Abbrechen klicken.", Type:=8)
        
        'Formatierungsanweisungen'        
    Loop
Überspring_Feuchte:

    
    'Bedingte Formatierung Temperatur Anfang'
    Do
        On Error GoTo Überspring_Temp
        Set AuswahlTemp = Application.InputBox _
            (prompt:="Auf welche Spalte soll die Formatierung für die Temperatur durchgeführt werden." _
                & vbNewLine & "Bitte eine Spalte mit der Maus auswählen!" & vbNewLine & vbNewLine & _
                "Zum Abbrechen dieses Dialogs auf den Abbrechen (A1) klicken.", Type:=8)
 
        'Formatierungsanweisungen'
   
    Loop
Überspring_Temp:

In der zweiten Do-Schleife kommt aber ein Fehler, wenn der Benutzer auf Abbrechen klickt. Da funktioniert das GoTo nicht. Als Fehler wird mit immer gesagt: Laufzeitfehler "Objekt erforderlich"

Derzeit muss der Benutzer dann A1 eintragen, damit mit folgender IF-Anweisung die Formatierung übersprungen und die Do-Schleife abgebrochen wird.
Code:
If AuswahlTemp.Column = 1 Then
            GoTo Überspring_Temp
        End If

Woran liegt das, dass das Goto in der zweiten Do nicht funktioniert?
 
Zuletzt bearbeitet:
Weiß nicht nicht weil ich solche Wegsprungaktionen vermeide wie der Teufel das Weihwasser.
«Zu Deutsch (erhobener Zeigefinger) Das macht man nicht, Du, Du, Du!»

Worauf ich aber mal vorher eingehen will: dass sich VBA irgendwie helfen muss wenn ich eine größere Auswahl habe aber auf Zeile und Spalte scharf bin versteht sich von selbst. Also hält es sich an die Position Oben-Links.

Warum das zweite On-Goto nicht tut - ich tippe mal darauf, dass man eine On Errror Goto Null einbaue muss um die Fehlerkontrolle wieder abzuschalten bevor man sie geändert wieder startete.


Jedenfalls schlägt VBA Wellen in deinem Code weil es mit dem Abbrechen nicht hinkommt und den logischen Wert Nothing zurückgibt (den aber verkraftet deine Variable offenbar nicht… schätze ich… glaube ich…). Was man ziehen muss um da eine »leere« Eingebe abzufangen habe ich in ein paar Versuchen nebenbei nicht rausbekommen. Selbst einen Default könnte man ja löschen…
Für mich nimmt so eine Input-Funktion den Charakter eines Schrott-ab-Werk an wenn natives wie Abbrechen sie scheitern lässt. Vielleicht habe ich was in der Syntax übersehen - aber nicht mehr um 20 vor 10 heute Abend.

CN8
 
Dein neues Problem hatte mich jetzt irgendwie gepackt :)

Da ich mich mit Error-Handling nicht so gut auskenne, musste ich auch erstmal rumspielen.
Problematisch ist die doppelte Verwendung von "On Error GoTo".
Mit einem "Err.Clear" oder "On Error GoTo 0" konnte ich das Problem aber auch nicht lösen (Siehe auch hier: http://stackoverflow.com/questions/19609479/vba-handle-cancelling-of-inputbox-to-select-range)

Allgemein nutzt du hier das Error-Handling für eine konkrete Funktion in deinem Makro - dafür ist es nicht wirklich gedacht.
Allerdings, und daher hinkt meine vorherige Aussage ein bisschen, erzeugt diese InputBox immer einen Fehler, den man abfangen muss (hatte cumulonimbus8 ja auch schon bemerkt).

Mein Vorschlag (welcher sicherlich noch geschickter gelöst werden kann):
Code:
Sub Formatierung()

    Dim AuswahlFeucht As Object
    Dim AuswahlTemp As Object
    
  On Error Resume Next

        'Bedingte Formatierung Feuchtigkeit Anfang'
        Do
        Set AuswahlFeucht = Nothing
            
            Set AuswahlFeucht = Application.InputBox _
                (prompt:="Auf welche Spalte soll die Formatierung für die Feuchtigkeit durchgeführt werden." _
                    & vbNewLine & "Bitte eine Spalte mit der Maus auswählen!" & vbNewLine & vbNewLine & _
                    "Zum Abbrechen dieses Dialogs auf den Abbrechen klicken.", Type:=8)
            
            'Formatierungsanweisungen'
        Loop Until AuswahlFeucht Is Nothing

        'Bedingte Formatierung Temperatur Anfang'
        Do

            Set AuswahlTemp = Application.InputBox _
                (prompt:="Auf welche Spalte soll die Formatierung für die Temperatur durchgeführt werden." _
                    & vbNewLine & "Bitte eine Spalte mit der Maus auswählen!" & vbNewLine & vbNewLine & _
                    "Zum Abbrechen dieses Dialogs auf den Abbrechen (A1) klicken.", Type:=8)
     
            'Formatierungsanweisungen'
        Loop Until AuswahlTemp Is Nothing

End Sub

Da es mit GoTo nicht funktioniert, bin ich dann bei "On Error Resume Next" gelandet. Damit wird einfach konsequent jeder Fehler übersprungen. Ob das für deine Formatierungen Problematisch ist, musst du dann testen.

Da die Do-Loop-Schleife dann aber immer weitermacht, muss man Bedingungen setzen:
Code:
Loop Until AuswahlTemp Is Nothing

Das eigentliche Problem hier, stellt sich u.a. dadurch da, dass bei Abbruch der InputBox quasi nichts in die Variable geschrieben wird - nicht mal "leer", "Null" oder "Nothing".
Daher ist es notwendig, direkt nach dem Do, die Variable noch auf einen Wert zu setzen, auf welchen man testen kann - bei mir ist das "Nothing".
Code:
Set AuswahlFeucht = Nothing

Für die Formatierungsanweisungen musst du dann wahrscheinlich auch noch überprüfen, ob die Variable richtig gesetzt ist:
Code:
If AuswahlFeucht Is Not Nothing Then...

viele Grüße
Mirakel
 
Mirakel, deine Version funktioniert natürlich, aber es hat mir dennoch keine Ruhe gelassen.
Ich habe mich weiter mit dem Thema der On Error Befehle beschäftigt.

Es ist nun so, dass pro Sub nur ein On Error Befehl definiert werden kann. Wird mehr als 1 Befehl definiert, kommt es zu einem Fehler.
Ich habe daher mein Problem so gelöst, dass ich die Input- und Formatierungsanweisung in jeweils eine extra Sub gesteckt habe. Dadurch kann ich bei beiden Input-Fenstern eine On Error einbauen und habe das Problem gelant umschifft.

Was mir immer noch nicht klar ist, warum der Tastendruck auf Abbrechen zu einem fatalen Fehler führt.
 
Sollte das Gehirn weit genug zurückreichen kann das nur ein Kollidieren unterschiedlicher Typen sein.

Und, ohne zu probieren, OnError ist nun wahrlich keine Sprungtabelle, und GoTo ist ja auch out.
Ich sehe nicht warum ich OnError nicht ein und wieder ausschalten können sollte (OnError Goto Nul), mehrfach.

CN8
 
Zurück
Oben