Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 为每个工作表(特定工作表除外)创建新工作簿_Vba_Excel - Fatal编程技术网

Vba 为每个工作表(特定工作表除外)创建新工作簿

Vba 为每个工作表(特定工作表除外)创建新工作簿,vba,excel,Vba,Excel,我有一个包含多个工作表的工作簿,这些工作表将被划分为各个站点的工作表,但该工作簿也有一些工作表,创建新工作簿时不需要这些工作表 例如,Sheet1=总体Sheet2=员工Sheet3=站点1 Sheet4=站点2 现在我想为Sheet3(即Site1)和Sheet4(即Site2)创建新的工作簿 如果我只想排除两张工作表中的一张(总体和人员),它可以正常工作,但是当我尝试排除两张工作表时,我的If条件似乎不能正常工作 下面是代码 Option Explicit Sub SaveShtsAsB

我有一个包含多个工作表的工作簿,这些工作表将被划分为各个站点的工作表,但该工作簿也有一些工作表,创建新工作簿时不需要这些工作表

例如,Sheet1=总体Sheet2=员工Sheet3=站点1 Sheet4=站点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
选项显式
子SaveShtsAsBook()
将工作表尺寸标注为工作表,SheetName$,MyFilePath$,N&
MyFilePath$=ActiveWorkbook.Path&“\”和_
左(ThisWorkbook.Name,Len(ThisWorkbook.Name)-4)
应用
.ScreenUpdate=False
.DisplayAlerts=False
"以

在“错误恢复下一步”尝试切换到
选择大小写
,我认为这更容易理解,而且您将来可以更灵活地在其中添加更多图纸名称

'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
之类的内容尝试切换到
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==“总体”将为false或true,结果为true

Sheet.Name==“Staff”将导致true或false,结果是true

Sheet.Name==“Something other”将导致true或true结果true

我想你喜欢而不是

If Sheet.Name <> "Overall" And Sheet.Name <> "Staff" Then
如果表名为“总体”,表名为“员工”,则
Sheet.Name==“总体”为假,为真,导致false

Sheet.Name==“Staff”将导致true和false,导致false的是


Sheet.Name==“Something other”将导致true,而true将导致true

让我们检查一下您的表达式:

If Sheet.Name <> "Overall" Or Sheet.Name <> "Staff" Then
如果表名为“总体”或表名为“员工”,则
Sheet.Name==“总体”将为false或true,结果为true

Sheet.Name==“Staff”将导致true或false,结果是true

Sheet.Name==“Something other”将导致true或true结果true

我想你喜欢而不是

If Sheet.Name <> "Overall" And Sheet.Name <> "Staff" Then
如果表名为“总体”,表名为“员工”,则
Sheet.Name==“总体”为假,为真,导致false

Sheet.Name==“Staff”将导致true和false,导致false的是


Sheet.Name==“Something other”将导致true和true,如果您想排除整个工作表和员工工作表,则将
更改为
。希望您能看到问题,您需要它同时通过两个条件,而不是一个条件。如果您想同时排除整个工作表和员工工作表,请将
更改为
。希望你能看到这个问题,你需要它通过两个条件,而不仅仅是一个。嗨,这项工作做得很好。。另外,如果你能帮我解决我的另一个未回答的问题,嗨,这项工作做得很好。。另外,如果你能帮我解决我的另一个未回答的问题Hi Bodo,即使这项工作很好,但我使用了case函数,而不是if。。非常感谢。另外,如果你能帮我解决我的另一个未回答的问题Hi Bodo,即使这项工作也很好,但我使用了case函数,而不是if。。非常感谢。另外,如果你能帮我解决另一个未回答的问题