python - 如何使用 Python 将“Microsoft Excel 对象”VBA 代码添加到 Excel 文件
问题描述
我有一个用 VBA 在 Excel 中编写的长脚本。我正在使用 Python 创建另一个 Excel 文件,并且我想将脚本嵌入到该文件中。我已经能够在 Excel 中将宏添加为“Module1”,但不能作为与特定工作表关联的“Microsoft Excel 对象”。它必须与一个命名的工作表相关联,因为它会在您单击输入单元格时突出显示特定的单元格。
我已将 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”的宏没有正确形成。这是几个 gobbledegook 字符,而不是长脚本。
谢谢你尽你所能的帮助。
解决方案
如果要将代码添加到特定的现有工作表,则需要使用该工作表的 CodeName 作为VBComponents
集合的索引。
excelModule = workbook.VBProject.VBComponents("SheetCodeName_NotSheetName")
excelModule.CodeModule.AddFromString(macro)
你也可以.AddFromFile("path/to/file/filename")
或.CreateEventProc("EventName", "ObjectName")
。
后者返回一个Long
指示EventProcedure
您可以在哪里开始
excelModule.CodeModule.InsertLines(LineNumberWhereToInsert, "Your code as String")
但是,您选择插入代码确保其格式正确。VBA 使用 4 个空格作为制表符,在 Windows 上使用 CR + LF 组合,在 Mac 上使用 CR 用于换行。并且对特殊字符要格外小心。
推荐阅读
- c++ - g++/clang++ 反转编译错误顺序
- go - 任何人都可以理解 connStateInterface 吗?
- python-3.x - 如何使用聊天机器人的 API 将 sqlite3 转换为 csv 格式?
- reactjs - 未为 ES6 设置默认道具作为默认值
- javascript - 映射默认值
- javascript - OnClick() 函数在 JavaScript 中不起作用
- php - 如何让控制器在 Symfony 4 中返回响应?
- wordpress - WooCommerce:如何在优惠券折扣中取消税收?
- sql - SQL Server 数据库使用特殊字符自动更新
- java - Java中Object类型值的累计和