2016-11-03 36 views
1

我有2個CSV文件orders_by_user_backlog和orders_by_user_pivot。我想用VBA創建一個名爲Orders by Users Report的.xlsx文件,其中包含兩張表。複製來自不同工作簿的數據並刷新數據透視表EXCEL VBA

稱爲積壓第一片,我只是將數據從orders_by_user_backlog.csv複製並粘貼在那裏。

稱爲支點。第二片,我會從orders_by_user_pivot.csv複製數據並粘貼那裏,刷新數據透視表在同一個表的新數據。

我使用的是.xlsx文件作爲模板名爲訂單用戶模板

這裏是我的代碼

Sub Orders_by_User_report() 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    'open the csv output from query orders by user backlog 
    Workbooks.Open FileName:="C:\Reports\orders_by_user_backlog.csv" 
    Cells.Select 
    Selection.Copy 
    Workbooks.Open FileName:= _ 
     "C:\Reports\Report templates\Orders By Users Template.xlsx" 
    Sheets(1).Select 
    Cells.Select 
    ActiveSheet.Paste 

    'Bold and color top row, add autofilter, zoom 80% and autofit   
    Range("A1:H1").Select 
    Selection.Interior.Color = 255 
    Selection.Font.Bold = True 
    Selection.AutoFilter 
    ActiveWindow.Zoom = 80 
    Cells.Select 
    Cells.EntireColumn.AutoFit 

    'open the csv output from query orders by user pivot 
    Workbooks.Open FileName:="C:\Reports\orders_by_user_pivot.csv" 
    Cells.Select 
    Selection.Copy 

    Workbooks.Open FileName:= _ 
     "C:\Reports\Report templates\Orders By Users Template.xlsx" 
    Sheets(2).Select 
    Cells.Select 
    ActiveSheet.Paste 

    'Bold and color top row, add autofilter, zoom 80% and autofit 

    Range("A1:D1").Select 
    Selection.Interior.Color = 255 
    Selection.Font.Bold = True 
    Selection.AutoFilter 
    ActiveWindow.Zoom = 80 
    Cells.Select 
    Cells.EntireColumn.AutoFit 

    'refresh pivot table 

    Sheets(2).Select 
    ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh 


    'save file as xlsx for the output 
    ActiveWorkbook.SaveAs FileName:= _ 
     "C:\Reports\Orders by Users\Orders by Users Report " & ".xlsx" _ 
     , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

    ActiveWindow.Close 
    ActiveWindow.Close 

    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 

End Sub 

我知道是我的問題,這是在「ActiveSheet」,但我沒有」不知道如何解決它。每次我使用

ActiveSheet.Paste

ActiveSheet.PivotTables( 「PivotTable1」)。PivotCache.Refresh

它讓我錯誤的第二ActiveSheet.Paste,當我評論這部分,並嘗試只有一個CSV文件它粘貼正常,但然後再次停止在ActiveSheet.PivotTables。

任何人都可以請教我如何改變我的代碼?非常感謝你。

+0

嘗試'ActiveSheet.PivotTables( 「PivotTable1」)。RefreshTable' –

+0

我以前嘗試過了,它不能正常工作。問題出在ActiveSheet中,因爲它從第二個ActiveSheet停止運行.Paste – JuniorDev

+0

不要使用activesheet方法,它不是很好。定義你的牀單明確,即工作表(「工作表Sheet1」)。數據透視表(「PivotTable1」) – User632716

回答

1

將父項分配給對象並直接處理對象。它更乾淨,更易於閱讀和調試,並確保您可以直接使用與您想要的對象。

以下代碼未經測試(僅處理手頭的問題)。

Dim wbBacklog as Workbook, wbPivot as Workbook, wbTemplate as Workbook 

Set wbTemplate = Workbooks.Open("C:\Reports\Report templates\Orders By Users Template.xlsx") 
Set wbBacklog = Workbooks.Open("C:\Reports\orders_by_user_backlog.csv") 
Set wbPivot = Workbooks.Open("C:\Reports\orders_by_user_backlog.csv") 

wbBacklog.Sheets(1).UsedRange.Copy 'copy data 
wbTemplate.Sheets(1).Range("A1").PasteSpecial xlPasteValues 'paste to template 

wbPivot.Sheets(1).UsedRange.Copy 'copy data 
wbTemplate.Sheets(2).Range("A1").PasteSpecial xlPasteValues 

另外,爲了更容易,爲數據透視表的數據源定義一個動態命名範圍。像這個公式一樣。

=Offset(Sheet2!A1,0,0,counta(Sheets2!A:A),4) 

然後,在你的代碼,

wbTemplate.Sheets(2).PivotTables(1).Refresh 

會工作。

最後,閱讀並研究如何以及爲什麼要Avoid Select。在Excel中進行VBA編程是必須的。

+0

非常感謝 – JuniorDev

相關問題