2016-11-03 5 views
0

Я хотел бы создать сводную таблицу, которая может быть автоматически обновлена, выбрав лист, на котором будет информация. У меня есть 40 листов изо-отформатирован, и я попытался это:Сводная таблица - VBA

Sub tcd() 
Dim CR As String 
    CR = InputBox("Num of CR") 
    Sheets(CR).Select 
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ 
     CR & "!" & Sheets(CR).Range("A1").CurrentRegion.Address(ReferenceStyle:=xlR1C1), _ 
     Version:=xlPivotTableVersion14).CreatePivotTable _ 
     TableDestination:="Feuil1!R2C2", TableName:="Sum", _ 
     DefaultVersion:=xlPivotTableVersion14 
    Sheets("Feuil1").Select 
    Cells(2, 2).Select 
    Range("C8").Select 
    With ActiveSheet.PivotTables("Sum").PivotFields(_ 
     "N1") 
     .Orientation = xlRowField 
     .Position = 1 
    End With 
    ActiveSheet.PivotTables("Sum").AddDataField ActiveSheet. _ 
     PivotTables("Sum").PivotFields("N2"), _ 
     "Num of N2", xlCount 
    Sheets("SMM").Select 
End Sub 

К сожалению, это не похоже на работу, и я не могу выяснить, почему и, таким образом, как решить эту проблему.

EDIT1: Он дает мне ошибку «5»: Неверный вызов или аргумент процедуры.

EDIT 2: В отношении данных

Example

Данные содержат 6 столбцов на самом деле, но только первые 3 имеют важное значение. Я не могу предсказать количество строк, потому что это зависит от используемого листа.

Если у вас есть идеи? Я благодарю вас за ваши ответы!

+0

Сообщить об ошибке? – User632716

+0

в какой строке вы получаете эту ошибку? –

+0

@ Laurent Magon попробуйте фрагмент кода, который у меня есть в моем ответе ниже, дайте мне знать, если это то, что вы имели в виду. –

ответ

0

Чтения своего поста, я предполагаю, что вы вводите имя рабочего листа в InputBox, поэтому CR является строкой состоит из имени рабочего листа, который содержит данные сводной таблицы.

(я удалил все Select с кодом, они не нужны для создания нужного PivotTable).

Sub tcd() 

Dim CR     As String 
Dim PTCache    As PivotCache 
Dim PT     As PivotTable 
Dim wsSheet    As Worksheet 
Dim PivotShtExists  As Boolean 


CR = InputBox("Num of CR") ' assuming you enter the name of your worksheet's data in the input box 

' check is "Feuil1" sheet already exists (from previous Macro runs) 
For Each wsSheet In ThisWorkbook.Sheets 
    If wsSheet.Name = "Feuil1" Then 
     PivotShtExists = True 
    End If 
Next wsSheet 

If Not PivotShtExists Then Sheets.Add.Name = "Feuil1"  

' add a new Pivot Cache 
Set PTCache = ActiveWorkbook.PivotCaches.Add(xlDatabase, CR & "!" & Sheets(CR).Range("A1").CurrentRegion.Address(ReferenceStyle:=xlR1C1)) 

' add this line in case the Pivot table doesn't exit >> first time running this Macro 
On Error Resume Next 
Set PT = Sheets("Feuil1").PivotTables("Sum") ' check if "Sum" Pivot Table already created (in past runs of this Macro) 

On Error GoTo 0 
If PT Is Nothing Then 

    ' create a new Pivot Table in "Feuil1" sheet 
    Set PT = Sheets("Feuil1").PivotTables.Add(PivotCache:=PTCache, TableDestination:="Feuil1!R2C2", TableName:="Sum") 

    With PT.PivotFields("N1") 
     .Orientation = xlRowField 
     .Position = 1 
    End With 

    PT.AddDataField PT.PivotFields("N2"), "Num of N2", xlCount 

Else 
    ' just refresh the Pivot cache with the updated Range 
    PT.ChangePivotCache PTCache 
    PT.RefreshTable 
End If 

End Sub 
+0

Я пробовал этот код и получал ошибку 9: индекс вне диапазона по строке 'Set PT = Sheets (" Feuil1 "). PivotTables.Add (PivotCache: = PTCache, TableDestination: = "Feuil1! R2C2", TableName: = "Sum") ' –

+0

@LaurentMagon, в какой строке? –

+0

я получил его в строке 'Set PT = Sheets ("Feuil1") PivotTables.Add. (PivotCache: = PTCache, TableDestination: = "! Feuil1 R2C2", TABLENAME: = "Сумма")' Как я уже говорил выше. –

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