如何使用 Python 添加 "Microsoft Excel Object" VBA 代码到 Excel 文件
How to add "Microsoft Excel Object" VBA code to Excel file using Python
我在 VBA、Excel 中写了一个长脚本。我正在使用 Python 创建另一个 Excel 文件,我想将脚本嵌入到该文件中。我已经能够在 Excel 中添加一个宏作为 "Module1",但不能作为与特定工作表关联的 "Microsoft Excel Object"。它必须与一个命名工作表相关联,因为它会在您单击输入单元格时突出显示特定单元格。
我已将 vbaProject.bin 提取到与我要将其添加到的 Excel 文件相同的文件夹中。我还记得在 Excel 中设置正确的权限(文件 -> 选项 -> 信任中心 -> 信任中心设置 -> 宏设置 -> 信任对 VBA 项目对象模型的访问)。
在开始此代码之前,我刚刚生成了一个名为 output.xlsm 的文件,该文件打开时没有问题,不包含 VBA,并且有多个工作表。
我希望这是清楚的 - 我是新手,这是我的第一个问题。
import os
import win32com.client
mydir = os.getcwd()
with open ('vbaProject.bin', 'rb') as myfile:
print('Reading macro into string from vbaProject.bin')
macro = myfile.read()
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False
workbook = excel.Workbooks.Open(Filename = mydir + '/output.xlsm')
excelModule = workbook.VBProject.VBComponents.Add(1)
excelModule.CodeModule.AddFromString(macro)
excel.Workbooks(1).Close(SaveChanges = 1)
excel.Application.Quit()
del excel
此代码添加 "Module1" 而不是 Microsoft Excel 对象。
此外,当我尝试关闭新的 Excel 文件时,我添加为 "Module1" 的宏没有正确形成。这是一些官话字符,而不是长脚本。
感谢您提供的任何帮助。
如果您想将代码添加到特定的、已经存在的 sheet,您需要使用那个 sheet 的代号作为 VBComponents
集合的索引。
excelModule = workbook.VBProject.VBComponents("SheetCodeName_NotSheetName")
excelModule.CodeModule.AddFromString(macro)
您也可以 .AddFromFile("path/to/file/filename")
或 .CreateEventProc("EventName", "ObjectName")
。
后者 returns 一个 Long
表示 EventProcedure
的开始,你可以
excelModule.CodeModule.InsertLines(LineNumberWhereToInsert, "Your code as String")
无论您选择如何插入代码,请确保其格式正确。 VBA 使用 4 个空格作为制表符,Windows 上的 CR + LF 组合和 Mac 上的 CR 用于换行。并且要格外小心特殊字符。
我在 VBA、Excel 中写了一个长脚本。我正在使用 Python 创建另一个 Excel 文件,我想将脚本嵌入到该文件中。我已经能够在 Excel 中添加一个宏作为 "Module1",但不能作为与特定工作表关联的 "Microsoft Excel Object"。它必须与一个命名工作表相关联,因为它会在您单击输入单元格时突出显示特定单元格。
我已将 vbaProject.bin 提取到与我要将其添加到的 Excel 文件相同的文件夹中。我还记得在 Excel 中设置正确的权限(文件 -> 选项 -> 信任中心 -> 信任中心设置 -> 宏设置 -> 信任对 VBA 项目对象模型的访问)。
在开始此代码之前,我刚刚生成了一个名为 output.xlsm 的文件,该文件打开时没有问题,不包含 VBA,并且有多个工作表。
我希望这是清楚的 - 我是新手,这是我的第一个问题。
import os
import win32com.client
mydir = os.getcwd()
with open ('vbaProject.bin', 'rb') as myfile:
print('Reading macro into string from vbaProject.bin')
macro = myfile.read()
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False
workbook = excel.Workbooks.Open(Filename = mydir + '/output.xlsm')
excelModule = workbook.VBProject.VBComponents.Add(1)
excelModule.CodeModule.AddFromString(macro)
excel.Workbooks(1).Close(SaveChanges = 1)
excel.Application.Quit()
del excel
此代码添加 "Module1" 而不是 Microsoft Excel 对象。
此外,当我尝试关闭新的 Excel 文件时,我添加为 "Module1" 的宏没有正确形成。这是一些官话字符,而不是长脚本。
感谢您提供的任何帮助。
如果您想将代码添加到特定的、已经存在的 sheet,您需要使用那个 sheet 的代号作为 VBComponents
集合的索引。
excelModule = workbook.VBProject.VBComponents("SheetCodeName_NotSheetName")
excelModule.CodeModule.AddFromString(macro)
您也可以 .AddFromFile("path/to/file/filename")
或 .CreateEventProc("EventName", "ObjectName")
。
后者 returns 一个 Long
表示 EventProcedure
的开始,你可以
excelModule.CodeModule.InsertLines(LineNumberWhereToInsert, "Your code as String")
无论您选择如何插入代码,请确保其格式正确。 VBA 使用 4 个空格作为制表符,Windows 上的 CR + LF 组合和 Mac 上的 CR 用于换行。并且要格外小心特殊字符。