Ошибка автоматизации VBA |Как удалить листы в копии документа Excel? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть следующий макет рабочего листа

enter image description here

Теперь я пытаюсь создать копиюдокумента и оставьте только два листа Chase_list и Summary

(однако мне нужно изменить расширение файла с .xlsm на .xlsx, чтобы я не мог использоватьSaveCopyAs метод)

Я попытался сделать это с помощью следующего кода (также первая строка работает правильно, не беспокойтесь об этом, переменные уже определены, фактическое удаление рабочей таблицы выполняетвред )

        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 голосов
/ 08 июня 2018

Возможно, вы пытаетесь удалить лист, который является последним в 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, и если у вас осталось более 1 Sheets, wks удаляется,valueInArray() - логическая функция, возвращающая информацию о том, было ли найдено значение в массиве.

0 голосов
/ 08 июня 2018

Проблема в том, что ваш лист называется Control Panel (пробел), но вы пытаетесь удалить Control_Panel (подчеркивание):

Сравните: enter image description here

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

Улучшение:
Вы можете использовать цикл для удаления всех листов, кроме Chase_list и Summary

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...