ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 여러개의 Excel / CSV 파일 내 vba 매크로를 순차적으로 실행하기
    전공/자동화 프로그램 2020. 9. 26. 10:46

     

    여러 개의 파일(EXCEL or CSV)을 순차적으로 열고 vba 매크로를 돌릴 때 ‘매크로가 어느 파일에 존재하느냐’에 따라 2가지 경우로 나뉠 수 있을 것 같습니다.

     

    1) 주어진 파일 각각에 엑셀 매크로가 심어져 있는 경우(엑셀 파일 내 매크로가 저장이 되려면 확장자가 xlsm 또는 xlsb이어야 합니다. 즉 모든 파일의 확장자가 xlsm, xlsb 인 경우)
    이 경우 비교적 간단한 코드로 실행이 가능합니다.

    # 파일을 불러올 때 사용하는 패키지
    import glob
    import os
    # 엑셀 사용을 위한 패키지
    import xlwings as xw
    
    #엑셀을 띄우지 않고 실행
    app = xw.App(visible=False)
    
    #파일 확장자가 xlsm인 파일만 순차적으로 실행
    for file in glob.glob("./*.xlsm"):
        fileName_only = os.path.basename(file) #파일명
        wb = xw.Book(fileName_only)
        #살행하고자 하는 매크로 이름(매크로 마다 이름이 바뀔 경우 코드 수정 필요)
        macro_vba = wb.app.macro("'"+fileName_only+"'!ihavemacroo")
        macro_vba()
        wb.save() #파일 저장과 닫기
        wb.close()

     

    2) 엑셀 매크로 파일(xlsm)과 데이터파일(csv)이 따로 있는 경우 
    이 경우에는 1번 방법보다는 구현 코드가 좀 더 필요합니다. 매크로 파일 내에서 CSV파일 데이터를 불러오는 등 매크로가 어떻게 구현되어 있느냐에 따라 추가 작업이 필요하기 때문입니다. 따라서 향후 제작 시에도 매크로 구현 내용을 참고하여 코드를 작성해야 합니다.

    # 파일을 불러올 때 사용하는 패키지
    import glob
    import os
    # 엑셀 사용을 위한 패키지
    import xlwings as xw
    import pandas as pd
    
    # 엑셀을 띄우지 않고 실행
    app = xw.App(visible=False)
    
    # 파일 확장자가 csv인 파일만 순차적으로 실행
    for file in glob.glob("./*.csv"):
        fileName_only = os.path.basename(file)  # 파일명
        # --------------[추가구현]--------------
        # csv내 데이터를 xlsm파일에 붙여넣기
        csv_file = pd.read_csv(fileName_only, index_col='idx')
        wb = xw.Book('samplefile.xlsm')
        # Sheet2 - xlsm 파일을 열었을 때 바로 보이는 시트명 적기
        wb.sheets['Sheet2'].range('A1').value = csv_file  
        # ------------------------------------
        # xlsm파일 내 hello 매크로 실행
        macro_vba = wb.app.macro("'samplefile.xlsm'!hello")
        macro_vba()
        wb.close()
        print("엑셀 파일 내 작업 완료를 클릭해주세요")
    
    print("모든 파일 작업 끝")

     

     

    댓글