由于我也花了一些时间来解决这个问题,我将提供另一个示例,它应该适用于 Excel 2007/2010/2013 的xlsm
格式。与上面提供的示例没有太大区别,只是更简单一点,没有循环不同的文件并包含更多注释。此外,宏的源代码是从文本文件中加载的,而不是在 Python 脚本中硬编码。
请记住根据您的需要调整脚本顶部的文件路径。
此外,请记住 Excel 2007/2010/2013 仅允许以xlsm
格式存储带有宏的工作簿,而不是xlsx
. 将宏插入xlsx
文件时,系统会提示您将其保存为不同的格式,否则宏将不会包含在文件中。
最后但并非最不重要的一点是,检查 Excel 从应用程序外部执行 VBA 代码的选项是否已激活(出于安全原因,默认情况下该选项已停用),否则,您将收到一条错误消息。为此,请打开 Excel 并转到
文件 -> 选项 -> 信任中心 -> 信任中心设置 -> 宏设置 -> 激活Trust access to the VBA project object model
.
# necessary imports
import os, sys
import win32com.client
# get directory where the script is located
_file = os.path.abspath(sys.argv[0])
path = os.path.dirname(_file)
# set file paths and macro name accordingly - here we assume that the files are located in the same folder as the Python script
pathToExcelFile = path + '/myExcelFile.xlsm'
pathToMacro = path + '/myMacro.txt'
myMacroName = 'UsefulMacro'
# read the textfile holding the excel macro into a string
with open (pathToMacro, "r") as myfile:
print('reading macro into string from: ' + str(myfile))
macro=myfile.read()
# open up an instance of Excel with the win32com driver
excel = win32com.client.Dispatch("Excel.Application")
# do the operation in background without actually opening Excel
excel.Visible = False
# open the excel workbook from the specified file
workbook = excel.Workbooks.Open(Filename=pathToExcelFile)
# insert the macro-string into the excel file
excelModule = workbook.VBProject.VBComponents.Add(1)
excelModule.CodeModule.AddFromString(macro)
# run the macro
excel.Application.Run(myMacroName)
# save the workbook and close
excel.Workbooks(1).Close(SaveChanges=1)
excel.Application.Quit()
# garbage collection
del excel