【问题标题】:Copy "two specific sheets" into a new workbook将“两个特定工作表”复制到新工作簿中
【发布时间】:2016-08-17 08:16:48
【问题描述】:

当我们有一个包含多张工作表的工作簿时

sheet_1, sheet_2, ..., sheet_n, sheet_constant

我们喜欢用两张成对的工作表创建 n 个工作簿

workbook 1: sheet_1, sheet_constant
workbook 2: sheet_2, sheet_constant
...
workbook n: sheet_n, sheet_constant

我们如何用 vba 做到这一点?

我知道我们可以用这个复制一张纸

Sub CopySheet()
  ThisWorkbook.Sheets("sheet_1").Copy
  Application.Dialogs(xlDialogSaveAs).Show
End Sub

我试过这个没有成功

Sub CopySheets()
  ThisWorkbook.Sheets("sheet_1").Copy
  ThisWorkbook.Sheets("sheet_constant").Copy
  Application.Dialogs(xlDialogSaveAs).Show
End Sub

【问题讨论】:

  • 这是一项重复性任务,特定于其他用例。做了研究,只找到一张纸的解决方案。

标签: vba excel copy


【解决方案1】:

你可以使用:

Sub CopySheets(VariableSheetName As String, ConstantSheetName As String)
    ThisWorkbook.Sheets(Array(VariableSheetName, _
                              ConstantSheetName)).Copy
    Application.Dialogs(xlDialogSaveAs).Show
End Sub

注意:同时复制两张工作表的好处是,工作表之间的任何引用都不会突然变成原始工作簿的链接,如果您一个接一个地复制工作表,就会发生这种情况。

这个子程序可以这样调用:

CopySheets "sheet_1", "sheet_constant"
CopySheets "sheet_2", "sheet_constant"
CopySheets "sheet_3", "sheet_constant"

或循环(假设您的工作表中确实有数字)

For i = 1 To 3
    CopySheets "sheet_" & i, "sheet_constant"
Next

或者,如果您想要复制所有工作表:

For Each ws in Worksheets
    If ws.Name <> "sheet_constant" Then
        CopySheets ws.Name, "sheet_constant"
    End If
Next

【讨论】:

  • 如果您向Sub CopySheets(intSheet as Integer) 添加一个参数,然后将第一个数组元素从"Sheet_1" 更改为intSheet,这将完全按照他想要的方式工作
  • @dbmitch - 感谢您的建议 - 我已经编辑了答案以将 both 表作为参数传递。 (如果 gco 应用程序的任何后续用户可以查看调用代码并看到提到的两个工作表,这可能更直观。)
【解决方案2】:

基于@YowE3K 的回答,这个更通用一点,并且有自动保存选项。

Sub CopySheets()
    Dim ws As Worksheet
    ChDir (ThisWorkbook.Path)
    For Each ws In ActiveWorkbook.Worksheets
        If ws.Name = "sheet_constant" Then GoTo NextIteration
        ThisWorkbook.Sheets(Array(ws.Name, "sheet_constant")).Copy
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False
        ActiveWorkbook.SaveAs Filename:=ws.Name, FileFormat:=xlNormal, CreateBackup:=False
        ActiveWorkbook.Saved = True
        ActiveWindow.Close
        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
NextIteration:
    Next ws

End Sub

【讨论】:

  • 在该代码中使用i 会导致问题,除非“sheet_constant”是循环中处理的最后一张纸。您可以使用ThisWorkbook.Sheets(Array(ws.Name, "sheet_constant")).Copy 修复它。 (您也可以通过在标签后移动i = i + 1 来修复它,但无论如何都不需要i,因此更容易摆脱它。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多