Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Konflikt Gültigkeit und Change-Ereignis

    Betrifft: Konflikt Gültigkeit und Change-Ereignis von: Bjoern
    Geschrieben am: 31.08.2003 17:56:55

    Huhu zusammen,

    ich ärgere mich grade seit über einer Stunde über ein an sich simples Problem, für das ich aber partout keine Lösung finde.

    Ich möchte, daß der Cursor nach Eingabe in einem Formularfeld automatisch in ein bestimmtes nächstes Eingabefeld springt. Gleichzeitig sind die Eingabewerte im Ausgangsfeld aber gültigkeitsbegrenzt.

    Die Kombination der integrierten Gültigkeitsprüfung und eines Sprungbefehls à la:

    If Target.Column = 8 And Target.Row = 38 Then
    Cells(Target.Row, 10).Select
    End If

    scheint Excel aber zu überfordern: Bei Eingabe unzulässiger Werte erscheint zwar die vorgesehene Fehlermeldung der Gültigkeitsprüfung und die Zelle wird markiert - gleichzeitig ist der Cursor - bedingt durch den VBA-Befehl - aber trotzdem weitergesprungen! Eine Eingabe im Ausgangsfeld ist dann auch nicht mehr möglich. Der Wert wird zwar zunächst bei der Eingabe im Ausgangsfeld angezeigt, bei Verlassen des aktivierten Folgefelds wird der Wert jedoch in letzteres übertragen - der Fehlerwert im Ausgangsfeld bleibt erhalten.

    Leider läßt sich das Problem auch nicht dadurch beheben, daß für die Ausführung des VBA-Scripts eine weitere Bedingung in Abhängigkeit vom Eingabewert notiert wird, also etwa:

    If Target.Column = 8 And Target.Row = 38 and Cells(38,8) < 32 Then
    Cells(Target.Row, 10).Select
    End If

    Hat jemand eine Lösung???

    Danke für jeden Tipp.

    Viele Grüße

    Björn



      


    Betrifft: AW: Konflikt Gültigkeit und Change-Ereignis von: Nepumuk
    Geschrieben am: 31.08.2003 19:18:14

    Hallo Björn,
    versuch es mal so:
    If Target.Address = "$H$38" And Target.Value < 32 Then Cells(38, 10).Select
    Gruß
    Nepumuk


      


    Betrifft: AW: Konflikt Gültigkeit und Change-Ereignis von: Björn
    Geschrieben am: 31.08.2003 19:38:19

    Huhu Nepumuk,

    einmal mehr herzlichen Dank für den Tipp! Dieses eine Mal klappt er leider allerdings nicht. Das Ergebnis ist dasselbe. Ich denke 'mal, das Phänomen ist ein kleiner Bug in Excel-VBA :-(. Es hängt wohl mit der zeitlichen Reihenfolge zusammen: das Script bezieht sich auf den target.value, der vor der Eingabe in der Zelle stand.
    Mir fällt allerdings kein Workaround ein. Notfalls muß ich auf die Cursor-Steuerung verzichten, die Gültigkeitsprüfung ist leider obligat :-(((. Kann man die Reihenfolge der selektierten Felder nicht noch irgendwie anders steuern - ohne großen Aufwand über Steuerelemente?

    Viele Grüße und nochmals Danke

    Björn


      


    Betrifft: AW: Konflikt Gültigkeit und Change-Ereignis von: Björn
    Geschrieben am: 31.08.2003 19:47:04

    Huhu Nepu,

    es ist doch nicht (ganz) dasselbe. Mit der Gültigkeitsprüfung läßt sich zwar auch Dein Script leider nicht vereinbaren. Aber es läuft ansonsten fehlerfrei, soweit ich sehe, so daß man daraus eine eigene Gültigkeitsprüfung bilden kann - etwa:

    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Address = "$H$38" And Target.Value < 32 Then
    Cells(38, 10).Select
    Else
    MsgBox "Bitte nur Werte zwischen 1 und 31 eingeben"
    Cells(38, 8).Select
    End If
    End Sub
    


    Ich weiß allerdings nicht, ob diese Prüfung so zuverlässig ist, wie die in Excel integrierte...?

    Viele Grüße

    Björn


      


    Betrifft: AW: Konflikt Gültigkeit und Change-Ereignis von: Nepumuk
    Geschrieben am: 31.08.2003 20:15:13

    Hallo Björn,
    die Prüfung ist absolut zuverlässig. Ich würde sie aber etwas anders machen:
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
        If Target.Address = "$H$38" Then
            If Target.Value < 32 And Target.Value > 0 Then
                Cells(38, 10).Select
            Else
                MsgBox "Bitte nur Werte zwischen 1 und 31 eingeben"
                Cells(38, 8).Select
            End If
        End If
    End Sub
    


    Code eingefügt mit: Excel Code Jeanie

    Gruß
    Nepumuk


      


    Betrifft: AW: Konflikt Gültigkeit und Change-Ereignis von: Björn
    Geschrieben am: 31.08.2003 21:12:34

    Huhu Nepu,

    nochmals lieben Dank für Deine Anregung! Tatsächlich war der erste Coding-Versuch suboptimal. Allerdings muß ich noch eine ganze Reihe weiterer Bedingungen einbauen :-(. Inzwischen ist es ein etwas monströses Konstrukt geworden - sicherlich auch teilweise redundant - das zunächst einmal so aussieht:

    If Target.Address = "$H$38" And Target.Value < 32 And Cells(38, 1) = 1 And Cells(38, 8) <> "" Then
    Cells(38, 10).Select
    Else

    If Target.Address = "$H$38" And Target.Value > 31 Then
    MsgBox "Bitte Eingabe korrigieren (Zahl zwischen 1 und 31).", 0 + 64, "Fehlerhafte Eingabe"
    Cells(38, 8).Select
    Cells(38, 8).ClearContents
    End If

    If Target.Address = "$H$38" And Cells(38, 10) <> "" And Target.Value <> "" And Cells(38, 1) = 0 Then
    MsgBox "Bitte gültigen Tageswert eingeben. Im Monat " & Cells(38, 10) & " gibt es keinen " & Cells(38, 8) & ".ten!", 0 + 64, "Fehlerhafte Eingabe"
    Cells(38, 8).Select
    Cells(38, 8).ClearContents
    End If

    If Target.Address = "$H$38" And Cells(38, 1) = 0 And Cells(38, 10) = "" And Cells(38, 8) <> "" Then
    Cells(38, 10).Select
    End If

    End If


    If Target.Address = "$J$38" And (Target.Value > 12 Or (Cells(38, 1) = 0 And Cells(38, 8) <> "") Or Target.Value < 1) And Target.Value <> "" Then

    MsgBox "Bitte Eingabe berichtigten (Zahl für den Monat muß zwischen 1 und 12 liegen).", 0 + 64, "Fehlerhafte Eingabe"
    Cells(38, 10).ClearContents
    Cells(38, 10).Select
    Else
    If Target.Address = "$J$38" Then
    If Cells(38, 10) <> "" And Cells(38, 8) <> "" Then
    Cells(48, 8).Select
    End If
    If Cells(38, 8) = "" Then
    Cells(38, 8).Select
    End If
    End If
    End If

    Dabei ist also H38 ein Eingabefeld für den Tag, J38 das Eingabefeld für den Monat und in cells(38,1) wird die Gültigkeit der Kombination von Tageszahl und Monatszahl überprüft mit zB =WENN(MONAT(DATUM(2004;J38;H38))=J38;1;0) (was natürlich nur geht, wenn es auf das Jahr für die weitere Berechnung nicht ankommt, weil anderenfalls auch noch der 29.te eines Februars in Abhängigkeit von der Jahresangabe überprüft werden müßte.

    Hmmmm...die Überprüfung scheint mir übrigens zunächst nicht so sicher wie die in Excel integrierte Gültigkeitsprüfung. Denn die eingebaute Gültigkeistprüfung läßt die Eingabe eines ungültigen Wertes grundsätzlich nicht zu. Dagegen führt

    MsgBox "Bitte nur Werte zwischen 1 und 31 eingeben"
    Cells(38, 8).Select

    lediglich dazu, daß die Zelle mit dem fehlerhaften Wert markiert wird. Der Anwender kann das ohne weiteres umgehen. Daher habe ich noch ein ClearContents eingebaut. Wirklich 100 % zuverlässig ist wohl weder die in Excel eingebaute Prüfung noch dieser Workaround. Aber mit brute force kriegt man alles kaputt.

    Vielen Dank nochmals!

    Viele Grüße

    Björn


     

    Beiträge aus den Excel-Beispielen zum Thema " Konflikt Gültigkeit und Change-Ereignis"