Excel 使用宏以编程方式删除工作簿中的所有代码

Excel 使用宏以编程方式删除工作簿中的所有代码,excel,vba,Excel,Vba,我需要用宏删除工作簿中的所有代码。我用的是这个代码,看起来 我在.VBComponents.Remove.VBComponentsx处收到错误,其中visual basic显示运行时错误“5”:过程调用或参数无效。根据,这个错误意味着要么我用错了我的程序,要么这个程序已经不存在了 如何修复此宏并使其与Office 2016配合使用?出现错误的原因不是因为代码太旧::p原因是您正在删除所有模块…包括带有DeleteAllModules:p ups的模块。 顺便说一句,以防您需要将reference

我需要用宏删除工作簿中的所有代码。我用的是这个代码,看起来

我在.VBComponents.Remove.VBComponentsx处收到错误,其中visual basic显示运行时错误“5”:过程调用或参数无效。根据,这个错误意味着要么我用错了我的程序,要么这个程序已经不存在了


如何修复此宏并使其与Office 2016配合使用?

出现错误的原因不是因为代码太旧::p原因是您正在删除所有模块…包括带有DeleteAllModules:p ups的模块。 顺便说一句,以防您需要将referencest设置为 Microsoft Visual Basic for Applications Extensibility 5.3 并将安全设置为不安全

详情请转到

但只是为了快速修复

Option Explicit
'@Folder("DevTools") 

Const devTools As String = "devTools" 
'This is the name of module with "RemoveAllModules" and it will be ignored

Private Sub RemoveAllModules()
Dim comp As VBComponent

 For Each comp In Application.VBE.ActiveVBProject.VBComponents
  If comp.Type = vbext_ct_ClassModule Or comp.Type = vbext_ct_StdModule Then
        If Not comp.name = devTools Then
            Application.VBE.ActiveVBProject.VBComponents.Remove comp
        End If
    End If
 Next

End Sub

出现错误的原因不是因为代码太旧::p原因是您正在删除所有模块…包括带有DeleteAllModules:p ups的模块。 顺便说一句,以防您需要将referencest设置为 Microsoft Visual Basic for Applications Extensibility 5.3 并将安全设置为不安全

详情请转到

但只是为了快速修复

Option Explicit
'@Folder("DevTools") 

Const devTools As String = "devTools" 
'This is the name of module with "RemoveAllModules" and it will be ignored

Private Sub RemoveAllModules()
Dim comp As VBComponent

 For Each comp In Application.VBE.ActiveVBProject.VBComponents
  If comp.Type = vbext_ct_ClassModule Or comp.Type = vbext_ct_StdModule Then
        If Not comp.name = devTools Then
            Application.VBE.ActiveVBProject.VBComponents.Remove comp
        End If
    End If
 Next

End Sub

正如sous2187所说,最好的方法是将文件保存为非宏文件,并让excel删除宏本身。所以我就是这么做的

Sub delhiddensheets()

    For Each sh In Worksheets
        If sh.Visible = xlSheetHidden Then
            sh.Delete
        End If
    Next sh

End Sub

Sub Valuepaste()

    Dim tabs As Object
    For Each tabs In Sheets
        With tabs
            If .Visible = True Then .Select Replace:=False
        End With
    Next tabs
    Cells.Select
    Range("A1").Activate
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A20").Select

End Sub

Sub DeleteAllCode()

    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    newname = Left(ActiveWorkbook.Name, (InStrRev(ActiveWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "_VALS.xlsx"
    ChDir ActiveWorkbook.Path
    ActiveWorkbook.SaveAs Filename:=newname, FileFormat:=xlOpenXMLWorkbook
    Valuepaste
    delhiddensheets

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.DisplayStatusBar = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True

End Sub

正如sous2187所说,最好的方法是将文件保存为非宏文件,并让excel删除宏本身。所以我就是这么做的

Sub delhiddensheets()

    For Each sh In Worksheets
        If sh.Visible = xlSheetHidden Then
            sh.Delete
        End If
    Next sh

End Sub

Sub Valuepaste()

    Dim tabs As Object
    For Each tabs In Sheets
        With tabs
            If .Visible = True Then .Select Replace:=False
        End With
    Next tabs
    Cells.Select
    Range("A1").Activate
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A20").Select

End Sub

Sub DeleteAllCode()

    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    newname = Left(ActiveWorkbook.Name, (InStrRev(ActiveWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "_VALS.xlsx"
    ChDir ActiveWorkbook.Path
    ActiveWorkbook.SaveAs Filename:=newname, FileFormat:=xlOpenXMLWorkbook
    Valuepaste
    delhiddensheets

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.DisplayStatusBar = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True

End Sub

为什么不把它保存为.xlsx呢?这将从工作簿中删除所有vba代码。当代码尝试删除内置工作表或工作簿模块时,会发生此错误。您链接的原始代码包含在错误恢复中,以避免出现此错误。@sous2817我认为您的想法是最好的。为什么不将其保存为.xlsx?这将从工作簿中删除所有vba代码。当代码尝试删除内置工作表或工作簿模块时,会发生此错误。您链接的原始代码包含在错误恢复中,以避免出现此错误。@sous2817我认为您的想法是最好的。最好测试vbext\u ct\u文档,因为您的代码不会删除现有的用户表单。您还需要保留第二个循环以从文档模块中删除代码。调试时,此处的vbext_ct_*变量在我的IDE中没有值。打印它们时,我只得到一个空行。您知道如何解决此问题吗?最好测试vbext\u ct\u文档,因为您的代码不会删除现有的用户表单。您还需要保留第二个循环以从文档模块中删除代码。调试时,此处的vbext_ct_*变量在我的IDE中没有值。打印它们时,我只得到一个空行。你知道我怎样才能解决这个问题吗?