VBA — проверяет, содержит ли мой пароль 1 число, 1 ucase и 1 lcase

#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