Supportnet / Forum / Tabellenkalkulation
Bei Arbeitsblattname Sonderzeichen verbieten
Frage
Hallo,
ich kopiere durch ein Makro automatisch eine Vorlage als neues Arbeitsblatt und möchte nun bei der Namensabfrage direkt ein paar Kriterien prüfen.
Die Kriterien sind: Ist überhaupt etwas eingegeben, die max. Länge überschritten, exitiert der Name schon und ob der Name Sonderzeichen enthält.
Die ersten drei Kriterien sind alle kein Problem, aber bei den Sonderzeichen tue ich mich schwer. Theoretisch müsste man seine erlaubten Zeichen in eine Matrix/Feld schreiben und dann mit dem eingegebenen Namen vergleichen.
Habe mir auch schon die ASCII Codes dazu angesehen, aber wie gesagt, ist das nur die theoretische Lösung.
Prinzipiell sollen nur alle Buchstaben (A-Z und a-z) alle Zahlen (0-9) und "-" und "_" erlaubt sein.
Mein bisheriger Code sieht folgendermaßen aus:
[code]Sub Blatt_kopieren()
Dim Name As String
Dim bytSh As Byte
Name = InputBox("Bitte geben Sie den Namen (max. 15 Zeichen) ein!")
´keine Eingabe im Imputfeld
If Name = "" Then
MsgBox "Es wurde kein Name eingegeben!", 16, "Fehlermeldung"
Exit Sub
End If
´Name länger als 15 Zeichen
If Len(Name) > 15 Then
MsgBox "Der eingegebene Name ´" & Name & "´ (" & Len(Name) & " Zeichen) enthält mehr als 15 Zeichen!" _
& " Bitte kürzen Sie den Namen auf max. 15 Zeichen", 16, "Fehlermeldung"
Exit Sub
End If
´Prüfung ob Name bereits existiert
For bytSh = 1 To ActiveWorkbook.Sheets.Count
If Sheets(bytSh).Name = Name Then
MsgBox "Der Name ´" & Name & "´ existiert bereits!", 16, "Fehlermeldung"
Exit Sub
End If
Next
´Name enthält ungültige Sonderzeichen
[/code]
Hier sollen nun die Sonderzeichen überprüft werden und dann fange ich mit meinen Anweisungen (Kopieren und Namen geben,...) an.
Funktioniert alles blendend, wäre eben nur schön die Sache mit den Sonderzeichen hinzubekommen.
Vielen Dank für Hinweise, Tipps, Lösungen, Ideen....
Gruß strongé
Antwort 1 von Risatara2
Hmmmmm... ich weiß nicht genau, wie das in VBA geht, in PHP ginge das über einen Case-Konstrukt...
Eben probiert, kuck dir mal diesen Beispielcode ein:
Eben probiert, kuck dir mal diesen Beispielcode ein:
Sub test()
eingabe = InputBox("Test")
Select Case eingabe
Case "a" To "z"
MsgBox "Kleiner Buchstabe"
Case "A" To "Z"
MsgBox "Großer Buchstabe"
Case "0" To "9"
MsgBox "Zahl"
End Select
End Sub
Antwort 2 von stronge
versuche daraus mal was zu basteln, muss nur jetzt schnell meinen Zug bekommen.
Danke schon mal
Danke schon mal
Antwort 3 von CaroS
Hallo stronge,
da fällt mir spontan der ASCII-Code-Bereich ein. Mit der Asc-Funktion (Gibt einen Wert vom Typ Integer zurück, der den Zeichencode entsprechend dem ersten Buchstaben in einer Zeichenfolge darstellt. ...) kannst Du in einer Schleife Zeichen für Zeichen untersuchen, ob es in einem bestimmten Bereichen liegt:
48 - 57 (Ziffern), 65 - 90 (Groß-), 97 - 122 (Kleinbuchst.), 95 (U_Strich), 43 (+), 45 (-). Bei der Fallunterscheidung, ob nun auf der Basis des ASCII-Codes (numerischer Vergleich) oder als direkter Char-/String-Vergleich bist Du sicherlich mit der Select-Case-Anweisung gut beraten. Vor dem Vergleich noch ein LCase oder UCase, und schon sparst Du wieder einen Vergleich. Zulässige Einzelzeichen (95 - Unterstrich, 45 - Minus, 43 - Plus) vergrößern den Aufwand natürlich.
Gruß,
CaroS
da fällt mir spontan der ASCII-Code-Bereich ein. Mit der Asc-Funktion (Gibt einen Wert vom Typ Integer zurück, der den Zeichencode entsprechend dem ersten Buchstaben in einer Zeichenfolge darstellt. ...) kannst Du in einer Schleife Zeichen für Zeichen untersuchen, ob es in einem bestimmten Bereichen liegt:
48 - 57 (Ziffern), 65 - 90 (Groß-), 97 - 122 (Kleinbuchst.), 95 (U_Strich), 43 (+), 45 (-). Bei der Fallunterscheidung, ob nun auf der Basis des ASCII-Codes (numerischer Vergleich) oder als direkter Char-/String-Vergleich bist Du sicherlich mit der Select-Case-Anweisung gut beraten. Vor dem Vergleich noch ein LCase oder UCase, und schon sparst Du wieder einen Vergleich. Zulässige Einzelzeichen (95 - Unterstrich, 45 - Minus, 43 - Plus) vergrößern den Aufwand natürlich.
Gruß,
CaroS
Antwort 4 von stronge
Hallo,
ich brauche nochmal eure Hilfe.
Irgendwie bekomme ich es nicht richtig auf die Reihe eine vernünftige Abfrage zu starten.
Die Idee mit der Asc-Funktion hatte ich auch schon, aber ich komme damit nicht wirklich zurecht.
Könntest du mir vielleicht etwas detailierter weiterhelfen, wie so etwas aussehen müsste.
Wie gesagt habe ich meine Variable "Name".
Ich könnte jetzt mit instr(...) die einzelnen Zeichen durchgehen, aber wie mach ich das in Kombination mit asc??
Stehe echt gerade auf dem Schlauch.
Vielen Dank
ich brauche nochmal eure Hilfe.
Irgendwie bekomme ich es nicht richtig auf die Reihe eine vernünftige Abfrage zu starten.
Die Idee mit der Asc-Funktion hatte ich auch schon, aber ich komme damit nicht wirklich zurecht.
Könntest du mir vielleicht etwas detailierter weiterhelfen, wie so etwas aussehen müsste.
Wie gesagt habe ich meine Variable "Name".
Ich könnte jetzt mit instr(...) die einzelnen Zeichen durchgehen, aber wie mach ich das in Kombination mit asc??
Stehe echt gerade auf dem Schlauch.
Vielen Dank
Antwort 5 von fürLau
Hallo
Suchst Du sowas:
Gruß
Suchst Du sowas:
Private Sub CommandButton1_Click()
Dim vzeichen$, name$, i%, x%
vzeichen = "äöüßÄÖÜ\/<>^°#~?" ´Deine verbotenen Zeichen
name = Range("D1")
For i = 1 To Len(name)
For x = 1 To Len(vzeichen)
If Mid(name, i, 1) = Mid(vzeichen, x, 1) Then
MsgBox "Der Name " & name & " enthält das verboten Zeichen " & Mid(vzeichen, x, 1) & " !"
End If
Next
Next
End Sub
Gruß
Antwort 6 von CaroS
Hallo stronge,
hier noch´n Angebot (kann ohne Sub, End Sub und Dim Name in Deinen Code eingefügt werden):
Die Schleife ist allerdings hartnäckig, lässt Dich erst dann weiterarbeiten, wenn Du einen Namen ohne Sonderzeichen eingegeben hast.
Gruß,
CaroS
hier noch´n Angebot (kann ohne Sub, End Sub und Dim Name in Deinen Code eingefügt werden):
Sub OhneSonderzeichen()
Dim Name As String
Dim i As Integer
Do
Name = InputBox("Bitte geben Sie den Namen (max. 15 Zeichen) ein!")
For i = 1 To Len(Name) - 1
Select Case Mid(Name, i, 1)
Case "+", "-", "0" To "9", "A" To "Z", "_", "a" To "z"
´ Mach gar nichts! Nur zwecks Test: nachfolgende MsgBox
´ MsgBox "Alles im grünen Bereich!", vbOKOnly, "ASCII = " & CStr(Asc(Mid(Name, i, 1)))
Case Else
´ MsgBox "Sonderzeichen gefunden!", vbOKOnly, "ASCII = " & CStr(Asc(Mid(Name, i, 1)))
i = 100
End Select
Next
If i < 100 Then Exit Do
Loop
´ MsgBox "Keine Sonderzeichen gefunden!", vbOKOnly, CStr(i ) & " Zeichen geprüft"
End Sub
Die Schleife ist allerdings hartnäckig, lässt Dich erst dann weiterarbeiten, wenn Du einen Namen ohne Sonderzeichen eingegeben hast.
Gruß,
CaroS
Antwort 7 von CaroS
stronge,
entschuldige, da war das " - 1 " gleich zweimal falsch, oben eins zuviel (3. Zeile) und unten (letzte Zeile) fehlte eins. Un die Apostrophs machen auch immer Schwierigkeiten, deshalb REM. Also das Ganze noch mal:
Gruß,
CaroS
entschuldige, da war das " - 1 " gleich zweimal falsch, oben eins zuviel (3. Zeile) und unten (letzte Zeile) fehlte eins. Un die Apostrophs machen auch immer Schwierigkeiten, deshalb REM. Also das Ganze noch mal:
Sub OhneSonderzeichen()
Dim Name As String
Dim i As Integer
Do
Name = InputBox("Bitte geben Sie den Namen (max. 15 Zeichen) ein!")
For i = 1 To Len(Name)
Select Case Mid(Name, i, 1)
Case "+", "-", "0" To "9", "A" To "Z", "_", "a" To "z"
REM Mach gar nichts! Nur zwecks Test: nachfolgende MsgBox
REM MsgBox "Alles im grünen Bereich!", vbOKOnly, "ASCII = " & CStr(Asc(Mid(Name, i, 1)))
Case Else
REM MsgBox "Sonderzeichen gefunden!", vbOKOnly, "ASCII = " & CStr(Asc(Mid(Name, i, 1)))
i = 100
End Select
Next
If i < 100 Then Exit Do
Loop
REM MsgBox "Keine Sonderzeichen gefunden!", vbOKOnly, CStr(i - 1) & " Zeichen geprüft"
End Sub
Gruß,
CaroS
Antwort 8 von stronge
Herrlich, beide Lösungen funktionieren eins A.
Vielen, vielen Dank dafür. Da fängt der Tag gleich gut an, hoffentlich geht es auch so weiter.
Gruß strongé
Vielen, vielen Dank dafür. Da fängt der Tag gleich gut an, hoffentlich geht es auch so weiter.
Gruß strongé