Вернуться на страницу brain2net: https://brain2net.ru/post/upravlenie-makrosom-vba-iz-python/

Управление макросом VBA из Python

In [1]:
import pandas as pd 
import openpyxl # one excel reader/writer compatible with pandas
from win32com.client import Dispatch
In [2]:
# Загружаем уже существующий Excel файл с маргосами test.xlsm
book = openpyxl.load_workbook('test.xlsm', keep_vba = True) # Load existing .xlsm file

Формируется ДатаФрейм для записи в Excel файл

In [3]:
df_write = pd.DataFrame({'First' : [5, 2, 0, 10, 4], 
                   'Second' : [9, 8, 21, 3, 8]})
df_write
Out[3]:
First Second
0 5 9
1 2 8
2 0 21
3 10 3
4 4 8

df_write записывается на Лист1 Excel файла

In [5]:
with pd.ExcelWriter('test.xlsm', engine='openpyxl') as writer: # open a writer instance with the filename of the     
    writer.book = book # Hand over input workbook
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets) # Hand over worksheets
    writer.vba_archive = book.vba_archive # Hand over VBA information 
    df_write.to_excel(writer)
    writer.save()

Из Python запускается макросом VBA, который воспроизводит загруженный на Лист1 pandas.DataFrame на Лист2 и добавляет в него столбец с суммой двух имеющихся.

In [6]:
try:
    excel = Dispatch("Excel.Application")
    #excel.Visible = True
    workbook = excel.Workbooks.Open(r"C:\Users\Dmitry\test.xlsm")

    workbook.Application.Run("Module1.test")
    workbook.Save()
    excel.Quit()
except IOError:
    print("Error")

Полученный в результате на Лист2 pandas.DataFrame загружается в Python.

In [7]:
 df2 = pd.read_excel('test.xlsm', sheet_name='Sheet2')
In [8]:
df2
Out[8]:
Unnamed: 0 First Second Sum
0 0 5 9 14
1 1 2 8 10
2 2 0 21 21
3 3 10 3 13
4 4 4 8 12

Вернуться на страницу brain2net: https://brain2net.ru/post/upravlenie-makrosom-vba-iz-python/

In [ ]: