【问题标题】:Error "subscript out of range"错误“下标超出范围”
【发布时间】:2018-05-11 21:14:54
【问题描述】:

我想自动删除个人工作簿中存在的所有 VBA 模块,我正在尝试下面的代码,但这显示错误 9 说“下标超出范围” 请帮我解决这个错误

Sub deletemodule()
    Dim vbCom As Object
    Dim i As Integer
    For i = 2 To 10
        On Error GoTo abc
        Set vbCom = Application.VBE.ActiveVBProject.VBComponents
        vbCom.Remove vbComponent:=vbCom.Item("Module" & i)
    Next
abc:
End Sub

提前致谢

【问题讨论】:

  • 在片场还是 .Remove 行?
  • 您运行的是国际版 Excel 吗?不同版本的模块默认名称不同。验证您的模块的名称是否符合 ModuleX 语法。
  • 这可能有帮助吗? link

标签: excel vba


【解决方案1】:

尝试还原循环:

For i = 10 To 2 step -1
On Error GoTo abc
Set vbCom = Application.VBE.ActiveVBProject.VBComponents
vbCom.Remove vbComponent:=vbCom.Item("Module" & i)
Next

【讨论】:

  • 如何在此处添加屏幕截图,请帮助
  • 我不建议更改名称,而是恢复循环。我猜您正在尝试从不再存在的集合中删除项目。如果您删除项目编号。 2 然后没有更多的项目编号。 10 因为它被移动到位置没有。 9. 等等...
  • 我同意,但在这种情况下,模块的名称不会更改,并且会与之前的“module10”保持一致,只是位置将从第 10 号更改为第 9 号。
  • 如果我可以计算没有可用的模块,那么可能会有一个解决方案,那么 i 的上限将设置为该编号。我觉得不太确定……
  • 查看@JvdV 提出的链接,提供我的另一个答案或.count 与此答案相似的替代答案。
【解决方案2】:

此代码从工作簿中删除所有标准和类模块。
请注意确定还有哪些其他类型 - 图表工作表、表格、宏工作表(?)

模块是一个集合,因此您可以使用 For...Each 循环逐步遍历它们,而无需事先知道它们的数量或名称。

Public Sub DeleteAllModules()

    Dim vbcom As Object
    Dim vMod As Object

    Set vbcom = Application.VBE.ActiveVBProject.VBComponents

    For Each vMod In vbcom
        Select Case vMod.Type
            Case 1, 2 'Standard & Class modules
                vbcom.Remove vMod
            Case 100 'Sheet & ThisWorkbook modules
                'Do nothing
        End Select
    Next vMod

End Sub

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多