2016-10-19 5 views
1

비밀번호가 하나 있는데 숫자가 1 개, 대문자가 1 개, 소문자가 1 개인 경우 각각을 확인해야합니다. 8 자.VBA - 비밀 번호가 1 인 경우, 1 대문자 및 1 대문자 인 경우 유효성을 검사하십시오.

이 코드를 만들었지 만 문자 만 사용할 수는 있지만 길이는 없습니다. 도와 주시겠습니까? 감사!!

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" & Rows.Count).End(xlUp).Row 

    For b = 3 To LengthOFPasswordsList 
     psw = Range("D" & 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) & Chr(j) & Chr(k) & Chr(i Or j Or k) _ 
        & Chr(i Or j Or k) & Chr(i Or j Or k) & Chr(i Or j Or k)) _ 
        And Len(psw) <> 8 Then 
         Range("F" & b) = "Password Inválida" 
        End If 
       End If 
      End If 
     End If 
    Next b 
End Sub 
+1

:

'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 

이 또한 상당히 호출 코드를 단순화 검증 기능이처럼 간단 할 수있다 . 나는 네가 'If ... And'을 의미한다고 생각해. 그대로, i, j 및 k의 모든 값은 상황을 만족시킵니다. – PartyHatPanda

+0

"만약 ... 그리고 ..."어느 쪽도 작동하지 않습니다 ... –

+0

지금 당신이하려고했던 것을 봅니다; 'If' 문이 아닌'For' 루프를 사용해야합니다. – PartyHatPanda

답변

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" & 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" & 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" & b) = "Password Inválida" 
    End If 
Next b 

End Sub 
+0

정말 고마워요! –

+0

나는 그것이 기쁘다. 만족 스럽다면 내 대답을 정확하게 기재하고 질문을 닫으십시오. – PartyHatPanda

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" & Rows.Count).End(xlUp).Row 
    For x = 1 to lRow   'Go through each Password 
    bNum = False 
    bUpper = False 
    bLower = False 
    sPWD = Range("D" & 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" & x) = "Password Inválida" 
    End If 
    Next x 
End Sub 
1

나는 이것에 대한 정규 표현식을 개인적를 사용하십시오. 각 기준을 확인하고 일치하지 않는 경우 암호를 잊어 버리십시오. 그것은 가치가 무엇인지에 대한`... 경우 Or` 문을 수행하지 않는 것을

Sub Password() 
    Dim b As Integer 
    For b = 3 To Range("D" & Rows.Count).End(xlUp).Row 
     If Not ValidPassword(Range("D" & b)) Then 
      Range("F" & b) = "Password Inválida" 
     End If 
    Next 
End Sub