【问题标题】:Excel: Copy workbook to new workbookExcel:将工作簿复制到新工作簿
【发布时间】:2023-10-07 09:33:01
【问题描述】:

所以在问这个问题之前,我搜索并发现了一些与我在这里想要做的事情相似的事情。

基本上我有工作簿 AlphaMaster。这个工作簿是一个模板,我想用它来创建每周的新工作簿。

在此工作簿中,有名为:Monday-Saturday 的工作表和其他工作表,对应的日期为 Mon、Tues 等。

我创建了一个在打开工作簿时加载的表单。我想要的是当我点击表单运行时:

  • 将代码保存模板作为新工作簿运行
  • 根据来自 userform1 的输入重命名工作簿
  • 用适当的工作日重命名工作簿

    工作簿以 6 张工作表的周末日期命名,在此之后(例如一周结束 1 月 5 日)被重命名为:

周末:2014 年 1 月 5 日 日期 周一:12 月 30 日 周二:12月31日 周三:1 月 1 日 星期四:1月2日 周五:1月3日 周六:1 月 4 日

比点击命令。到目前为止,这就是我所拥有的:

 Private Sub CommandButton1_Click()
Dim thisWb As Workbook, wbTemp As Workbook
Dim ws As Worksheet

On Error GoTo dummkopf

Application.DisplayAlerts = False

Set thisWb = ThisWorkbook
Set wbTemp = Workbooks.Add

On Error Resume Next
For Each ws In wbTemp.Worksheets
    ws.Delete
Next
On Error GoTo 0

For Each ws In thisWb.Sheets
    ws.Copy After:=wbTemp.Sheets(1)
Next

wbTemp.Sheets(1).Delete
wbTemp.SaveAs "blahblahblah\New.xlsx"

new.xlsx 我想从表单中填写

Vorfahren:
Application.DisplayAlerts = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Vorfahren
End Sub

并发症:

目前,虽然这确实有效,但我无法更改文档的名称,它以我在 .saveAs 区域中的名称命名。我想我需要创建一个备用函数来处理这个问题。其次,当它完成时,我的工作表以模板的相反顺序显示。

我们将不胜感激有关从这里去哪里的一些指导/建议!

【问题讨论】:

    标签: vba excel save


    【解决方案1】:

    这里有几个问题:

    您不能删除工作簿中的所有工作表。

    您应该将工作表复制到末尾以保留顺序(如果源工作簿中的工作表已排序):

    For Each ws In thisWb.Sheets
        ws.Copy After:=wbTemp.Sheets(wbTemp.Sheets.Count)
        wbTemp.Sheets(wbTemp.Sheets.Count).Name = "NewSheetName" ' <-- Rename the copied sheet here
    Next
    

    如果您的源工作表没有名称“Sheet#”,则之后删除默认工作表。

    Application.DisplayAlerts = False
    For Each ws In wbTemp.Sheets
        If Instr(1, ws.Name, "Sheet", vbTextCompare) > 0 Then ws.Delete
    Next
    Application.DisplayAlerts = True
    

    另存为,请参考Workbook.SaveAs Method (Excel)

    【讨论】:

    • 谢谢帕特里克,有趣的是,你如何得到一个错误,而我没有。我对此感到很困惑。该链接实际上很有帮助,它引导我找到重命名工作簿问题所需的内容。原始工作簿确实有工作表的名称,Mon./Tues./Weds/12.1/12.2/12.3 我仍在尝试解决的问题我想是 VBA 中是否有办法在复制过程中重命名工作表来自用户输入表单?
    • 我没有使用你的所有代码,如果你删除所有On Error... 行,你就会得到它。是否故意向您展示我在说什么 - 最后删除所有默认工作表,因此无需重复工作表删除:wbTemp.Sheets(1).Delete 在保存之前。
    • 复制后重命名工作表...查看更新的代码(我不明白你的工作表命名约定)
    【解决方案2】:

    我在我的应用程序中使用它并且效果很好

    Set bFso = CreateObject("Scripting.FileSystemObject")
    bFso.CopyFile ThisWorkbook.FullName, destinationFile, True     
    

    复制后,您可以在新的 Excel 对象中打开它,然后用它做任何您想做的事情。

    【讨论】: