更改数百个Excel文件中的VBA代码,而无需打开其中的每个文件

时间:2019-06-27 16:49:48

标签: python loops nested

我有一个数百个已提交表单的数据库,每个已提交表单都包含各种带有VBA代码的模块,用于处理数据。

每个表单文件名都以相同的唯一前缀开头。

所有表格都保存在我们的主要文档全局目录中。

每种表单的数据都记录到一个日志文件中。

每个表格中的VBA代码使我可以更改表格中的信息并将更新后的信息发送到日志中。

现在由于引入了Office 2019,2016年版本中制作的每种形式的vb脚本均无法正常工作,我不得不强制更改每种形式的代码以使其与2019年兼容。

由于Office版本的更改,不仅需要进行此大规模更改,而且还因为我需要使用旧VBA代码无法处理的表格单元格中包含的其他信息来更新日志文件。

每个表单文件中都有4个VBA模块,每个模块中的脚本都需要用新代码替换。

真的不知道从哪里开始,任何想法都会受到赞赏。

我不知道该怎么尝试。

预期结果是,我已经更新/更新了当前存在于100多个文件中的4个宏模块的代码,这些代码需要替换为以通用唯一前缀开头的excel文件的旧代码。

1 个答案:

答案 0 :(得分:0)

您可以使用VBA修改VBA项目。为此,必须在“信任中心/宏设置”中选中“对VBA项目对象模型的信任访问权限” 复选框。

然后,打开VBA编辑器。设置对“ Microsoft Visual Basic for Applications Extensibility 5.3” 的引用(可能是您所用的版本不同,我不知道)。

现在VBIDE库下提供了两个附加的类,这些类可用于以编程方式操纵VBA项目。 (我正在使用此功能导出VBA模块以进行源代码控制。)

没有简单的方法来修改模块的文本,但是您可以尝试导出,删除和重新导入它们以查看是否足够:

Sub Test()
  Dim vbcs As VBIDE.VBComponents
  Dim vbc As VBIDE.VBComponent
  Dim filename As String

  Set vbcs = ActiveWorkbook.VBProject.VBComponents

  For Each vbc In vbcs
    Debug.Print vbc.name
    If vbc.name = "The ones you want" Then
      filename = GetFilenameFromModule(vbc)
      vbc.Export filename
      ' you could modify the file contents now if needed
      vbcs.Remove vbc
      vbcs.Import filename
    End If
  Next vbc
End Sub

Private Function GetFilenameFromModule(vbc As VBIDE.VBComponent) As String
  Select Case vbc.Type
    Case vbext_ct_ClassModule, vbext_ct_Document:
      GetFilenameFromModule = vbc.name & ".cls"
    Case vbext_ct_MSForm:
      GetFilenameFromModule = vbc.name & ".frm"
    Case vbext_ct_StdModule:
      GetFilenameFromModule = vbc.name & ".bas"
  End Select
End Function

请确保在调试器或对象浏览器(F2)中检查各种对象的属性,以查看可用的对象。我不确定所有这些文档的记录情况如何,但是它的用途广泛且稳定。

要在VBA中轻松处理文件,您可以设置对“ Microsoft脚本运行时”库的引用并使用FileSystemObject。