#vba #excel #validation #passwords
#vba #excel #проверка #пароли
Вопрос:
У меня есть набор паролей, и мне нужно проверить для каждого из них, содержит ли он 1 число, 1 верхний регистр, 1 нижний регистр и равна ли длина 8 символам.
Я создал этот код, но он не работает для символов, только для длины. Можете ли вы мне помочь, пожалуйста? Спасибо!!
Sub Password()
Dim b As Integer
Dim i As Integer, j As Integer, k As Integer
Dim psw As String
Dim LengthOFPasswordsList As Long
LengthOFPasswordsList = Range("D" amp; Rows.Count).End(xlUp).Row
For b = 3 To LengthOFPasswordsList
psw = Range("D" amp; b)
If i >= 65 Or i <= 90 Then
If j >= 97 Or j <= 122 Then
If k > 48 Or k <= 57 Then
If psw <> (Chr(i) amp; Chr(j) amp; Chr(k) amp; Chr(i Or j Or k) _
amp; Chr(i Or j Or k) amp; Chr(i Or j Or k) amp; Chr(i Or j Or k)) _
And Len(psw) <> 8 Then
Range("F" amp; b) = "Password Inválida"
End If
End If
End If
End If
Next b
End Sub
Комментарии:
1. Как бы то ни было, ваши
If...Or
заявления ничего не делают. Я думаю, вы имеете в видуIf...And
. Как бы то ни было, все значения i, j и k будут удовлетворять ситуации.2. «Если … И» тоже не работает…
3. Теперь я понимаю, что вы пытались сделать; вы должны использовать
For
циклы, а неIf
инструкции.4. Должен прочитать — TL; DR: длина пароля — это все, что имеет значение.
5. Нравится это? Для i = от 65 до 90, для j = От 97 до 122, для k = От 48 до 57
Ответ №1:
Похоже, вы пытались сделать слишком много сразу. Нет ничего ужасного в том, чтобы немного разделить код. Во многих случаях это облегчает чтение и понимание того, что происходит.
Sub Password()
Dim b As Integer
Dim i As Integer, j As Integer, k As Integer
Dim psw As String
Dim hasNum As Boolean, hasUpper As Boolean, hasLower As Boolean
Dim LengthOFPasswordsList As Long
LengthOFPasswordsList = Range("D" amp; Rows.Count).End(xlUp).Row
For b = 3 To LengthOFPasswordsList
'assume the password is no good.
hasNum = False
hasUpper = False
hasLower = False
'capture the psw in question
psw = Range("D" amp; b)
'see if there is a number in the password
'NOTE: the following For loops uses the ASCII values for numbers and letters.
For k = 48 To 57
If (InStr(1, psw, Chr(k))) Then
hasNum = True
Exit For
End If
Next k
'See if there is an upper case
For i = 65 To 90
If (InStr(1, psw, Chr(i))) Then
hasUpper = True
Exit For
End If
Next i
'See if there is a lower case
For j = 97 To 122
If (InStr(1, psw, Chr(j))) Then
hasLower = True
Exit For
End If
Next j
'See if all criteria was met
If Not hasLower Or Not hasUpper Or Not hasNum Or (Len(psw) <> 8) Then
Range("F" amp; b) = "Password Inválida"
End If
Next b
End Sub
Комментарии:
1. Я рад, что это так. Если вы довольны этим, пожалуйста, отметьте мой ответ как правильный и закройте вопрос.
Ответ №2:
Как насчет чего-то подобного и использовать встроенную функциональность:
Sub PasswordCheck ()
Dim bNum as Boolean, bUpper as Boolean, bLower as Boolean
Dim lRow as Long, x as Long
Dim i as Integer
Dim sPWD as String
lRow = Range("D" amp; Rows.Count).End(xlUp).Row
For x = 1 to lRow 'Go through each Password
bNum = False
bUpper = False
bLower = False
sPWD = Range("D" amp; x)
For i = 1 to Len(sPWD) 'Go through each letter
If IsNumeric(Mid(sPWD, i, 1) Then
bNum = True
ElseIf Mid(sPWD, i, 1) Like "[A-Z]" Then
bUpper = True
ElseIf Mid(sPWD, i, 1) Like "[a-z]" Then
bLower = True
End If
Next i
If bNum And bUpper And bLower Then
'Password is valid
Else
'Password is Invalid
Range("F" amp; x) = "Password Inválida"
End If
Next x
End Sub
Ответ №3:
Я бы лично использовал для этого регулярные выражения. Просто проверьте каждый из ваших критериев и введите пароль, если какой-либо из них не соответствует. Функция проверки может быть такой простой, как эта:
'Requires a reference to Microsoft VBScript Regular Expressions x.x
Private Function ValidPassword(inValue As String) As Boolean
Dim criteria As Variant
With New RegExp
For Each criteria In Split(".{8},[A-Z],[a-z],[0-9]", ",")
.Pattern = criteria
If Not .Test(inValue) Then Exit Function
Next
End With
ValidPassword = True
End Function
Это также значительно упрощает вызывающий код:
Sub Password()
Dim b As Integer
For b = 3 To Range("D" amp; Rows.Count).End(xlUp).Row
If Not ValidPassword(Range("D" amp; b)) Then
Range("F" amp; b) = "Password Inválida"
End If
Next
End Sub