【问题标题】:Error while trying to delete all sheets except specific ones尝试删除除特定工作表之外的所有工作表时出错
【发布时间】:2019-04-01 06:06:24
【问题描述】:

我想删除工作簿中的所有工作表,给定年份的月末工作表除外,例如工作表名称所有工作表名称都以这种格式输入 dd.mm.yy 我尝试了其他代码,例如 case 而不是 If 但所有代码似乎都停在 ws.delete

Sub Delete_Sheets
    Yr = InputBox("Use YY format only.", "Which year to keep?", 18)

    Dim ws As Worksheet

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "31.01.Yr" Or ws.Name <> "28.02.Yr" Or ws.Name <> "31.03.Yr" Or ws.Name <> "30.04.Yr" Or ws.Name <> "31.05.Yr" Or ws.Name <> "30.06.Yr" Or ws.Name <> "31.07.Yr" Or ws.Name <> "31.08.Yr" Or ws.Name <> "30.09.Yr" Or ws.Name <> "31.10.Yr" Or ws.Name <> "30.11.Yr" Or ws.Name <> "31.12.Yr" Then        
            ws.Delete
        End If
    Next

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

【问题讨论】:

  • 当您尝试删除工作簿上的最后一张工作表时,您的代码将停止。您当前的代码会删除每张纸。您必须使用And 而不是Or

标签: excel vba


【解决方案1】:
  • 仅使用 Application.InputBox method 而不是 InputBox。这个有一个Type:=1 参数,强制用户只输入数字。

  • 确保您测试ThisWorkbook.Worksheets.Count &gt; 1,因为您无法删除最后一个工作表。必须至少保留 1 个工作表。

  • 将您要跳过的所有工作表放入一个数组SkipSheets 并过滤该数组以获得您的工作表名称(UBound(Filter(SkipSheets, ws.Name)) &gt; -1)


Option Explicit

Public Sub DeleteSheets()
    Dim InputYear As Variant
    InputYear = Application.InputBox(Prompt:="Use YY format only.", Title:="Which year to keep?", Default:=18, Type:=1)

    If VarType(InputYear) = vbBoolean And InputYear = False Then Exit Sub 'user pressed cancel

    Dim SkipSheets() As Variant
    SkipSheets = Array("31.01." & InputYear, "28.02." & InputYear, "31.03." & InputYear, "30.04." & InputYear, "31.05." & InputYear, "30.06." & InputYear, "31.07." & InputYear, "31.08." & InputYear, "30.09." & InputYear, "31.10." & InputYear, "30.11." & InputYear, "31.12." & InputYear)

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If Not (UBound(Filter(SkipSheets, ws.Name)) > -1) And ThisWorkbook.Worksheets.Count > 1 Then
            ws.Delete
        End If
    Next ws

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

【讨论】:

  • 我试过了,没有报错,但没有删除。
  • @Younis 这不能我测试代码明确删除所有未命名为您在框中输入的年份中一个月的最后一天的工作簿。请注意,如果您只剩下 1 个工作表(最后一个工作表无法在 Excel 中删除),则它不起作用。
  • dd.mn.yy 是文本不是数字格式有什么关系吗
  • 可能是ThisWorkbookActiveWorkbook 的问题?
  • @Younis,您应该在要删除工作表的文件的模块中使用它。如果您在另一个工作簿中使用它,则必须替换 ThisWorkbook(编写此代码的工作簿)使用ActiveWorkbook(具有焦点的工作簿 / 位于顶部)。并使用键盘快捷键或功能区按钮运行它。 • Accepting Answers: How does it work?
【解决方案2】:

这是另一种方法。由于您不想删除每个月的最后一天,并且看起来所有工作表都相同:

Option Explicit
Sub Delete_Sheets()

    Dim ws As Worksheet, Month As Date, DontDelete As String, Yr As Integer

StartAgain:
    On Error Resume Next
    Yr = InputBox("Use YY format only.", "Which year to keep?", 18)
    On Error GoTo 0
    If Yr = 0 Then
        MsgBox "You didn't enter a valid value. Please Try Again"
        GoTo StartAgain
    End If

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    For Each ws In ThisWorkbook.Worksheets
        If Not ws.Name Like "??.??.??" And ThisWorkbook.Sheets.Count > 1 Then
            ws.Delete
            GoTo NextSheet
        End If
        Month = DateSerial(Yr, Mid(ws.Name, 4, 2), 1)
        DontDelete = Format(Application.EoMonth(Month, 0), "dd.mm.yy")
        If Not ws.Name = DontDelete Then
            ws.Delete
        End If
NextSheet:
    Next

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub

编辑:我已经编辑了一些代码,但它不会引发任何错误。现在它不应该删除它所做的某些工作表。但是你不会出错。

这是代码的结果:

【讨论】:

  • 您还需要在.Delete 之前测试ThisWorkbook.Worksheets.Count &gt; 1,否则它可能会尝试删除最后一张剩余的工作表,然后失败。 • 如果返回字符串,Month = Mid(ws.Name, 4, 2) 会出错。
  • 是的@Pᴇʜ 这是可能的。但我假设他的工作簿有数百张,并且每个月的最后一天都有,所以它不应该删除所有的工作表。但确实是有可能的。我的目标是让代码在每次迭代时动态地在每月的最后一天变得简单,因此无需填充数组或任何东西。
  • 我刚刚提到它是因为实际上 OP 恰好遇到了这个错误,因为 OP 代码试图删除 所有 工作表,因为他的 If 始终为真。例如。如果他输入一个不存在的年份,他最终会在编辑器中出现未捕获的错误。
  • 是的,我已经在 OP 上告诉他了,但是我已经测试了这段代码并且工作正常。
  • 是的,我的代码有错误,但它已排序。所以它现在不会删除它。无论如何,之前的代码和更正的代码都不应该给你任何错误,因为它们都被处理了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多