【问题标题】:Delete VBA code from all workbooks in a folder从文件夹中的所有工作簿中删除 VBA 代码
【发布时间】:2013-11-27 15:48:35
【问题描述】:

我正在尝试构建代码以远程循环遍历包含 .xls 文件的文件夹并删除其中包含的宏。到目前为止,我的各个组件都在工作,但是在激活各种工作簿然后以编程方式确保在每个文件中引用“Microsoft Visual Basic for Application Extensibility 5.3”时遇到了困难。

谢谢!

Sub LoopFiles()

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False

strPath = ' enter path here

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.DisplayAlerts = False

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder(strPath)

For Each objfile In objFolder.Files


If objFso.GetExtensionName(objfile.Path) = "xls" Then
   Set Objworkbook = objExcel.Workbooks.Open(objfile.Path)
    ' Include your code to work with the Excel object here
    Objworkbook.Activate

    AddReference (objfile)

   Objworkbook.Close True 'Save changes
End If

Next

Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub




Sub AddReference(FileRequired)

     FileRequired.Activate
     'MsgBox "Sheet: " & ActiveWorkbook.Name

     ActiveWorkbook.VBProject.References.AddFromGuid _
     GUID:="{0002E157-0000-0000-C000-000000000046}", _
     Major:=5, Minor:=3
End Sub




Sub DeleteAllVBACode()

        Dim VBProj As VBIDE.VBProject
        Dim VBComp As VBIDE.VBComponent
        Dim CodeMod As VBIDE.CodeModule
        Set VBProj = ActiveWorkbook.VBProject


        For Each VBComp In VBProj.VBComponents
            If VBComp.Type = vbext_ct_Document Then
                Set CodeMod = VBComp.CodeModule
                With CodeMod
                    .DeleteLines 1, .CountOfLines
                End With
            Else
                VBProj.VBComponents.Remove VBComp
            End If
        Next VBComp
    End Sub

【问题讨论】:

  • 我不确定我是否理解...如果要从中删除宏,为什么需要在所有文件中引用?还是我误解了您的问题?
  • @Siddharth 我认为他想参考 VBA 可扩展性 5.3,以便他可以访问 VBIDE 以删除宏。 @ user1857500 如果是这种情况,那么您不需要在您正在打开的工作簿中引用可扩展性,只需您正在运行的工作簿即可手动完成。您只需要确保您访问正确的 VBProject,我会将 Objworkbook 传递到您的 DeleteAllVBACode 调用中。
  • @CuberChase:您不需要设置对它的引用来删除宏。您需要为此启用Trust Access To Visual Basics Project。
  • @Siddharth 如果您想通过代码删除宏,您需要在您的 VBAProject 中引用 VBA Extensibility 5.3(即 VBIDE 对象模型)。
  • @CuberChase:不,那不是真的。

标签: vba excel


【解决方案1】:

就像我在 cmets 中提到的,您无需添加对 Microsoft Visual Basic for Application Extensibility 5.3 的引用即可从文件中删除代码。考虑一下这个小练习。

1)。创建 Excel 文件

2)。将此代码粘贴到模块中

Sub Sample1()
    MsgBox "A"
End Sub

3)。将上述文件另存为C:\Sample.xls

4)。关闭文件

5)。打开一个新的 excel 文件并将此代码粘贴到模块中

Option Explicit

'~~> Trust Access To Visual Basics Project must be enabled.
Sub Sample2()
    Dim wb As Workbook
    Dim i As Long

    '~~> Replace this with the relevant file
    '~~> We can open the files in a loop as well
    Set wb = Workbooks.Open("C:\Sample.xls")

    On Error Resume Next
    With wb.VBProject
        '~~> Remove the components
        For i = .VBComponents.Count To 1 Step -1
            .VBComponents.Remove .VBComponents(i)
        Next i
        '~~> Remove the code lines
        For i = .VBComponents.Count To 1 Step -1
            .VBComponents(i).CodeModule.DeleteLines _
            1, .VBComponents(i).CodeModule.CountOfLines
        Next i
    End With
    On Error GoTo 0
End Sub

6) 确保启用“信任对 Visual Basics 项目的访问”

7) 运行Sample2()

你会看到Sample.xls中的代码被删除了,我们甚至没有设置对Microsoft Visual Basic for Application Extensibility 5.3的引用。

【讨论】:

  • 感谢您的回答!直到早上我才有机会实施您的示例
  • 如果您有 xl2007/10/13,您可以将文件另存为 .xlsx 以直接删除代码。
  • @brettdj 您的上述评论值得回答——这正是我看到标题时的第一个想法。
  • @PeterL。我发现 SaveAs 方法有两个问题。 1@brettdj 提到用户需要 xl2007+ 2 在很多情况下我不希望更改文件扩展名。因为我的许多用户仍然使用 xl2003。因此,如果我有 xl2007+,则必须将文件保存为 xlsx,然后将其重新保存为 xls,最后删除 xlsx。我觉得太头疼了。话虽如此,如果用户可以将文件保存为 xlsx,那么绝对值得......
  • @SiddharthRout 完全同意,但对于 VBA 新手来说,这是一个选项:所有代码都可以从宏记录器生成。总而言之,我会 +1 这个)
猜你喜欢
  • 2014-03-28
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多