Delete VBA code from all workbooks in a folder

匿名 (未验证) 提交于 2019-12-03 08:57:35

问题:

I am attempting to construct code to remotely loop through a folder with .xls files and delete the macros contained within. So far I have the individual components working, but am having difficulties activating the various workbooks and then programmatically ensuring "Microsoft Visual Basic for Application Extensibility 5.3" is referenced within each file.

Thanks!

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 

回答1:

Like I mentioned in my comments, you do not need to add a reference to Microsoft Visual Basic for Application Extensibility 5.3 to delete the code from the files. Consider this small exercise.

1). Create an Excel file

2). Paste this code in a module

Sub Sample1()     MsgBox "A" End Sub 

3). Save the above file as C:\Sample.xls

4). Close the file

5). Open a new excel file and paste this code in a module

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) Ensure that "Trust Access To Visual Basics Project" is enabled

7) Run the Sample2()

You will see that the code in Sample.xls is deleted and we haven't even set the reference to Microsoft Visual Basic for Application Extensibility 5.3.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!