2016-11-03 3 views
1

У меня есть 2 файла CSV orders_by_user_backlog и orders_by_user_pivot. Я хочу создать с VBA файл .xlsx, который называется «Отчеты по заказам пользователей», содержащий 2 листа.Скопировать данные из разных книг и обновить сводную таблицу EXCEL VBA

Первый лист, называемый backlog, я просто скопирую данные из orders_by_user_backlog.csv и вставьте его туда.

Второй лист под названием pivot, я скопирую данные из 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», но я Жду» не знаю, как это исправить. Everytime я использую

ActiveSheet.Paste

или

ActiveSheet.PivotTables ("PivotTable1"). PivotCache.Refresh

он показывает мне ошибку в второй ActiveSheet.Paste, когда я комментирую эту часть и пытаюсь только с одним CSV-файлом, она вставляется отлично, а затем снова останавливается в ActiveSheet.PivotTables.

Может кто-нибудь, пожалуйста, посоветуйте мне, что изменить в моем коде? Большое спасибо.

+0

try 'ActiveSheet.PivotTables (« PivotTable1 »). RefreshTable' –

+0

Я пробовал это раньше, и он не работал. Проблема в ActiveSheet, потому что она перестает работать там со второго ActiveSheet.Paste – JuniorDev

+0

Не используйте метод activesheet, это не очень удобно. Определите ваши листы явно, т.е. Worksheet («Sheet1»). PivotTables («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. Это необходимо в программировании VBA в Excel.

+0

Большое спасибо – JuniorDev

Смежные вопросы