Hallo zusammen :)
Ich habe in einer Excel Datei ein UserForm erstellt was einer Erstellung eines Benutzerkontos gleicht.
Der Benutzer muss neben seinem Namen auch ein Passwort eingeben. Nun soll in der TextBox für die Passworterstellung folgendes überprüft werden:
1. Ist das Passwort mindestens 6 Zeichen lang
2. Wurde mindestens ein Grossbuchstabe.
3. Wurde mindestens eine Zahl verwendet.
4. Wurden keine Zeichen wie "äüöœæ" oder ähnliches verwendet.
Bei Punkt Nr. 1würde ich es wie folgt lösen
Code:
If Len(TextBox1) < 6 Then
MsgBox "Passwort zu kurz"
End If
Für die anderen 3 Punkte fehlt mir der richtige Ansatz. Würdet Ihr den Inhalt der TextBox mit der Funktion .Find überprüfen oder gibt es bereits, mir noch unbekannte Funktionen, die das übernehmen?
Gibt es die Möglichkeit jeden Buchstaben in der TextBox einzeln nach diesen Kriterien zu untersuchen? Nach dem Motto For Each Char/Symbol?
Lg Primo
Moin Centurio,
Mein Ansatz:
Erst einmal vereinfachen: Deine drei Kriterien sind die Länge des PWs, dann darf man nur noch Ziffern und Großbuchstaben, Die Umlaute brauchst Du nicht extra auszugrenzen.
Die Länge hast du schon.
Für die nächsten Kriterien kannst Du das Passwort Zeichenweise prüfen, ob das Zeichen im ASCII-Bereich 60-95 (Großbuchstaben) und/oder 46-57 (Ziffern) liegt. VBA: ASC(Zeichen)
Abschließend musst Du sicherstellen, dass beide Zeichentypen vorhanden sind.
Viel Spaß!
Moin Centurio,
aus purer Langeweile ... quatsch! Der Spaß am Lernen begründet mein Hiersein! habe ich Dir mal was gebastelt und Dich dabei absichtlich missverstanden. Schließlich fehlte Dir nur der
Einstieg...
Code:
Option Explicit
Sub PWCheck()
Dim i As Integer, f As Integer, iNum As Integer, iChar As Integer
Dim sPW As String, sChar As String, sCheck As String, sMsg As String
sPW = Cells(1, 1)
' Ziffern & Großbuchstaben?
For i = 1 To Len(sPW)
sChar = Mid(sPW, i)
If Asc(sChar) > 46 And Asc(sChar) < 57 Then 'Ziffern
sCheck = sCheck & "Z"
End If
If Asc(sChar) > 64 And Asc(sChar) < 91 Then 'Großbuchstaben
sCheck = sCheck & "G"
End If
Next i
' Werte Regelkonform?
For i = 1 To Len(sCheck)
If Mid(sCheck, i, 1) = "G" Then
iNum = iNum + 1
End If
If Mid(sCheck, i, 1) = "Z" Then
iChar = iChar + 1
End If
Next i
' Länge okay, beide Werttypen vorhanden?
Select Case True
Case Len(sPW) < 6, iNum = 0, iChar = 0, iNum + iChar <> Len(sPW)
sMsg = vbTab & "Fehler!" & vbNewLine & vbNewLine & _
"Passwort-Regel beachten:" & vbNewLine & _
"Mix aus Großbuchstaben und Ziffern" & vbNewLine & _
"Mindestlänge sechs Zeichen."
Case Else
sMsg = "Passt alles!"
End Select
'Ausgabe
MsgBox sMsg, , "Checked!"
End Sub
Was ist das Missverständnis? Tipp: 97-122 ... Du wirst es finden und dann sicherlich selbst anpassen können.
Viel Erfolg!
noch einen als Nachtrag zum Thema Passwörter in XL: Ich hoffe, Du folgst nicht Illusion, dass man XL-Dateien tatsächlich 100%ig schützen könnte? Egal, ob Workbook, Worksheet oder VBA-Code. Es ist alles nix mit Fort Knox!!
Grüße
(07.09.2022, 18:57)Primo Centurio schrieb: [ -> ]4. Wurden keine Zeichen wie "äüöœæ" oder ähnliches verwendet.
Welche Zeichen aus der schier unendlichen Massen an möglichen Zeichen erfüllen nach deiner Definition das Kriterium "ähnlich wie 'äüöœæ'"?
Oder anders herum: Welche Zeichen erfüllen dieses Kriterium nicht?
Aus der Erkenntnis, was du einfacher beantworten kannst, kannst du Rückschlüsse ziehen, wie du deine programmierte Lösung aufbauen solltest, also: Prüfst du auf gültige Zeichen oder auf ungültige?
2 Ideen:
Code:
Option Explicit
Function chkPwd(ByVal Password As String) As Boolean
'1. Ist das Passwort mindestens 6 Zeichen lang
'2. Wurde mindestens ein Grossbuchstabe.
'3. Wurde mindestens eine Zahl verwendet.
'4. Wurden keine Zeichen wie "äüöœæ" oder ähnliches(????????????) verwendet.
Dim i As Byte
'Ohne undefinierte Bedingung 4:
If Len(Password) >= 6 Then
If Password <> LCase(Password) Then
For i = 1 To Len(Password)
If IsNumeric(Mid(Password, i, 1)) Then
chkPwd = True
Exit For
End If
Next i
End If
End If
End Function
Code:
Option Explicit
Function chkPwd2(ByVal Password As String) As Boolean
Dim i As Byte
Dim CheckSum As Byte
For i = 1 To Len(Password)
Select Case AscW(Mid(Password, i, 1))
Case 48 To 57 '0-9
CheckSum = CheckSum Or 1
Case 65 To 90 'A-Z
CheckSum = CheckSum Or 2
Case 97 To 122 'a-z
CheckSum = CheckSum Or 4
Case Else
CheckSum = CheckSum Or 8
End Select
Next i
chkPwd2 = CheckSum = (1 Or 2 Or 4)
End Function
Ideenüberschneidungen sind nicht ausgeschlossen...
Der 2. Code lässt sich einfacher an zusätzliche Bedingungen anpassen, wäre also mein Favorit.
Hallo,
der Test auf Klein- oder Großbuchstaben könnte doch auch so erfolgen, oder habe ich einen Denkfehler?
Code:
If sPW = UCase(sPW) Then
Debug.Print "keine Kleinbuchstaben"
End If
If sPW = LCase(sPW) Then
Debug.Print "keine Großbuchstaben"
End If
(07.09.2022, 22:31)d'r Bastler schrieb: [ -> ]Code:
If Asc(sChar) > 46 And Asc(sChar) < 57 Then 'Ziffern
das Zeichen 47 müsstest du noch ausschließen, dafür das Zeichen 57 einbeziehen.
...sorry, aus Versehen gepostet.
Hm, mir fällt da noch ein Szenario ein, in dem der Nutzer irgendwelche (Unicode-)Sonderzeichen bewusst oder unbewusst im Passwort verwendet. Gibt er also z. B. ein Zeichen mit dem Unicodewert 0x2658 (dezimal 9816) ein, so gibt asc den Wert 63 zurück (Ersatzzeichen), also ein ggf. gültiges Zeichen. Man könnte vorsichtshalber mit CharW und AscW arbeiten.
(08.09.2022, 09:00)Der Steuerfuzzi schrieb: [ -> ]Hm, mir fällt da noch ein Szenario ein, in dem der Nutzer irgendwelche (Unicode-)Sonderzeichen bewusst oder unbewusst im Passwort verwendet. Gibt er also z. B. ein Zeichen mit dem Unicodewert 0x2658 (dezimal 9816) ein, so gibt asc den Wert 63 zurück (Ersatzzeichen), also ein ggf. gültiges Zeichen. Man könnte vorsichtshalber mit CharW und AscW arbeiten.
Wichtiger Hinweis, habe ich mal in meinen 2. Code eingebaut.
Vielen Herzlichen Dank für eure Hilfe
Werde mir heute Abend alles in Ruhe anschauen und ausprobieren :)
Ich wünsche euch einen schönen Tag und ich melde mich
Lg Primo