2015-10-13 74 views
0

我正在嘗試使用Excel VBA自動化每日過程以從源文件複製6個工作表並在Prod文件中創建副本,並用以下名稱替換舊的同名工作表這將成爲一個「日常重複過程」,我需要將6個工作表從源文件複製到Prod文件。這兩個文件中的工作表名稱相同,並且希望保留相同的工作表名稱,因爲我的公式提供了Prod文件 - 主報告。Excel VBA將多個工作表從源文件複製到生產文件

我不知道什麼是最有效率和最有效的方法,首先從Prod文件中刪除先前的工作表,然後將當前工作表複製到Prod文件。

或者

源文件工作表督促文件,這將創建以數字2的副本,刪除先前的工作表,並從當前工作表名稱中刪除2複製。

像往常一樣,我很感謝這個網站,總是找到解決方案。

下面的過程是:

從源文件 - 我想複製下面的工作表:

文件名,表名和日期約定

源文件名:CM棱鏡MTD ROR MMDDYYYY.xlsx

工作表:

  • 活動在全球範圍內
  • 活動USRR
  • 活動指數
  • MACO
  • 位數
  • HY

督促文件 - 工作表的名稱將保持不變,並更換前工作。

文件名,表名和日期約定

PROD文件名:CM複合MTD爲MM.DD.xlsm

工作表:

  • 活動在全球範圍內
  • 活動USRR
  • 活躍指數
  • MACO
  • 位數
  • HY

而且源文件的工作表對單元格「D4」估值日期爲「09-OCT-2015」,在這裏我想補充一個「估值日期檢查「以確保從源文件複製到Prod文件的工作表具有與單元」D6「上的產品文件相同的」2015/10/09「。 因此,如果估價日期與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 

末次

回答

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) 
+0

感謝大衛的建議。我的代碼看起來很長,有一種方法可以用Source File和Prod File的所有Dim來簡化它。 – cemg

+0

我不認爲你的代碼有什麼問題,它已經很簡潔了。你可以在一行中聲明多個變量,但我不喜歡這樣做,例如'Dim FileNameSource $,FileNameProd $'可以在一行上。 –

+0

大衛感謝您的更正。我正在運行它。我想簡化幾行代碼,太混亂了。再次感謝。 – cemg

相關問題