python - 从 VBA 到 Python 再回到 Excel
问题描述
我正在尝试使用 Excel 和 Python 3.7.1 制作一个自动化程序。
- 从 Excel 工作表开始,用户应该单击一个
分配有宏的按钮(实际上它是一个 ActiveX 控件命令按钮)。 - 该宏运行 Python 并关闭 Excel 窗口。
- Python 脚本从另一个 .xlsx 文件中读取数据,进行回归并将结果存储到 pandas DataFrame 中。
我现在要做的是将此 DataFrame 写入运行 Python 的 .xlsm 文件中的第二张表(已经创建,但为空)。
我尝试了不同的方法,在互联网上寻找了很多帮助,但似乎没有任何效果。我还阅读了有关“vbaProject.bin”的信息,但我无法从在命令提示符下调用它的文件中提取内容。
要么数据按预期显示,但按钮不再“可点击”,要么数据根本不显示。有时该文件甚至不可用,因为它的类型已被 python 更改。
我同时使用了 openpyxl 和 xlsxwriter 但徒劳无功。这是其中一段代码:
wb = load_workbook('PythonLauncher.xlsm', keep_vba=True)
writer = pd.ExcelWriter('PythonLauncher.xlsm', engine=openpyxl)
writer.book = wb
DtFrm.to_excel(writer, writer.book.sheetnames[1], columns=None, index=False)
writer.save()
writer.close()
最佳结果是在 .xlsm 文件的第二张表中获取 DataFrame,而不会丢失单击功能。
解决方案
您可以轻松地从 Python 运行 Excel/VBA。下面是两个例子来做同样的事情。
from __future__ import print_function
import unittest
import os.path
import win32com.client
class ExcelMacro(unittest.TestCase):
def test_excel_macro(self):
try:
xlApp = win32com.client.DispatchEx('Excel.Application')
xlsPath = os.path.expanduser('C:\\your_path\\test.xlsb')
wb = xlApp.Workbooks.Open(Filename=xlsPath)
xlApp.Run('Macro1')
wb.Save()
xlApp.Quit()
print("Macro ran successfully!")
except:
print("Error found while running the excel macro!")
xlApp.Quit()
if __name__ == "__main__":
unittest.main()
import os
import win32com.client
#Launch Excel and Open Wrkbook
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename="C:\\your_path\\test.xlsm") #opens workbook in readonly mode.
#Run Macro
xl.Application.Run("excelsheet.xlsm!modulename.macroname")
#Save Document and Quit.
xl.Application.Save()
xl.Application.Quit()
#Cleanup the com reference.
del xl
推荐阅读
- zsh - zsh:如何在 vim 模式下为 history-beginning-search-forward 创建键绑定(使用 oh-my-zsh 的 vi-mode 插件)?
- php - 为什么不在 PHP 中的数据库中保存 order 和 order_detail
- r - 在 RStudio 4.1.0 中安装 Lubridate 1.3.3 的问题
- android - setContent 块是可组合的吗?
- java - 如何在两个数组中找到最接近的匹配对以在最后一个数组中查找结果
- php - 使用php将图像上传到文件夹
- javascript - 从零而不是一开始的递增按钮
- c - 如何处理 pthread_kill 正常退出程序
- amazon-web-services - 从托管在 aws 上的 Flask 应用程序发送确认邮件
- coldfusion - ColdFusion framework ONE 如何使视图功能在视图中可用