프로그램/비밀번호 관련 프로그램

[엑셀vba] 패스워드가 걸린 엑셀파일 한꺼번에 암호변경하기 or 해제하기

도 박사 2021. 1. 20. 21:59
반응형

 

저번에는 일괄적으로 암호걸어보기를 했는데 이번에는 패스워드가 걸린 엑셀 파일들을 한꺼번에 해제하거나 암호를 변경해도록 하자. 중요한점은 엑셀 파일의 암호를 알고 있어야한다는 것이다!

 


1. 동작 순서

 1) 패스워드변경.xlsm의 셀 A2에 폴더 경로를 입력. 경로 마지막에 '\' 없어도됨

    ex. c:\test

 2) 파일불러오기 버튼을 클릭하면 셀 A2 경로의 파일들을 시트에 출력. (확장자는 xlsx, xls, xlsm 등)

 3) 목록을 불러오면 현재 비밀번호변경할 비밀번호를 입력하고 비밀번호 변경을 클릭

 4) 암호 변경 성공 여부에 따라 E열에 결과를 나타냄

 


2. 시연

테스트할 폴더의 내용물
패스워드는 486

 

폴더 경로는 'C:\패스워드연습'으로 설정하고, 안의 내용물은 위 그림과 같이 다양하게 준비했다. 엑셀 파일은 이름처럼 비밀번호를 486으로 적용한 상태이다. 요기 있는 엑셀 화일들을 한 자리 숫자로 변경 해보겠다.


 

 

 VBA 동작 시연

 

셀 A2에 경로 입력

 

 

불러오기 성공!

 

셀 A2에 경로를 입력하고 '파일목록 불러오기' 버튼을 클릭하면 폴더 안에 있는 엑셀 화일들이 주르륵 나타난다. 목록이 나타나면 C열에 파일의 현재 비밀번호를 입력하고, D열에는 바뀔 비밀번호나 비워둔다.(비워두면 패스워드 해제) 


비밀번호 변경하기
비밀번호 변경된 후 파일 열기 성공!

변경된 비밀번호로 파일을 열어보았다. 움직이는 그림을 보면 아주아주 잘되는 것을 확인 할 수 있다. 그렇다면 변경할 비밀번호에 빈칸으로 두면 파일의 비밀번호가 해제되는지 해보겠다.

 


 

변경할 비밀번호와 잘못된 현재 비밀번호

 

실패한 파일은 적용되지 않음

현재 비밀번호를 틀리게 하고 변경할 비밀번호에는 빈칸으로 놔두었다. 그 결과 빈칸으로 놔둔 곳은 비밀번호가 해제된 상태로 아주 잘 열리고, 현재 비밀번호를 틀리게 해놓은 파일은 원래 비밀번호 그대로 유지되었다.


3. 마무리 & 코드

 1) 폴더 안의 목록 불러오는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub 파일목록불러오기()
    Dim f1, f2, f3, f4
    Dim x As Integer: x = 2
 
    Range("B2:E2000").ClearContents
    
    Set f1 = CreateObject("Scripting.FileSystemObject")
    Set f2 = f1.getfolder(Cells(2"A"))
    Set f3 = f2.Files
    
    For Each f4 In f3
        If InStr(1, f4.Name, ".xls"Then
            Cells(x, "B"= f4.Name
            x = x + 1
        End If
    Next f4
End Sub
cs

 

 2) 패스워드 변경하는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Sub PW_Change()
    
    Application.DisplayAlerts = False
    
    Dim lastr As Integer
    Dim x As Integer: x = 2
    Dim FN() As String
    Dim pw1() As String
    Dim pw2() As String
    
    lastr = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
    ReDim pw1(2 To lastr)
    ReDim pw2(2 To lastr)
    ReDim FN(2 To lastr)
    
    For x = 2 To lastr
        pw1(x) = Cells(x, "C")
        pw2(x) = Cells(x, "D")
        FN(x) = Cells(2"A"& "\" & Cells(x, "B")
    Next x
    
    For x = 2 To lastr
        
        On Error GoTo Err_Chk
        Workbooks.Open FN(x), , , , pw1(x)
        ActiveWorkbook.SaveAs FN(x), , pw2(x)
        ActiveWorkbook.Close
        ActiveSheet.Cells(x, "E") = "성공"
Retry:
    Next x
    
    Exit Sub
    
Err_Chk:
    
    If Err.Number = 1004 Then
        Debug.Print Err.Description
        ActiveSheet.Cells(x, "E") = "실패:암호 맞지않음"
        GoTo Retry
    Else
        ActiveSheet.Cells(x, "E") = "실패"
        GoTo Retry
    End If
    
End Sub
cs

 

두 개의 프로시저는 개별적으로 실행하며, 쉬운 함수들로 구성되어있다. 더 간단하게 만들 수도 있겠으나 나는 여기까지 인듯...

 

 

 

패스워드변경.xlsm
0.02MB

 


 

반응형