für die ausschließliche Eingabe der Zeichen A – E in ein Excel 2003 Tabellenblatt, nutze ich folgendes kleines Makro:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Text1 As String
Dim Text2 As String
Dim Text3 As String
Dim Text4 As String
Dim Text5 As String
Dim Text6 As String
Text1 = „es sind nur folgende Eingaben möglich:“
Text2 = „A, B, C, D oder E“
Text3 = „das sollte nicht passieren,“
Text4 = „es trat ein Fehler auf!“
Text5 = „Bitte prüfen Sie Ihre letzten Eingaben und wiederholen“
Text6 = „Sie sie gegebenenfalls noch einmal Schritt für Schritt.“
On Error GoTo Fehler
Dim rngZelle As Range
Dim rngBereich As Range
Set rngZelle = Intersect(Target, Range(„A1:stuck_out_tongue:60“))
If Not rngZelle Is Nothing Then
Application.EnableEvents = False
Select Case Target.Value
Case „a“ , „A“
Target.Value = „A“
Case „b“ , „B“
Target.Value = „B“
Case „c“ , „C“
Target.Value = „C“
Case „d“ , „D“
Target.Value = „D“
Case „e“ , „E“
Target.Value = „E“
Case „“
Target.Value = „“
Case Else
Application.Undo
MsgBox Text1 & vbLf & Text2, vbInformation, „sorry,“
End Select
Application.EnableEvents = True
End If
Das funktioniert soweit zufriedenstellend, bis auf zwei Bugs:
markiert ein Nutzer mehrere Zellen und versucht die Daten zu löschen, gibt es eine Fehlermeldung.
Dies fange ich mit „Application.Undo“ ab. Finde es aber insgesamt etwas unbefriedigend, dass es überhaupt zu einem Fehler kommt.
Nach Ausführung von „Application.Undo“ kann man in die Zellen schreiben was man will. Die ausschließliche Eingabe der Zeichen A – D ist nicht mehr gültig.
Hat jemand eine gute Idee, wie man die beiden Probleme lösen kann?
warum nicht Gültigkeitsprüfung?
Hallo Jorma,
gibt es einen bestimmten Grund, warum Du die korrekte Befüllung der Zellen nicht mit der eingebauten Excel-Gültigkeitsprüfung realisieren willst?
Freundliche Grüße
Thomas
Hallo Thomas,
ja, einen Grund gibt es.
Bei der Gültigkeitsprüfung hat man immer automatisch ein DropDown Feld.
Aus bestimmten Gründen ist das nicht erwünscht.
v. Grüße,
Jorma
wenn du die Gültigkeitsprüfung nicht umstellen möchtest, z.B. wegen automatischer Ändrung in Großbuchstaben, dann muss du dein Makro wie folgt anpassen.
Alle momentan selektierten Zellen werden dann in einer Schleife einzeln geprüft.
Die Ereignismakros werden auch nach einem Fehler wieder aktiviert.
Die Case-Anweisungen hab ich etwas modifiziert.
Ebenso das Füllen der Variablen für die Meldungstexte - hier nur noch 2 Variablen.
Gruß
Franz
Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Text1 As String
Dim Text3 As String
Text1 = "es sind nur folgende Eingaben möglich:"
Text1 = Text1 & vbLf & "A, B, C, D oder E"
Text3 = "das sollte nicht passieren,"
Text3 = Text3 & vbLf & "es trat ein Fehler auf!"
Text3 = Text3 & vbLf & "Bitte prüfen Sie Ihre letzten Eingaben und wiederholen"
Text3 = Text3 & vbLf & "Sie sie gegebenenfalls noch einmal Schritt für Schritt."
On Error GoTo Fehler
Dim rngZelle As Range, rngZellen As Range
Set rngZellen = Intersect(Target, Range("A1:stuck\_out\_tongue:60"))
If Not rngZellen Is Nothing Then
Application.EnableEvents = False
For Each rngZelle In rngZellen.Cells
Select Case rngZelle.Value
Case "A", "B", "C", "D", "E"
'Eingabe OK
Case "a", "b", "c", "d", "e"
rngZelle.Value = UCase(rngZelle.Value)
Case ""
'Eingabe wurde gelöscht
Case Else
Application.Undo
MsgBox Text1, vbInformation, "sorry,"
End Select
Next rngZelle
Application.EnableEvents = True
End If
Exit Sub
Fehler:
MsgBox "Fehler-Nr.: " & Err.Number & vbLf & Err.Description \_
& vbLf & vbLf & Text3, vbCritical, "Entschuldigung,"
Application.EnableEvents = True
End Sub