2013-01-17 59 views
4

我有一個Excel 2010數據透視表,最初包含3個行標籤字段。Excel VBA - 如何確定數據透視表中的行標籤字段的數量?

我需要創建一個宏來添加一個特定的字段作爲數據透視表中的最低行標籤字段。 (由於我不想進入的原因,用戶不能以正常的方式自己添加此字段。)

但是,當用戶運行此宏時,它們可能已添加或刪除了一些行標籤。

宏錄製使我這個當我在一個透視表的最低位置添加一個字段(與已選定的3個標籤):

With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField") 
    .Orientation = xlRowField 
    .Position = 4 
End With 

如果用戶添加或刪除一些項目,這4號位置不正確。我如何將正確的位置編號傳入我的代碼?

試圖志存高遠使用Position = 99給了我以下錯誤:

Unable to set the Position property of the PivotField class

任何想法嗎?

回答

5

PivotFields具有計數屬性。

With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField") 
    .Orientation = xlRowField 
    .Position = ActiveSheet.PivotTables("MyPivotTable").PivotFields.Count + 1 
End With 

另外,代替PivotFields,可以替代其它選擇,讓您等多項罪名:

  • ColumnFields
  • 的Datafields
  • HiddenFields
  • PageFields
  • RowFields
  • VisibleFie lds
+0

'PivotFields.Count'給你的總場數,而不只是顯示的數量:) –

+0

@SiddharthRout,其他可用計數的增加信息 – SeanC

+0

+ 1用於提示替代方法:) –

2

嘗試完全扔掉.Position = 4串,即:

With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField") 
    .Orientation = xlRowField 
End With 
+0

謝謝彼得。這也適用,非常方便。但是,因爲我也想知道當前使用了多少行標籤,我已經勾選了肖恩的答案。 –

+0

@AndiMohr沒問題,你選擇一個你最喜歡的那個)我的選項也很好用 –

1

蠻力解決方案:

Public Function GetPivotFieldPos(pt As PivotTable, fieldName As String) 
    Dim cnt As Integer 
    Dim pos As Integer 
    Dim pf As PivotField 

    On Error GoTo ErrHandler 

    cnt = 0 ' might be 1-based!? 
    pos = -1 
    For Each pf In pt.PivotFields 
     cnt = cnt + 1 
     If pf.Name = fieldName Then 
      pos = cnt 
      Exit For 
     End If 
    Next 

    GetPivotFieldPos = pos 
    Exit Function 

ErrHandler: 
    GetPivotFieldPos = -1 
    On Error GoTo 0 
End Function 
+0

謝謝,我想知道如果我不得不走這條路,但肖恩的答案是一個很好的解決方案。 –

1

如果手頭的任務是計算可能存在rowfields數量在一個數據透視表中,您應該喜歡這行代碼:

pt.RowRange.cells.count 

This將給出pivotrows的數量。但是,這將計算標題行以及總行數(如果總計應用於數據透視表)。因此,您需要根據您的情況減去1或2。

An excelent description of how to refer to pivottable ranges can be found here.

+0

謝謝Timbur。不完全是我之後,但感謝有用的鏈接。很多方便的提示。好老喬恩帕爾帖:) –

相關問題