2016-07-12 4 views
0

enter image description here Я в настоящее время имеют таблицы Excel, которая имеет некоторые заголовки, каксводную таблицу Excel Macro

Pers.No. Employee name Hours etc etc 
12345  bobby   5.5 
12346  jones   6 
12345  bobby   7.5 

Однако в моей сводной таблице Я заинтересован только в Pers.No. и Часы будут доступны таким образом. К сожалению, программа, в которой я получаю исходные данные, дает количество человек несколько раз и отображает работу, которую они выполняют каждый день. Таким образом, было бы несколько записей сотрудника 12345, но я хочу показать это раз, очевидно, в сводной таблице, и суммировать все часы, назначенные этому 12345. Конечно, это можно сделать вручную не слишком ужасно, но мне нужно сделать макрос, чтобы другие могли его использовать.

Person.No.  Hours 
12345   40 

Моя попытка

Sub Macro() 


    Dim objTable As PivotTable, objField As PivotField 

    ' Select the sheet and first cell of the table that contains the data. 
    ActiveWorkbook.Sheets("May20").Select 
    Range("A1").Select 

    ' Create the PivotTable object based on the Employee data on Sheet1. 
    Set objTable = Sheet1.PivotTableWizard 

    ' Specify row and column fields. 
    Set objField = objTable.PivotFields("Pers.No.") 
    objField.Orientation = xlRowField 


    ' Specify a data field with its summary 
    ' function and format. 
    Set objField = objTable.PivotFields("Hours") 
    objField.Orientation = xlDataField 
    objField.Function = xlSum 
    objField.NumberFormat = "$ #,##0" 



    ' Preview the new PivotTable report. 
    ActiveSheet.PrintPreview 

    ' Prompt the user whether to delete the PivotTable. 
    Application.DisplayAlerts = False 
    If MsgBox("Delete the PivotTable?", vbYesNo) = vbYes Then 
     ActiveSheet.Delete 
    End If 
    Application.DisplayAlerts = True 



End Sub 

Однако я не уверен, если я делаю это правильный путь, как я получаю ошибку метода 'pivottablewizard' of object '_worksheet' failed на линии

Set objTable = Sheet1.PivotTableWizard 

В идеале Я хочу, чтобы он создал новый лист 1 с его сводной таблицей

------------ EDIT ----------------------------

enter image description here

Учитывая это с кучей больше записей, я хотел бы создать сводную таблицу, которая выглядит как

Employee ID Hours 

12345   90 
123423   100 

Теперь файл Excel имеет несколько записей для сотрудников с тем же ID, так что нужно суммировать все эти часы в сводная таблица

+0

Наименее мы надеемся, будет запрошено обратной связи на ответ или наблюдение предоставляемых нами. Обучение никогда не заканчивается, и мы надеемся, что ваши отзывы предоставят нам возможность доработать наш анализ. Это не касается точек ответа, а только для подтверждения нашего анализа. Благодарю. – skkakkar

+0

Извините. Забыл (а) об этом, мои извинения –

ответ

2

Пожалуйста, измените следующую строку, чтобы правильно указать источник данных.

Set objTable = Sheet1.PivotTableWizard 

Для

Set objTable = Sheets("May20").PivotTableWizard 

Надеется, что это позволит вам продолжить Мастер таблиц further.Pivot должен создать сводную таблицу в новом листе.

EDIT

я получаю объект ошибки, необходимые в строке "Set objField = objTable.PivotFields (" Часы ")"

Эта ошибка может возникнуть, если имена полей в вашем коде и физическом листе не совпадают.

Следующий код, слегка измененный на основе вашего кода, работает нормально. Я также добавил снимки выборочных данных, сводной таблицы и отчета. Необходимо всегда проявлять осторожность в режиме отладки из VBE, нажимая ALT + Q перед повторным запуском программы, а также удалять рабочий лист, содержащий сводную таблицу, в качестве меры предосторожности, если вы столкнулись с ошибкой во время работы программы.

Sub Macro() 


    Dim objTable As PivotTable, objField As PivotField 

    ' Select the sheet and first cell of the table that contains the data. 
    ActiveWorkbook.Sheets("May20").Select 
    Range("A1").Select 

    ' Create the PivotTable object based on the Employee data on Sheet1. 
    Set objTable = Sheets("May20").PivotTableWizard 

    ' Specify row and column fields. 
    Set objField = objTable.PivotFields("Pers.No.") 
    objField.Orientation = xlRowField 


    ' Specify a data field with its summary 
    ' function and format. 
    Set objField = objTable.PivotFields("Hours") 
    objField.Orientation = xlDataField 
    objField.Function = xlSum 
    'objField.NumberFormat = "$ #,##0" 



    ' Preview the new PivotTable report. 
    ActiveSheet.PrintPreview 

    ' Prompt the user whether to delete the PivotTable. 
    Application.DisplayAlerts = False 
    If MsgBox("Delete the PivotTable?", vbYesNo) = vbYes Then 
     ActiveSheet.Delete 
    End If 
    Application.DisplayAlerts = True 



End Sub  

Sample data
Pivot Table
Report

EDIT

Я чувствую, что если вы хотите, фильтруется для конкретного человека, он должен находиться в поле страницы. Следующий макрос, записанный мной, дает результат для выбранного человека, как показано в снимке.

Sub Macro2() 
' 
' Macro2 Macro 
' 

' 
    Range("A1:E7").Select 
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$E$7"), , xlYes).Name = _ 
     "Table1" 
    Range("Table1[#All]").Select 
    Sheets.Add 
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ 
     "Table1", Version:=6).CreatePivotTable TableDestination:="Sheet6!R3C1", _ 
     TableName:="PivotTable7", DefaultVersion:=6 
    Sheets("Sheet6").Select 
    Cells(3, 1).Select 
    ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select 
    ActiveChart.SetSourceData Source:=Range("Sheet6!$A$3:$C$20") 
    With ActiveChart.PivotLayout.PivotTable.PivotFields("Pers.No.") 
     .Orientation = xlPageField 
     .Position = 1 
    End With 
    ActiveChart.PivotLayout.PivotTable.AddDataField ActiveChart.PivotLayout. _ 
     PivotTable.PivotFields("Hours"), "Sum of Hours", xlSum 
    ActiveSheet.PivotTables("PivotTable7").PivotFields("Pers.No.").ClearAllFilters 
    ActiveSheet.PivotTables("PivotTable7").PivotFields("Pers.No.").CurrentPage = _ 
     "12345" 
    With ActiveSheet.PivotTables("PivotTable7").PivotFields("Employee name H") 
     .Orientation = xlRowField 
     .Position = 1 
    End With 
    With ActiveSheet.PivotTables("PivotTable7").PivotFields("CD1") 
     .Orientation = xlRowField 
     .Position = 2 
    End With 
    With ActiveSheet.PivotTables("PivotTable7").PivotFields("CD2") 
     .Orientation = xlRowField 
     .Position = 3 
    End With 
    ActiveSheet.ChartObjects("Chart 1").Activate 
    ActiveChart.PivotLayout.PivotTable.PivotFields("Pers.No.").ClearAllFilters 
    ActiveSheet.PivotTables(-1).PivotFields("Pers.No.").CurrentPage = "12345" 
    Range("B1").Select 
    ActiveSheet.PivotTables("PivotTable7").ShowPages PageField:="Pers.No." 
End Sub  

snapshot1
snapshot2
snapshot3

+0

Я получаю объект ошибки, требуемый в строке "Set objField = objTable.PivotFields (" Hours ")" –

+0

@cresjoy Это прекрасно работает. См. Отредактированный ответ. – skkakkar

+0

Что делать, если я хочу добавить общее количество часов, связанных с идентификатором? Из моего файла у меня есть несколько одинаковых идентификаторов: 12345, у которых есть 5 часов нескольких связей. Я хочу суммировать часы на основе одного и того же ID не каждый час. Спасибо за вашу помощь от wa –

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