Создать новую рабочую книгу для каждого рабочего листа, кроме определенных

У меня есть рабочая тетрадь с несколькими листами, которые нужно разделить на отдельные листы, но в этой книге также есть несколько рабочих листов, которые не требуются для создания новой рабочей книги.

Например, лист1 = общий лист2 = штатный лист3 = сайт1 лист4 = сайт2....

Теперь я хочу создать новые рабочие книги для Sheet3 (т.е. Site1) и Sheet4 (т.е. Site2)

Если я просто хочу исключить один из двух листов (в целом и персонал), он работает нормально, но когда я пытаюсь исключить оба листа, мое условие if не работает должным образом.

Ниже приведен код

Option Explicit


Sub SaveShtsAsBook()
Dim Sheet As Worksheet, SheetName$, MyFilePath$, N&
MyFilePath$ = ActiveWorkbook.Path & "\" & _
Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4)

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
     '      End With
    On Error Resume Next '<< a folder exists
    MkDir MyFilePath '<< create a folder
    For Each Sheet In Worksheets
        If Sheet.Name <> "Overall" Or Sheet.Name <> "Staff" Then
        Sheet.Copy
            With ActiveWorkbook
                With .ActiveSheet
                    [A1].Select
                    SheetName = ActiveSheet.Name
                End With
                .SaveAs Filename:=MyFilePath _
                & "\" & SheetName & ".xlsx"
                .Close SaveChanges:=True
            End With
            .CutCopyMode = False
        End If
    Next
End With
Sheet1.Activate
End Sub

PS Оператор If с условием ИЛИ вызывает проблему. Синтаксис правильный, но я не могу понять, когда условие if имеет условие OR, почему оно не проверяет условие.

2 ответа

Решение

Попробуйте перейти на Select CaseЯ думаю, что это легче понять, и в будущем у вас будет больше гибкости, чтобы добавить больше имен листов.

'For Each Sheet In Worksheets
For Each Sheet In ThisWorkbook.Worksheets ' Safer way to qualify the worksheets with the workbook where this code lies

    Select Case Sheet.Name
        Case "Overall", "Staff"
            ' do nothing

        Case Else
            Sheet.Copy
            With ActiveWorkbook
                With .ActiveSheet
                    [A1].Select
                    SheetName = ActiveSheet.Name
                End With
                .SaveAs Filename:=MyFilePath _
                & "\" & SheetName & ".xlsx"
                .Close SaveChanges:=True
            End With
            .CutCopyMode = False

    End Select
Next

Примечание: я бы поменял Sheet в качестве имени для вашего объекта листа и использовать что-то вроде Sht или же ws,

Давайте проверим ваше выражение:

If Sheet.Name <> "Overall" Or Sheet.Name <> "Staff" Then

Sheet.Name == "Общий" будет ложным или истинным, что приведет к истинному

Sheet.Name == "Staff" приведет к истине или ложи, что приведет к истине

Sheet.Name == "Что-то еще" приведет к истине или истине, что приведет к истине

Я думаю, что вам понравилось, а не или

If Sheet.Name <> "Overall" And Sheet.Name <> "Staff" Then

Sheet.Name == "Общий" будет ложным и верным, что приведет к ложному

Sheet.Name == "Staff" приведет к истинному и ложному, что приведет к ложному

Sheet.Name == "Что-то еще" приведет к истине и истине, что приведет к истине

Другие вопросы по тегам