【问题标题】:Copy data from different workbooks and refresh pivot table EXCEL VBA从不同的工作簿复制数据并刷新数据透视表 EXCEL VBA
【发布时间】:2016-11-03 12:53:15
【问题描述】:

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

第一个工作表称为 backlog,我将复制 orders_by_user_backlog.csv 中的数据并将其粘贴到那里。

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

我使用一个 .xlsx 文件作为模板,称为 Orders By Users 模板

这是我的代码

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

任何人都可以建议我在我的代码中进行哪些更改吗?非常感谢。

【问题讨论】:

  • 试试ActiveSheet.PivotTables("PivotTable1").RefreshTable
  • 我之前尝试过,但它不起作用。问题出在 ActiveSheet 中,因为它从第二个 ActiveSheet.Paste 停止在那里运行
  • 不要使用activesheet方法,这不是很好。明确定义您的工作表,即 Worksheet("Sheet1").PivotTables("PivotTable1")
  • @JuniorDev 如果您正在更新您的数据透视表的数据范围,那么您需要先更新您的PivotCache,然后再更新您的PivotTable。

标签: vba excel


【解决方案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 编程是必须的。

【讨论】:

  • 非常感谢
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多