Supportnet Computer
Planet of Tech

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:
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

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

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

Antwort 5 von fürLau

Hallo

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):

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:

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é

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: