【问题标题】:Remove vba modules using python?使用python删除vba模块?
【发布时间】:2016-07-08 18:09:37
【问题描述】:

鉴于here 和 [.

的答案,似乎 win32api 应该能够做到这一点

我想使用 python 从 excel 工作簿 (.xls) 中删除所有模块

【问题讨论】:

  • 观察到相同的行为。

标签: python excel winapi


【解决方案1】:

考虑使用可通过 Python 的 win23com.client 模块访问的 COM 接口中的 VBComponents collection。但是,在特定工作簿中,您需要先授予programmatic access to the VBA object library

此外,您需要有条件地设置类型,因为此过程无法删除对象模块,包括工作表 (Type = 100) 和工作簿 (Type = 100)。只能删除标准模块 (Type = 1)、类模块 (Type = 2)、用户窗体 (Type= 3) 和其他插入的组件。当然,您可以遍历要删除的已定义模块列表。 Try/Except 语句用于有效地关闭 Excel.Application 进程,无论脚本是否失败。

import win32com.client

# OPEN EXCEL APP AND WORKBOOK
xlApp = win32com.client.Dispatch("Excel.Application")
xlwb = xlApp.Workbooks.Open("C:\\Path\\To\\Workbook.xlsm")

# ITERATE THROUGH EACH VB COMPONENT (CLASS MODULE, STANDARD MODULE, USER FORMS)
try:    
    for i in xlwb.VBProject.VBComponents:        
        xlmodule = xlwb.VBProject.VBComponents(i.Name)
        if xlmodule.Type in [1, 2, 3]:            
            xlwb.VBProject.VBComponents.Remove(xlmodule)

except Exception as e:
    print(e)

finally:    
    # CLOSE AND SAVE AND UNINITIALIZE APP
    xlwb.Close(True)
    xlApp.Quit

    xlApp = None

【讨论】:

  • 非常有趣。我将在今天进行测试,并在它起作用时接受 - 这似乎正是我想要的。
  • 测试成功了吗?请务必在工作簿中授予编程访问权限。
【解决方案2】:

实际上,只需使用xlrd 读取文件,使用xlutils 进行复制,然后使用xlwt 将其吐出即可删除VBA(和其他内容):

import xlrd, xlwt
from xlutils.copy import copy as xl_copy
rb = xlrd.open_workbook('/path/to/fin.xls')
wb = xl_copy(rb)
wb.save('/path/to/fou.xls')

【讨论】:

  • “将删除 [...] 其他内容” 可能是不可取的。至少,它应该记录在案,它是什么。
  • 好点,@IInspectable!我会做一些研究来找出还有什么被删除的。
  • 请参阅此问题以讨论有关删除的其他内容stackoverflow.com/questions/3723793/…
  • @bernie 您能否在回复中包含有关保留单元格格式参数的信息(调用formatting_info=Trueopen_workbook method)?我正在参考xlrd.readthedocs.io/en/latest/api.html 和您在评论中的注释。
猜你喜欢
  • 2011-01-30
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多