在VBA

2015-12-21 65 views
1

創建多個數據透視表我已經成功地通過使用VBA創建的數據透視表,但現在我想在兩個單獨的工作表,2和3。但是,創建兩個數據透視表我的腳本VBA只創建一個數據透視表,甚至儘管我已經設置了2個透視表變量:PT1和PT2以及2個透視緩存變量:PTCache1和PTCache2。原始數據在工作表1中,我將其設置爲RawData。
下面是我的腳本。請幫我解決我在這裏失蹤的事情。謝謝。在VBA

Private Sub CreatePivotTables() 
Dim ReportC2 As Workbook, RawData As Worksheet, SanityA As Worksheet 
Dim LastRow As Long, LastCol As Long, i As Long 
Dim PTCache1 As PivotCache, PTCache2 As PivotCache, PT1 As PivotTable, PT2 As PivotTable 

Set ReportC2 = Workbooks.Open(ScorecardAddr & "\" & C2Name) 
Set RawData = ReportC2.ActiveSheet 

With RawData 
    Columns("A:A").Insert 
    .Range("A1").Value = "Deal & SKU" 
    LastRow = .Range("B" & Rows.Count).End(xlUp).Row 
    LastCol = .Cells(1, Columns.Count).End(xlToLeft).Column 


    For i = 2 To LastRow 
     .Range("A" & i) = .Range("F" & i).Value & "|" & .Range("P" & i).Value 
    Next 

End With 

With RawData 

    Set PTCache1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, Range(Cells(1, 1), Cells(LastRow, LastCol))) 
    Set PTCache2 = ActiveWorkbook.PivotCaches.Create(xlDatabase, Range(Cells(1, 1), Cells(LastRow, LastCol))) 
End With 

On Error Resume Next 
With ReportC2 

.Sheets.Add After:=.Sheets(.Sheets.Count), Count:=2 
.Sheets(2).Name = "C2Pivot-Transactional" 

    Set PT1 = .Sheets(2).PivotTables.Add(PTCache1, Range("A7"), "C2PT1") 

    'put the fields in the pivot table 
    With PT1 
     .PivotFields("Deal & SKU").Orientation = xlRowField 
     .PivotFields("quantity").Orientation = xlDataField 
     .PivotFields("GrossSellto").Orientation = xlDataField 
     .PivotFields("Total BDD Rebate").Orientation = xlDataField 
     .PivotFields("Total FLCP Rebate").Orientation = xlDataField 
    End With 
End With 

With ReportC2 

    .Sheets(3).Name = "C2Pivot-Reseller" 

    Set PT2 = .Sheets(3).PivotTables.Add(PTCache2, Range("A7"), "C2PT2") 

    'put the fields in the pivot table 
    With PT2 
     .PivotFields("Reseller ID").Orientation = xlRowField 
     .PivotFields("GrossSellto").Orientation = xlDataField 
     .CalculatedFields.Add "BDD + FLCP", "= 'Total BDD Rebate' + 'Total FLCP Rebate'" 
     .PivotFields("BDD + FLCP").Orientation = xlDataField 
    End With 

End With 

End Sub 
+0

你應該刪除On Error Goto Next,看看你得到了什麼錯誤。 –

+0

您是否嘗試過註釋'Set PTCache2 ...',並且僅對兩個數據透視表使用PTCache1? –

+0

@BobPhillips不幸的是,我爲Excel VBA一個小白,錯誤消息意味着沒有多少給我。這些代碼實際上就是我在YouTube中發現的一些小調整,以適合我的數據集。謝謝。 – lukayl

回答

1

首先,儘量不要使用.Select而儘量明確refernce工作簿和工作表。正因爲如此,你的樞軸表都被添加到Range("A7"),所以在同一個地方。嘗試引用以WB.WS.Range開頭,其中WB是存儲工作簿的變量,WS是存儲WS的變量。

編輯:作爲參考,在這裏一個問題,答案,就如何避免使用.SelectHow to avoid using Select in Excel VBA macros

EDIT2: 固定你的代碼(希望)

EDIT3:添加回用.. .END用,並把兩者的PivotCaches在帶環,還刪除PT2變量重複,最後合併「隨着ReportC2兩者之間的PT表插件,而且它的工作原理。

Private Sub CreatePivotTables() 
Dim ReportC2 As Workbook, RawData As Worksheet, SanityA As Worksheet 
Dim LastRow As Long, LastCol As Long, i As Long 
Dim PTCache1 As PivotCache, PTCache2 As PivotCache, PT As PivotTable 

Set ReportC2 = Workbooks.Open(ScorecardAddr & "\" & C2Name) 
Set RawData = ReportC2.Worksheets(1) 

With RawData 
    Columns("A:A").Insert 
    .Range("A1").Value = "Deal & SKU" 
    LastRow = .Range("B" & Rows.Count).End(xlUp).Row 
    LastCol = .Cells(1, Columns.Count).End(xlToLeft).Column 


    For i = 2 To LastRow 
     .Range("A" & i) = .Range("F" & i).Value & "|" & .Range("P" & i).Value 
Next 

End With 
with RawData 
    Set PTCache1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, Range(Cells(1, 1), Cells(LastRow, LastCol))) 
    Set PTCache2 = ActiveWorkbook.PivotCaches.Create(xlDatabase, Range(Cells(1, 1), Cells(LastRow, LastCol))) 
End With 

On Error Resume Next 
With ReportC2 

.Sheets.Add After:=.Sheets(.Sheets.Count), Count:=2 
.Sheets(2).Name = "C2Pivot-Transactional" 

    Set PT = .Sheets(2).PivotTables.Add(PTCache1, Worksheets(2).Range("A7"), "C2PT1") 

    'put the fields in the pivot table 
    With PT 
     .PivotFields("Deal & SKU").Orientation = xlRowField 
     .PivotFields("quantity").Orientation = xlDataField 
     .PivotFields("GrossSellto").Orientation = xlDataField 
     .PivotFields("Total BDD Rebate").Orientation = xlDataField 
     .PivotFields("Total FLCP Rebate").Orientation = xlDataField 
    End With 

    .Sheets(3).Name = "C2Pivot-Reseller" 

    Set PT2 = .Sheets(3).PivotTables.Add(PTCache2, Worksheets(3).Range("A7"), "C2PT2") 

    'put the fields in the pivot table 
    With PT2 
     .PivotFields("Reseller ID").Orientation = xlRowField 
     .PivotFields("GrossSellto").Orientation = xlDataField 
     .CalculatedFields.Add "BDD + FLCP", "= 'Total BDD Rebate' + 'Total FLCP Rebate'" 
     .PivotFields("BDD + FLCP").Orientation = xlDataField 
    End With 

End With 

End Sub 
+0

嗨,我試過了。我替換RawData表示「ReportC2.ActiveSheet」;並使用With ... End With,但仍然失敗。我的代碼有什麼問題?謝謝。 – lukayl

+0

@lukayl我爲你做了修改,讓我知道它是否有效。 – Luuklag

+0

嗨@Luuklag,第一次嘗試給了我的錯誤,似乎RawData.PivotCaches.Create(xlDatabase,範圍(單元格(1,1),電池(LASTROW,LASTCOL)))不起作用。所以我仍然在兩個PivotCaches部分添加With RawData,... End With循環,然後在With循環中使用ActiveWorkbook代替RawData。刪除額外的PT2變量,因爲我發現一個PT也很好。然後將兩個與Pivot Table部分中的ReportC2循環合併爲一個以避免出現嚴重的問題。它一切正常。謝謝。 – lukayl

0

這對我的作品假設d數據。我放棄了PTCache2,對於同一個來源就足夠了。

Private Sub CreatePivotTables() 
Dim ReportC2 As Workbook, RawData As Worksheet, SanityA As Worksheet 
Dim LastRow As Long, LastCol As Long, i As Long 
Dim PTCache1 As PivotCache, PT As PivotTable, Pt2 As PivotTable 

    Set ReportC2 = ActiveWorkbook 'Workbooks.Open(ScorecardAddr & "\" & C2Name) 
    Set RawData = ReportC2.Worksheets(1) 

    With RawData 

     .Columns("A:A").Insert 
     .Range("A1").Value = "Deal & SKU" 
     LastRow = .Range("B" & .Rows.Count).End(xlUp).Row 
     LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 


     For i = 2 To LastRow 
      .Range("A" & i) = .Range("F" & i).Value & "|" & .Range("P" & i).Value 
     Next 

     Set PTCache1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, .Range(.Cells(1, 1), .Cells(LastRow, LastCol))) 
    End With 

    With ReportC2 

    .Sheets.Add After:=.Sheets(.Sheets.Count), Count:=2 
    .Sheets(2).Name = "C2Pivot-Transactional" 

     Set PT = .Sheets(2).PivotTables.Add(PTCache1, Worksheets(2).Range("A7"), "C2PT1") 

     'put the fields in the pivot table 
     With PT 
      .PivotFields("Deal & SKU").Orientation = xlRowField 
      .PivotFields("quantity").Orientation = xlDataField 
      .PivotFields("GrossSellto").Orientation = xlDataField 
      .PivotFields("Total BDD Rebate").Orientation = xlDataField 
      .PivotFields("Total FLCP Rebate").Orientation = xlDataField 
     End With 

     .Sheets(3).Name = "C2Pivot-Reseller" 

     Set Pt2 = .Sheets(3).PivotTables.Add(PTCache1, Worksheets(3).Range("A7"), "C2PT2") 

     'put the fields in the pivot table 
     With Pt2 
      .PivotFields("Reseller ID").Orientation = xlRowField 
      .PivotFields("GrossSellto").Orientation = xlDataField 
      .CalculatedFields.Add "BDD + FLCP", "= 'Total BDD Rebate' + 'Total FLCP Rebate'" 
      .PivotFields("BDD + FLCP").Orientation = xlDataField 
     End With 
    End With 
End Sub 
+0

是的,它的工作。謝謝。 – lukayl

+0

你可以將它標記爲解決方案嗎? –

+0

我只是勾選了這個標記。謝謝。 – lukayl