본문 바로가기
코딩/자동화

엑셀 매크로(VBA script)를 파이썬 스크립트로 바꾸는 방법/win32com

by 나홀로코더 2021. 12. 10.
반응형

목차

1. 주제에 대한 소개

2. 엑셀 매크로 만들기

3. 엑셀 매크로를 파이썬 코드로 변환하기


 

1. 주제에 대한 소개

 

파이썬을 이용해 엑셀 관련 작업을 할 수 있는 방법은 다양하다.

 

xlwings, openpyxl 등 엑셀을 컨트롤할 수 있는 많은 라이브러리가 있다.

 

그러나 그 사용법을 익히고 명령어를 외우거나 찾아 쓰는 데에 적잖은 노력이 들어간다.

 

따라서 그러한 노력을 들이지 않고도 파이썬으로 엑셀을 컨트롤할 수 있는 방법이 알고 싶어 진다.

 

필자는 앞서 아래아한글 매크로를 파이썬에서 실행하는 방법을 소개하였다.

 

한글매크로를 파이썬에서 실행하는 방법(win32com)

 

win32com 패키지를 이용하면 한글매크로를 먼저 만든 뒤에  코드를 조금 변환하여 파이썬에서 매크로를 그대로 실행할 수가 있었다.

 

코드가 조금 길어진다는 단점이 있으나, 매크로 녹화 기능을 이용하여 매크로 손쉽게 만든 뒤에 약간의 편집만 거치면 된다는 장점이 있는 방식이다.

 

이 글에서 소개하는 내용은 앞서 소개한 것과 기본적인 아이디어가 같고, 한글 대신 엑셀을 이용한다는 점만 다르다.

 

[참고]
파이썬과 엑셀매크로를 키워드로 검색해보면 위에 언급한 라이브러리들을 이용해 엑셀 매크로를 실행하는 방법들이 주로 나올 것이다.

이 글은 엑셀 매크로를 그대로 실행하는 방법이 아니라, 파이썬 코드로 변환하는 방법을 소개하는 것이니 오해가 없길 바란다.

 

 

반응형

 

2. 엑셀 매크로 만들기

 

일단 엑셀 매크로 사용법부터 간단히 살펴보자.

 

개발 도구 메뉴 활성화

 

매크로는 엑셀 리본 메뉴의 "개발도구" 탭에서 사용할 수 있는데, 만일 독자가 사용 중인 PC에서 개발도구 탭이 안 보인다면 이를 먼저 활성화해줘야 한다.

 

'파일 > 옵션 > 리본 사용자 지정'으로 들어가서, 우측 박스의 중간쯤 있는 "개발 도구" 옆의 체크박스에 체크를 하자.

 

그런 다음 확인을 누르면 "보기" 탭 옆에 개발 도구가 나타난다.

 

매크로 기록하기

 

매크로 기록 방법은 간단하다. 개발 도구 탭을 누르고, "매크로 기록" 버튼을 누른다.

 

개발 도구 메뉴

 

그러면 그 이후 하는 작업들이 모두 기록된다.

 

기록을 중지하려면 "매크로 기록" 버튼 자리에 생겨 있을 네모난 중지 버튼을 눌러도 되고, 엑셀창 하단에서 중지 버튼을 누를 수도 있다.

 

기록된 매크로 확인하기

 

매크로 기록 버튼 옆의 Visual Basic 버튼을 누르거나, Alt + F11을 누르면 기록된 매크로를 확인할 수 있다.

 

새로 열린 창에서 "모듈" 폴더 안에 있는 Module을 눌러보면 우측에 기록된 내용이 표시된다.

 

기록 버튼만 누르고 아무것도 안 했기 때문에 매크로의 시작과 끝 표시, 그리고 이름만 나타나고 있다.

 

비주얼베이직 화면

 

엑셀에서 할 작업은 여기까지이다. 매크로 기록을 누른 뒤에 파이썬에서 실행하고 싶은 동작을 수행하고, 기록된 코드만 가져다 쓰는 것이다.

 

[참고]
참고로 비주얼베이직 창을 띄워 놓고 매크로를 기록해보면, 실시간으로 코드가 기록되는 것을 볼 수도 있다.

 

 

반응형

 

3. 엑셀 매크로를 파이썬 코드로 변환하기

 

이제 기록된 매크로를 파이썬에서 실행할 수 있도록 바꿔보자.

 

앞서 win32com을 소개하면서 예제로 엑셀을 실행해봤었는데, 시작은 똑같이 하면 된다.

 

파이썬으로 아래아한글을 사용하는 방법(win32com)

 

아래 코드로 엑셀 인스턴스를 만든다. 여기까지 하면 시트가 하나도 없는 엑셀 창이 열린다.

 

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
xl.Visible = True

 

그다음 아래 코드로 문서를 하나 열어 주고, 워크북과 워크시트를 각각 변수로 지정해준다.

 

wb = xl.Workbooks.Add()
ws = wb.Worksheets(1)

 

우리가 변환해볼 엑셀 매크로는 아래와 같다.

 

A1:C3 셀을 선택해 "병합하고 가운데 맞춤"을 실행하고, 병합된 셀에다가 텍스트를 입력해보는 것이다.

 

Sub 매크로1()

    Range("A1:C3").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.Merge
    ActiveCell.FormulaR1C1 = "엑셀 매크로를 파이썬 코드로 변환하기"
    
End Sub

 

 

첫 줄은 Range 앞에 ws.을 붙이고, Select 뒤에 괄호 두 개를 붙인 뒤에 실행해보면 실행이 된다.

 

ws.Range("A1:C3").Select()

 

그러나 바로 다음에 나오는 with 구문을 실행이 가능하게 바꿔주려면 이 부분도 조금 다르게 해야 한다.

 

아래와 같이 ws.Range()를 변수로 설정해주고, 다음 줄에서 .Select()로 범위 선택을 실행해준다. 이렇게 해도 위에서 한 것과 결과물은 같다. 

 

sel = ws.Range("A1:C3")
sel.Select()

 

 

그런 다음에는 with 구문을 변환해줄 차례이다.

 

구조를 보면 with Selection 하고, 그 아랫줄에 마침표로 시작하는 여러 줄이 나오고, End with로 끝나는데, 위에서 선언한 sel이 여기에 있는 Selections과 같다고 생각하면 될 것 같다.

 

따라서 with 구문의 두 번째 줄 앞부분은 아래와 같이 바꾸면 된다. 한글 매크로를 변환할 때 with 구문을 변환하던 방식과 비슷하다.

 

sel.HorizontalAlignment

 

그런데 그 줄의 뒷부분은 한글 매크로 변환할 때를 생각하고서 앞에다 xl, wb, ws을 갖다 붙여봐도, sel을 붙여봐도 에러가 날 것이다.

 

이 부분의 xlCenter, xlContext 같은 것들은 COM constants라고 부르는데, 필자도 정확한 개념을 설명해줄 만큼 잘 알고 있지는 못하지만, pywin32의 document에 따르면 win32com.client 패키지에서 constants를 임포트해주면 이것들을 사용할 수 있다고 한다.

 

설명돼 있는 대로 constants를 임포트해주고, xlCenter 앞에다가 constants를 붙여주면 에러가 나지 않고 실행이 된다.

 

from win32com.client import constants
sel.HorizontalAlignment = constants.xlCenter
...

 

constants가 아닌 bool값(True/False)이나 숫자는 그냥 두면 된다.

 

결과적으로 with 구문을 변환한 결과는 아래와 같다.

 

sel.HorizontalAlignment = constants.xlCenter
sel.HorizontalAlignment = constants.xlCenter
sel.VerticalAlignment = constants.xlCenter
sel.WrapText = False
sel.Orientation = 0
sel.AddIndent = False
sel.IndentLevel = 0
sel.ShrinkToFit = False
sel.ReadingOrder = constants.xlContext
sel.MergeCells = False

 

그런 다음, 아래 코드를 실행해주면 셀 병합이 실행된다.

 

sel.Merge()

 

이제 마지막으로 글씨를 쓸 차례인데, 이 부분은 한글 매크로를 변환할 때와 마찬가지로 xl.만 앞에 붙여주면 된다.

 

xl.ActiveCell.FormulaR1C1 = "엑셀 매크로를 파이썬 코드로 변환하기"

 

기본적인 변환법 소개는 이 정도로 마치고, 한글 매크로 변환을 활용한 사례[파이썬을 이용해 한글 문서의 자간을 자동으로 조정하는 방법(win32com, 한글매크로)]를 소개한 것과 마찬가지로 위 방법을 활용한 사례도 조만간 다뤄보려고 한다.

 

[참고] 변환 전후 비교
Sub 매크로1()


import win32com.client
from win32com.client import constants
xl = win32com.client.Dispatch("Excel.Application")
xl.Visible = True
wb = xl.Workbooks.Add()
ws = wb.Worksheets(1)
    Range("A1:C3").Select
 
sel = ws.Range("A1:C3")
sel.Select()
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
sel.HorizontalAlignment = constants.xlCenter
sel.HorizontalAlignment = constants.xlCenter
sel.VerticalAlignment = constants.xlCenter
sel.WrapText = False
sel.Orientation = 0
sel.AddIndent = False
sel.IndentLevel = 0
sel.ShrinkToFit = False
sel.ReadingOrder = constants.xlContext
sel.MergeCells = False
 
    Selection.Merge
sel.Merge()
    ActiveCell.FormulaR1C1 = "엑셀 매크로를 파이썬 코드로 변환하기"

End Sub
xl.ActiveCell.FormulaR1C1 = "엑셀 매크로를 파이썬 코드로 변환하기"

 

반응형

댓글