我有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中再次停止。
有人可以建议我在代码中更改一下吗?非常感谢你。
答案 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编程的必备条件。