10

这可能有点牵强,但是否有可能使用 pythonwin 或任何其他模块在 MS Excel(或使用 VBA 的任何其他 MS Office 产品)中使用 python 脚本创建 VBA。

这个想法的来源是 python 的 openpyxl 模块无法执行列自动宽度。我的脚本在内存中创建了一个工作簿并最终将其保存到磁盘。有很多工作表,每张工作表中都有不少列。我开始思考....如果我只是使用 python 将 VBA 脚本(保存在记事本或其他地方)导入到 Excel 中的 VBA 编辑器中,然后使用 pythonwin 从 python 运行该脚本。

就像是:

Workbooks.worksheets.Columns("A:Z").EntireColumn.Autofit

在您发表评论之前,是的,我已经看到了很多关于如何在 openpyxl 中解决自动调整列的 Pythonic 示例,但是我看到了一些有趣的机会,这些机会可以利用您从 VBA 获得的功能,而这些功能可能在 python 中不可用。

无论如何,我在互联网上挖了一下,我没有看到任何表明我可以的东西,所以我想我会问。

干杯,迈克

4

2 回答 2

8

对的,这是可能的。您可以开始查看如何在该 Microsoft KB上从 VB 生成 VBA 宏。

下面的 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上面定义的内容。

于 2013-10-21T22:56:08.503 回答
1

最佳答案只会添加宏,如果你真的想执行它还有一个步骤。

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')

添加模块名称将有助于消除任何现有脚本的冲突。

于 2021-01-14T20:21:05.350 回答