Создать новую рабочую книгу для каждого рабочего листа, кроме определенных
У меня есть рабочая тетрадь с несколькими листами, которые нужно разделить на отдельные листы, но в этой книге также есть несколько рабочих листов, которые не требуются для создания новой рабочей книги.
Например, лист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 == "Что-то еще" приведет к истине и истине, что приведет к истине