VBA自动化错误|如何删除Excel文档副本中的工作表?

时间:2018-06-08 13:38:23

标签: excel excel-vba vba

我有以下工作表布局

enter image description here

  

现在我要做的就是创建一份文档副本,只保留两张Chase_listSummary

(但我需要将文件扩展名从.xlsm更改为.xlsx,以便我无法使用SaveCopyAs方法)

我尝试使用以下代码执行此操作(也是第一行正常工作,不用担心,变量已经定义,它实际工作表删除会造成伤害< / em>的)

        ThisWorkbook.SaveAs new_name & "_end_week_" & current_week - 1, 51, _ 
        accessMode:=xlExclusive
        Sheets("Chase_list").Cells.Copy
        Sheets("Chase_list").Cells.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False

        Application.DisplayAlerts = False
        Sheets("Instructions").Delete
        Sheets("03_000002").Delete
        Sheets("Additions").Delete
        Sheets("Data").Delete
        Sheets("Control Panel").Delete
        Application.DisplayAlerts = True

基本上它是什么,我们首先将数据粘贴到chase_list中作为值(因为它链接到我们正在删除的另一张纸),一旦我们这样做,我们就开始删除新保存的纸张.xlsx文件(也许这个事实不再是.xlsm会造成一些伤害?)

似乎可以像这样删除工作表:

enter image description here

不幸的是,我收到了以下错误

enter image description here

知道我在这里做错了什么吗?

  

注意:如果我单步执行代码,它似乎会在最后/前一行代码中崩溃

2 个答案:

答案 0 :(得分:1)

此处的问题是您的工作表名为Control Panel(空格),但您尝试删除Control_Panel(下划线):

<强>比较 enter image description here

                                                            Sheets("Control_Panel").Delete
'                                                       space vs undersore ^

<强>改进:
您可以使用循环删除Chase_listSummary

以外的所有工作表
Dim sh As Variant
For Each sh In Sheets
    If sh.Name <> "Chase_list" And sh.Name <> "Summary" Then
        sh.Delete
    End If
Next sh

替代方案:

如果错误仍然存​​在,请尝试将工作表复制到新工作簿中并保存。

Sheets(Array("Chase_list", "Summary")).Copy
With ActiveWorkbook
    Sheets("Chase_list").Cells.Copy
    Sheets("Chase_list").Cells.PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    .SaveAs
End With

答案 1 :(得分:0)

您可能正在尝试删除工作表,这是Excel中的最后一个工作表。当您尝试执行以下操作时,Excel将返回1004

Option Explicit

Public Sub TestMe()

    Dim wks As Worksheet
    Dim arrNames As Variant
    arrNames = Array("Chase_list", "Summary")

    For Each wks In Worksheets
        If Not valueInArray(wks.Name, arrNames) Then
            Application.DisplayAlerts = False
            If Sheets.Count > 1 Then wks.Delete
            Application.DisplayAlerts = True
        End If
    Next wks

End Sub

Public Function valueInArray(myValue As Variant, myArray As Variant) As Boolean

    Dim cnt As Long

    For cnt = LBound(myArray) To UBound(myArray)
        If CStr(myValue) = CStr(myArray(cnt)) Then
            valueInArray = True
            Exit Function
        End If
    Next cnt

End Function

您循环浏览Worksheets,如果剩余的Sheets超过1 wks,则会删除valueInArray();是一个布尔函数,返回信息是否在数组中找到了值。