<--SyntaxHighlighter--> SyntaxHighlighter.all();

현대 사회에서 엑셀의 지위는 정말... 이걸 빼고서는 업무를 상상할 수 없을 정도로 막강한데요,,, 한가지 아쉬운 점이 매크로를 작성할 때 Visual Basic을 사용한다는 것입니다. 그게 무슨 아쉬운 점이냐 하실 수도 있는데, VBA라고 하는게 처음에는 쉽다고 해서 접근해보면 딱히 쉽진 않죠. 프로그래머들도 어렵다는 VBA니까요. 물론 프로그래머는 VBA를 집중해서 파기보다는 다른 자신만의 언어(Java, Python, C# 등)가 있으니까 그럴 수도 있겠지만요.

 

하지만 파이썬은 전문 프로그래머들 뿐만 아니라 일반인들도 많이 쓰는 언어가 되어가고 있습니다. 우선 쉬우니까요. 물론 깊이 들어가면 결국 비슷하게 어려운 부분이 있지만,,, 개인적인 느낌으로는 VBA보다 쉽습니다. 가독성이 너무 좋습니다. 그래서 언젠가 저도 파이썬 공부를 하면서 엑셀 매크로를 파이썬으로 짜면 얼마나 좋을까....생각했었는데, 어느 귀하신 분께서 그런 라이브러리를 만들어 놓으셨네요. 바로 xlwings입니다. 엑셀 관련 라이브러리로는 openpyxl 등 다양한 라이브러리가 존재합니다만, xlwings는 엑셀 내부에서 외부에서 작성된 python함수를 불러와서 사용할 수 있게 하는 라이브러리입니다. 서두가 길었는데 오늘은 xlwings의 설치부터 간단한 사용에 대해서 알아보겠습니다.

 

1. 설치

저는 Window10 환경에서 Pycharm을 주로 사용하고 있습니다. 설치는 여타 라이브러리와 마찬가지로 pip 명령으로 설치합니다.

pip install xlwings

헌데, 이 라이브러리는 여기서 씉나지 않고 엑셀 Add-In을 설치해주어야 하는데요, 아래와 같이 설치할 수 있습니다.

xlwings addin install

그러면 아래 그림과 같이 xlwings탭과 함께 메뉴들이 나타납니다. Interpreter 옆에 Python 실행 경로를 입력해줍니다. (예: C:\Program Files\Python38\python.exe )

 

 

 

2. VBA개발 환경 설정

xlwings의 작동 방식은 기본적으로 VBA 매크로를 통해서 파이썬 파일을(함수를) 불러오는 것입니다. 따라서 VBA 개발도구 탭이 있어야 하는데요, 파일->옵션->리본 사용자 지정 메뉴로 들어가셔서 왼쪽의 리스트에서 개발도구를 찾아 오른쪽으로 추가하시면 됩니다. 간혹 체크가 빠져서 안보이시는 분도 있으니 주의하세요.

 

 

 

3. 매크로 실행옵션 설정

매크로 실행 옵션을 모든 매크로 포함 으로 변경해줍니다.

 

 

 

4. VBA실행 참조 추가(xlwings 추가)

마지막으로 개발 도구->Visual Basic->도구->참조 메뉴로 이동하여 xlwings 를 추가해주면 드디어 실행 환경이 완성되었습니다.

 

 

 

 

5. Sample Test (hello xlwings)

이제 준비가 되었으니, 테스트를 해보겠습니다. 엑셀 파일은 위의 설정방법에 따라 세팅만 해놓은 빈 파일입니다. 확장자는 매크로를 포함하도록 .xlsm 파일로 생성합니다. 매크로로 이용할 파이썬 파일이 필요한데요,,엑셀 파일과 같은 폴더에 동일한 이름으로 존재하도록 생성합니다. (뒤에 나올 VBA코드에서 파일명을 줄 수도 있지만, 범용성을 고려하여 이름은 동일하게 하는 것으로 하겠습니다.)

 

 

그리고 파이썬 파일을 아래와 같이 코딩해줍니다.

import xlwings as xw

def main():
    
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
   
    if sheet["A1"].value == "Hello xlwings!":
        sheet["A1"].value = "Bye xlwings!"
    else:
        sheet["A1"].value = "Hello xlwings!"


if __name__ == "__main__":
    xw.Book("pyxl.xlsm").set_mock_caller()
    main()

다음으로, 실행할 엑셀 파일에서도 python 코드를 실행하는 부분을 설정할 필요가 있습니다. 서두에 말했듯이, VBA가 파이썬 코드를 실행합니다. 따라서 개발도구-Visual Basic 메뉴를 따라 VBA편집창에서 VBAProject에서 우클릭으로 모듈을 삽입해줍니다.

 

 

다음으로 해당 모듈에 아래의 VBA코드를 작성합니다.

Sub test()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".main()"
End Sub
이 코드는 해당 엑셀 파일과 동일한 이름의 파이썬 파일을 찾아, main함수를 실행합니다. 함수명을 바꾸면 다른 함수를 실행할 수도 있습니다. Sub ... 으로 시작하는 VBA 함수 이름은 임의로 주어도 무방합니다.
다음으로 엑셀 창으로 가서 xlwings-Run Main을 클릭하여 실행해봅시다. 아래와 같이 A1셀에 python으로 입력한 텍스트가 나타나면 성공입니다.!

 

 

 

그럼 오늘도 건승을 빌겠습니다.

 

~~ 끝 ~~

 


 

(ps) Python 경로의 오류로 인해서 VBA코드 내부의 RunPython 명령을 인식하지 못하는 경우도 자주 발생하였습니다. 제일 먼저 파이썬의 경로가 맞는지 확인하시고(VENV에 xlwings가 설치되었을 수 있음), 엑셀을 모두 닫고 해당 파일만 열어 실행해보는 등 다양한 방법으로 시도해보시기 바랍니다.

 

 
  1. songku 2021.07.22 22:23

    파이썬 코드에 작은 오류가 있어서, 수정해야 정상적으로 실행되네요!
    좋은 글 감사드립니다 (:

    import xlwings as xw

    def main():

    wb = xw.Book.caller()
    sheet2 = wb.sheets[0] # << sheet = wb.sheets[0] 으로 수정되어야 합니다

    if sheet["A1"].value == "Hello xlwings!":
    sheet["A1"].value = "Bye xlwings!"
    else:
    sheet["A1"].value = "Hello xlwings!"


    if __name__ == "__main__":
    xw.Book("pyxl.xlsm").set_mock_caller()
    main()

  2. 미니멀리 2021.07.22 22:29 신고

    아! 감사합니다^^

+ Recent posts