2017-10-17 6 views
0

인덱스 일치 및 일반 계산을 통해 일부 값이있는 테이블을 만들기위한 매크로를 만들었습니다. 이 테이블은 범위에 있습니다 ("AA1 : BA"& LastRow) -> lastrow가 매일 변경되기 때문에 LastRow를 쓰고 있습니다. 셀 (9,1)에있는 피벗 테이블을 만들고 소스로 초기 테이블을 만들려고합니다. 아래에서 볼 수있는 코드를 작성했지만 오류가 발생합니다. 피벗 테이블 필드 이름이 줄에 유효하지 않습니다.자동으로 피벗 테이블을 만드는 중 오류가 발생했습니다.

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange).CreatePivotTable(TableDestination:=PSheet.Cells(2, 2), TableName:="PivotTable") 

피벗 테이블과 관련된 전체 코드는 아래에 나와 있습니다.

Dim PSheet As Worksheet 
Dim DSheet As Worksheet 
Dim PCache As PivotCache 
Dim PTable As PivotTable 
Dim PRange As Range 
Dim LastRow As Long 
Dim LastCol As Long 

Application.DisplayAlerts = False 
Application.DisplayAlerts = True 
Set PSheet = Worksheets("Budget_Report") 
Set DSheet = Worksheets("Budget_Report") 

LastRow = DSheet.Cells(Rows.Count, 27).End(xlUp).Row 
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column 

Set PRange = DSheet.Cells(1, 27).Resize(LastRow, LastCol) 

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange) 
Set PTable = PCache.CreatePivotTable(TableDestination:=PSheet.Cells(9, 1), TableName:="PivotTable") 

With ActiveSheet.PivotTables("PivotTable").PivotFields("T-Lane") 
.Orientation = xlRowField 
.Position = 1 
.Subtotals(1) = True 
.Subtotals(1) = False 
End With 

With ActiveSheet.PivotTables("PivotTable").PivotFields("Monthly Cost FCST") 
.Orientation = xlDataField 
.Position = 1 
.Function = xlSum 
.Name = "Monthly Cost Forecast" 
End With 
With ActiveSheet.PivotTables("PivotTable").PivotFields("Monthly Vol FCST") 
.Orientation = xlDataField 
.Position = 2 
.Function = xlSum 
.Name = "Monthly Vol Forecast" 
End With 
With ActiveSheet.PivotTables("PivotTable").PivotFields("Monthly $/SU FCST") 
.Orientation = xlDataField 
.Position = 3 
.Function = xlSum 
.Name = "Monthly $/SU Forecast" 
End With 
With ActiveSheet.PivotTables("PivotTable").PivotFields("Monthly Cost Actuals") 
.Orientation = xlDataField 
.Position = 4 
.Function = xlSum 
.Name = "Monthly Cost Actual" 
End With 
With ActiveSheet.PivotTables("PivotTable").PivotFields("Monthly Vol Actuals") 
.Orientation = xlDataField 
.Position = 5 
.Function = xlSum 
.Name = "Monthly Vol Actual" 
End With 
With ActiveSheet.PivotTables("PivotTable").PivotFields("Monthly $/SU Actuals") 
.Orientation = xlDataField 
.Position = 6 
.Function = xlSum 
.Name = "Monthly $/SU Actual" 
End With 

아래에 제공되는 피벗 테이블을 기반으로 기록 된 매크로는 당신이 두 번 같은 테이블을 만들려고 할 것으로 보인다

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Budget_Report!R1C27:R279C53", Version:=6).CreatePivotTable TableDestination:="Budget_Report!R9C1", TableName:="PivotTable1", DefaultVersion:=6 
Sheets("Budget_Report").Cells(9, 1).Select 
With ActiveSheet.PivotTables("PivotTable1").PivotFields("T-Lane") 
    .Orientation = xlRowField 
    .Position = 1 
End With 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Monthly Cost FCST"), "Monthly Cost Forecast", xlSum 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Monthly Vol FCST"), "Monthly Vol Forecast", xlSum 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Monthly $/SU FCST"), "Monthly $/SU Forecast", xlSum 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Monthly Cost Actuals"), "Monthly Cost Actual", xlSum 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Monthly Vol Actuals"), "Monthly Vol Actual", xlSum 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables("PivotTable1").PivotFields("Monthly $/SU Actuals"), "Monthly $/SU Actual", xlSum 

ActiveWorkbook.ShowPivotTableFieldList = False 
+0

무엇 피벗 테이블의 필드 이름을 다음과 같습니다

With ActiveSheet.PivotTables("PivotTable1") With .PivotFields("Field 1") .Caption = "My first field" .Function = xlSum End With With .PivotFields("Field 2") .Caption = "My second field" .Function = xlMax End With End With 

최종 제품이 같이 보입니다? – jsotola

+0

흠 나는 미안 jsotola하지만 정말 이해가 안돼 .. 난 정말 피벗 테이블 경험이 아니므로 정말 질문에 대답 할 수 없다 :(나는 방금 코드를 온라인으로보고 내 매크로를 구현하려고 시도. –

+0

당신을합니까 실제로 피벗 테이블에 공급할 수있는 데이터가 있습니까? ... 수행하면 수동으로 피벗 테이블을 만듭니다 .Excel은 필드 이름에 대해 불평해야하며 문제를 지적 할 수 있습니다. – jsotola

답변

1

설정 PRange 당신은 당신이 항상 최종 주소로 당신이 당신을 확신으로 될 것입니다 모르겠어요 비록 당신의 범위를 설정 Cells.SpecialCells 방법을 사용할 수 있습니다 타겟 범위를 초과하거나 초과하는 여분의 데이터가 없습니다.

Set PRange = DSheet.Range(DSheet.Cells(1, 27), DSheet.Cells.SpecialCells(xlCellTypeLastCell)) 

또한, 개인 스타일의 문제입니다,하지만 난 With 블록을 중첩하는 것이 때로는 더 읽을 수있는 코드에서 결과를 찾을 수 :

그것은 다음과 같이 보일 것입니다. 예를 들면 : 오류가 없었다 경우

Dim DSheet As Worksheet ', PSheet As Worksheet 
Dim PCache As PivotCache, PTable As PivotTable, PRange As Range 
'Dim LastRow As Long, LastCol As Long 

'Application.DisplayAlerts = False ' This is redundant since you're setting it to true below. 
Application.DisplayAlerts = True 
'Set PSheet = Worksheets("Budget_Report") ' 
Set DSheet = Worksheets("Budget_Report") ' These two are Redundant - I am using only DSheet. 

'LastRow = DSheet.Cells(Rows.Count, 27).End(xlUp).Row 
'LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column 

Set PRange = DSheet.Range(Cells(1, 27),Cells.SpecialCells(xlCellTypeLastCell)) 

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange) 
Set PTable = PCache.CreatePivotTable(TableDestination:=DSheet.Cells(9, 1), TableName:="PivotTable") 

With ActiveSheet.PivotTables("PivotTable") 
With .PivotFields("T-Lane") 
    .Orientation = xlRowField 
    .Position = 1 
    .Subtotals(1) = True ' You're resetting this value in the next  line, you can probably remove it. 
    .Subtotals(1) = False 
End With 

With .PivotFields("Monthly Cost FCST") 
.Orientation = xlDataField 
.Position = 1 
.Function = xlSum 
.Caption = "Monthly Cost Forecast" 'You want .Caption here, not .Name 
End With 

With .PivotFields("Monthly Vol FCST") 
.Orientation = xlDataField 
.Position = 2 
.Function = xlSum 
.Caption = "Monthly Vol Forecast" 
End With 

With .PivotFields("Monthly $/SU FCST") 
.Orientation = xlDataField 
.Position = 3 
.Function = xlSum 
.Caption = "Monthly $/SU Forecast" 
End With 

With .PivotFields("Monthly Cost Actuals") 
.Orientation = xlDataField 
.Position = 4 
.Function = xlSum 
.Caption = "Monthly Cost Actual" 
End With 

With .PivotFields("Monthly Vol Actuals") 
.Orientation = xlDataField 
.Position = 5 
.Function = xlSum 
.Caption = "Monthly Vol Actual" 
End With 

With .PivotFields("Monthly $/SU Actuals") 
.Orientation = xlDataField 
.Position = 6 
.Function = xlSum 
.Caption = "Monthly $/SU Actual" 
End With 

End With 
+1

그것이 효과가 있다는 것을 듣고 기쁘게 생각합니다. MSDN에서 PivotCaches.Create 문서는 Range를 전달할 때 _를 표시 할 때 문자열을 사용하여 통합 문서, 워크 시트 및 셀 범위를 지정하거나 명명 된 범위를 설정하고 이름을 문자열로 전달하는 것이 좋습니다. Range 개체를 전달하면 예기치 않게 "형식 불일치"오류가 발생할 수 있습니다. _ [link] (https://msdn.microsoft.com/en-us/vba/excel-vba/articles/pivotcaches-create-method-excel) –

+0

죄송합니다. 당신을 다시 괴롭히는 buddy .. 같은 시트에 두 번째 테이블을 추가하고 싶다면 (물론 다른 데이터를 표시하면서) 코드에서 무엇을 변경해야합니까? 새 PTable2를 설정하고 PivotTable2로 피벗 테이블의 이름을 변경했는데 피벗 테이블을 덮어 쓸 수 없다는 메시지가 나타납니다. –

+0

또한 새 피벗 테이블을 지정해야합니다. 피벗 테이블을 맨 위에 놓을 수는 없습니다. 다른. 'TableDestination : = ...' –

0

(이것은 특정 lastrow없는 범위 물론 lastcolumn있다) :

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange).CreatePivotTable(TableDestination:=PSheet.Cells(2, 2), TableName:="PivotTable") 
Set PTable = PCache.CreatePivotTable(TableDestination:=PSheet.Cells(9, 1), TableName:="PivotTable") 

그냥 두에 분할 :

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange) 
Set PTable = PCache.CreatePivotTable(TableDestination:=PSheet.Cells(9, 1), TableName:="PivotTable") 
+0

으로 설정 PTable을 사용하는 줄에 자동화 오류가 발생합니다. –

+0

@PericlesFaliagas'Set PTable ... '이있는 행이 맞습니다. 그래서 이미 그 이름을 가진 피벗 테이블을 가지고 있거나 대상에 문제가 있거나 PivotCache가 올바르게 생성되지 않았습니다. –

+0

실제로이 통합 문서에있는 유일한 피벗 테이블입니다. 원본으로 사용하는 데이터가있는 동일한 시트에 피벗 테이블을 만들 수 있습니까? –

0

지정은 캐시를 PCache합니다 :

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange) 
+0

PTable을 설정 한 행에 자동화 오류가 나타납니다. –