【问题标题】:How to add "Microsoft Excel Object" VBA code to Excel file using Python如何使用 Python 将“Microsoft Excel 对象”VBA 代码添加到 Excel 文件
【发布时间】:2019-08-04 19:03:25
【问题描述】:

我有一个用 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 字符,而不是长脚本。

感谢您提供的任何帮助。

【问题讨论】:

  • 是否可以选择将 Excel 文件另存为模板 (.xltm) 并在每次运行代码时获取新副本?如果您需要一个不同的工作表名称,您可以在之后简单地重命名它。
  • L8n - 我认为没关系,如果您通过它看到解决方案。使用模板与使用预安装宏的输入 xlsm 并修改它有什么不同吗?如果我不能让它工作,这是我正在考虑的一种解决方法。但可能需要重新设计相当多的代码。
  • 不,你可以使用任何一个,我喜欢模板文件更难让用户搞砸的方式。

标签: python excel vba win32con


【解决方案1】:

如果要将代码添加到特定的现有工作表,则需要使用该工作表的 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 用于换行。并且对特殊字符要格外小心。

【讨论】:

  • 这太棒了!最初我试图将 VBA 项目添加为二进制文件,但不仅不需要转换,而且更加用户友好。感谢您的改进!
猜你喜欢
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多