使用Python编写VBA脚本?

15
这可能有点牵强,但是否有可能使用Python脚本在MS Excel(或任何其他使用VBA的MS Office产品)中创建VBA,使用Pythonwin或任何其他模块? 我得到这个想法是因为Python的openpyxl模块无法自动调整列宽。我编写的脚本在内存中创建工作簿,并最终将其保存到磁盘上。有相当多的工作表和每个工作表中都有相当多的列。我开始想....如果我只使用Python将VBA脚本(在记事本或其他地方保存的)导入Excel中的VBA编辑器,然后使用Pythonwin从Python运行该脚本,会发生什么。类似于:
Workbooks.worksheets.Columns("A:Z").EntireColumn.Autofit

在您评论之前,我已经看到了许多关于如何解决openpyxl中自动调整列的Python示例,但我发现利用VBA提供的功能可能无法在Python中使用,可以有一些有趣的机会。

无论如何,我在互联网上搜索了一下,没有发现任何表明我可以这样做的内容,所以我想问一下。

谢谢, Mike


是的,你可以使用Python来用另一种语言编写程序,很可能是任何其他语言。 - martineau
2
如果您要启动 Excel 运行自动适应,则可以通过自动化创建整个内容。然后您就无需执行动态代码生成。 - Tim Williams
尽管这个问题有点陈旧,也许这个链接可以帮到你:https://www.pyxll.com/docs/macros.html - AnyOneElse
2个回答

11

可以的。您可以开始查看如何从VB生成VBA宏,网址是Microsoft KB

以下Python代码演示了如何实现相同的功能;这是KB示例代码的前一半的基本移植:

import win32com.client as win32

import comtypes, comtypes.client

xl = win32.gencache.EnsureDispatch('Excel.Application')
xl.Visible = True
ss = xl.Workbooks.Add()
sh = ss.ActiveSheet

xlmodule = ss.VBProject.VBComponents.Add(1)  # vbext_ct_StdModule

sCode = '''sub VBAMacro()
       msgbox "VBA Macro called"
      end sub'''

xlmodule.CodeModule.AddFromString(sCode)
你可以查看可见的自动化Excel宏,你会看到上面定义了VBAMacro

今天我有机会尝试和测试代码。非常感谢您的贡献。这让我朝着正确的方向迈出了一步。我还有很多其他想法,这段代码可能会对它们有所帮助。 - Mike
2
我在想。我在我的代码中使用openpyxl,我不想改变它。我在考虑,我可以运行所有的代码并创建工作簿并将其保存到磁盘。有没有办法在我的代码结束时获取那个工作簿,并使用win32运行你的代码,在那一点上添加子进程?我正在努力使用win32来打开现有的Excel表格,而不是像你上面所做的那样使用EnsureDispatch打开一个实例。 - Mike
如何“激活”(或“运行”)上述定义的宏? - Harsh Khad

4

顶部答案仅会添加宏,如果您实际上想要执行它,则还有一步。

import win32com.client as win32

xl = win32.gencache.EnsureDispatch('Excel.Application')
xl.Visible = True
ss = xl.Workbooks.Add()
xlmodule = ss.VBProject.VBComponents.Add(1)
xlmodule.Name = 'testing123'
code = '''sub TestMacro()
    msgbox "Testing 1 2 3"
    end sub'''
xlmodule.CodeModule.AddFromString(code)
ss.Application.Run('testing123.TestMacro')

加入模块名称可以帮助避免与现有脚本的冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接