【问题标题】:Excel VBA copy multiple worksheets from a Source File to Production fileExcel VBA 将多个工作表从源文件复制到生产文件
【发布时间】:2015-10-13 20:36:30
【问题描述】:

我正在尝试使用 Excel VBA 自动化日常流程,以从源文件中复制 6 个工作表并在 Prod 文件中创建副本并用相同名称替换旧的同名工作表。这将成为“日常重复过程” 我需要将 6 个工作表从源文件复制到产品文件。两个文件中的工作表名称相同,并且希望保留相同的工作表名称,因为我有公式提供 Prod 文件 - 主报告。

我不确定首先从 Prod 文件中删除以前的工作表然后将当前工作表复制到 Prod 文件中的最有效和最有效的方法是什么。

或者

将源文件工作表复制到产品文件,这将创建一个编号为 2 的副本,删除之前的工作表并从当前工作表名称中删除 2。

像往常一样,我很感谢这个总能找到解决方案的网站。

流程如下:

从源文件 - 我想复制以下工作表:

文件名、工作表名和日期约定

源文件名:CM Prism MTD ROR MMDDYYYY.xlsx

工作表:

  • 全球活跃
  • 主动 USRR
  • 活跃指数
  • MACO
  • 分位数
  • HY

到 Prod 文件 – 工作表名称将保持不变并替换之前的工作表。

文件名、工作表名和日期约定

产品文件名:CM Composite MTD as of MM.DD.xlsm

工作表:

  • 全球活跃
  • 主动 USRR
  • 活跃指数
  • MACO
  • 分位数
  • HY

此外,源文件工作表在单元格“D4”上的估价日期为“09-Oct-2015”,我想在其中添加“估价日期检查”以确保从源文件复制工作表Prod 文件的估价日期与单元格“D6”上的 Prod 文件相同,为“10/09/2015”。 因此,如果评估日期与 Prod 文件的副本相同,则不要复制它。 目标是添加任何不针对评估日期的警报或触发器。

这就是我所拥有的:

Sub copyNreplaceWorksheets()

Application.EnableEvents = False

Dim DpathSource As String
Dim DpathProd As String
Dim FolderName As String
Dim FileNameSource As String
Dim FileNameProd As String
Dim HolidayList
Dim RptDateSource As Date
Dim RptDateProd As Date

Dim wkbSource As Workbook
Dim wkbProd As Workbook
Dim shtToCopy As Worksheet


Set HolidayList = Range("I77:I86")

''****Set the Report File Date*****
'''Source File: CM Prism MTD ROR MMDDYYYY.xlsx
RptDateSource = Format(WorksheetFunction.WorkDay(Now(), -1, HolidayList), "mmddyyyy")

'''Prod File: CM Composite MTD as of MMDD.xlsm
RptDateProd = Format(WorksheetFunction.WorkDay(Now(), -1, HolidayList), "mm.dd")

'''****Set the File Name*****
'''Source File: CM Prism MTD ROR MMDDYYYY.xlsx
FileNameSource = "CM Prism MTD ROR" & RptDateSource & ".xlsx"

'''Prod File: Aladdin Composite MTD as of MMDD.xlsm
FileNameProd = "CM Composite MTD as of" & RptDateProd & ".xlsm"

'''****Set the Directory Path****
DpathSource = "U:\Performance\CM Performance\" & FileNameSource & ""
DpathProd = "U:\Performance\ROR calculations\2015\Daily Returns\" & FileNameProd & ""


Set wkbSource = Workbooks.Open("DpathSource")
Set wkbProd = Workbooks.Open("DpathProd")
Set shtToCopy = wkbSource.Sheets("Active US")
shtToCopy.copy wkbProd.Sheets("Active US")

Application.EnableEvents = True

结束子

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我认为删除之前的工作表(如果存在)会更合乎逻辑,并且将来更容易解释。使用这样的函数:

    Sub DeleteSheet(fromWorkbook as Workbook, sheetName as String)
        'Deletes a named sheet from a workbook
        '  error would occur if the sheet doesn't exist (subscript out of range)
        '  which is ignored by Resume Next
        On Error Resume Next
        Application.DisplayAlerts = False
        fromWorkbook.Sheets(sheetName).Delete
        Application.DisplayAlerts = True
        On Error GoTo 0
    End Sub
    

    然后,在您需要制作副本的代码中,执行以下操作:

    Set shtToCopy = wkbSource.Sheets("Active US")
    Call DeleteSheet(wkbProd, "Active US")
    shtToCopy.copy wkbProd.Sheets(wkbProd.Sheets.Count)
    

    您需要在此处删除双引号:

    Set wkbSource = Workbooks.Open(DpathSource)
    Set wkbProd = Workbooks.Open(DpathProd)
    

    【讨论】:

    • 感谢大卫的建议。我的代码似乎很长,有没有办法用源文件和产品文件的所有 Dim 来简明扼要。
    • 我不认为你的代码有什么问题,它已经很简洁了。您可以在一行中声明多个变量,但我不喜欢这样做,例如,Dim FileNameSource$, FileNameProd$ 可以在一行中。
    • 大卫感谢您的更正。我在运行它时遇到了困难。我想把代码简洁到几行,太杂乱了。再次感谢。
    • 干杯。如果有助于解决您的问题,请考虑投票或接受答案。
    • 大卫,我一直在使用这个网站一段时间,终于弄清楚我必须按向上/向下箭头。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多