xlwings를 활용하여 파이썬 파일에 접근하는 방법에는 두 가지가 있습니다. 첫째는 특정 엑셀 파일명을 직접 지정하여 연결하는 방식이고, 둘째는 현재 활성화된 엑셀 파일에 접근하는 방식입니다.
일반적으로 버튼을 클릭하여 작업할 때는 현재 열려있는 워크시트에서 데이터를 처리하는 경우가 많습니다. 이러한 상황에서는 현재 활성화된 엑셀 파일과 워크시트에 순차적으로 접근하는 방법이 매우 유용합니다. 지금부터 이 방법에 대해 자세히 살펴보도록 하겠습니다.
현재 활성화된 시트에 접근
파이썬
xlwings 빠른시작 에서 xlwings quickstart명령을 통해 생성된 엑셀파일과 py파일은 기본구조를 가지고 있습니다. 파이썬에서는
def 함수가 자동으로 생성됩니다. 이는 xlwings addin이 호출한 엑셀워크북을 wb 객체로 받고, 해당 워크북의 첫 번째 시트를 sheet 객체로 받아 작업을 수행하는 기본 예시 코드입니다.
def main(): # def 함수 참고
wb = xw.Book.caller() # xlwings addin만 찾음
sheet = wb.sheets[0] # 시트중에 첫번째 시트를 객체로 받음
if sheet["A1"].value == "Hello xlwings!":
sheet["A1"].value = "Bye xlwings!"
else:
sheet["A1"].value = "Hello xlwings!"
Python
복사
아래의 코드는 위와는 조금 다른 예시입니다. 이 코드는 현재 열려있는 워크북을 찾고 해당 워크북에서 활성화되어 있는 시트를 찾는 방법을 보여주는데, 이는 시트를 직접 지정하는 것보다 더 편리합니다. 시트 직접 지정은 현재 작업 중인 시트가 아닌 다른 시트를 다룰 때 사용하면 됩니다.
def main(): # def 함수 참고
wb = xw.books.active # 현재 활성화된 워크북
sheet = wb.sheets.active # 현재 활성화된 시트
if sheet["A1"].value == "Hello xlwings!":
sheet["A1"].value = "Bye xlwings!"
else:
sheet["A1"].value = "Hello xlwings!"
Python
복사
엑셀VBA
VBA에서는 실행할 파이썬 파일과 해당 파일의 내부 함수를 지정해야 합니다. xlwings의 기본 예시는 VBA로 엑셀 파일명을 받아 동일한 이름의 파이썬 파일을 찾아 연결하는 방식입니다.
Sub SampleCall()
mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
RunPython "import " & mymodule & ";" & mymodule & ".main()"
End Sub
Visual Basic
복사
이러한 기본 방식에는 몇 가지 제한사항이 있습니다. 파이썬 파일 작성 시 반복되는 코드 입력이 필요하고, 매번 버튼에 매크로를 연결해야 합니다. 특히 중요한 제약사항으로, 엑셀 파일과 파이썬 파일의 이름을 동일하게 설정하고 같은 폴더에 저장해야 한다는 점이 있습니다.
이러한 번거로움을 해결하기 위해 제가 개발한 전용 템플릿을 활용하실 수 있습니다.
자동화 엑셀 템플릿 이 템플릿은 VBA 코드 작성이 필요 없으며, 파일 이름과 위치에 대한 제약 없이 자유롭게 작업할 수 있습니다. 전용 템플릿은 함수 기반이 아닌 py파일 기반으로 실행되므로, 제가 추가로 제공한 파일을 참고하여 응용해 보시기 바랍니다!
버튼과 연결
매크로함수를 버튼에 연결하는 방법은 매우 직관적입니다. 도형이나 개발자도구를 사용하여 버튼을 생성한 후, 해당 버튼을 우클릭하여 매크로지정 메뉴를 선택합니다. 그런 다음 목록에서 원하는 매크로명칭을 선택하여 연결을 완료할 수 있습니다. 이제 버튼을 클릭하면 파이썬 파일이 실행됩니다.