复制来自不同工作簿的数据并刷新数据透视表EXCEL VBA

时间:2016-11-03 12:53:15

标签: vba excel-vba excel

我有2个CSV文件orders_by_user_backlog和orders_by_user_pivot。我想用VBA创建一个名为Orders by Users Report的.xlsx文件,该文件包含2张。

第一张名为backlog的表格,我只是从orders_by_user_backlog.csv复制数据并将其粘贴到那里。

第二张名为pivot的表格,我将从orders_by_user_pivot.csv复制数据并将其粘贴到那里并使用新数据刷新同一张表中的数据透视表。

我使用.xlsx文件作为名为Orders By Users Template

的模板

这是我的代码

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中再次停止。

有人可以建议我在代码中更改一下吗?非常感谢你。

1 个答案:

答案 0 :(得分: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编程的必备条件。