Excel VBA将多个工作表从源文件复制到生产文件

时间:2015-10-13 20:36:30

标签: excel-vba vba excel

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

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

或者

将源文件工作表复制到Prod文件,该文件将创建一个数字为2的副本,删除之前的工作表并从当前工作表名称中删除2.

总是如此,我很感激能够找到解决方案的网站。

以下是流程:

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

文件名,工作表名称和日期约定

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

工作表:

  • 全球活跃
  • 有效的USRR
  • 活跃指数
  • MACO
  • 位数
  • HY

要生成文件 - 工作表名称将保持不变并替换之前的工作表。

文件名,工作表名称和日期约定

Prod FileName:MM.DD.xlsm的CM Composite MTD

工作表:

  • 全球活跃
  • 有效的USRR
  • 活跃指数
  • MACO
  • 位数
  • HY

源文件工作表的单元格“D4”上的评估日期为“2015年10月9日”,我想在其中添加“评估日期检查”以确保从源文件中复制工作表Prod文件与单元格“D6”上的Prod文件具有相同的评估日期为“10/09/2015”。 因此,如果评估日期与Prod文件的副本相同,则不进行复制。 目标是添加任何不适用于评估日期的ALERTS或触发器。

这就是我所拥有的:

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

End Sub

1 个答案:

答案 0 :(得分:0)

我认为删除之前的表格(如果存在的话)将来会更合乎逻辑,更容易理解。使用如下函数:

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)