2017-02-14 29 views
1

Я не знаю, возможно ли это, но я пытаюсь создать макрос, который добавляет все поля поворота в раздел значений сводной таблицы как либо числа или проценты.Excel VBA Проверьте, должно ли поле поворота быть отформатировано как число или процент

Вот то, что я до сих пор:

If MsgBox("Do you want to add all pivot table fields as values?", vbOKCancel + vbQuestion, "Accept/Reject") = vbCancel Then 
    Exit Sub 
End If 

Dim pt As PivotTable 
Dim pf As PivotField 
Dim pivotTableName As String 

On Error Resume Next 
Set pt = ActiveCell.PivotTable 

If pt Is Nothing Then 
    pivotTableName = InputBox("Enter the pivot table name.") 
    Set pt = ActiveSheet.PivotTables(pivotTableName) 
End If 

For Each pf In pt.PivotFields 
    pt.AddDataField pt.PivotFields(pf.Name), pf.Name & " ", xlSum 
    pt.PivotFields(pf.Name & " ").NumberFormat = "#,##0" 
Next pf 

Но затем я хотел бы добавить, если заявление, чтобы увидеть, должно ли поле быть отформатирован в процентах вместо. Мои идеи были:

  1. Проверить одно значение записи в поле, чтобы увидеть, если он составляет менее 100% (или 1) (это было бы идеально в 95% ситуаций, я нахожусь в)

  2. Убедитесь, что сумма поля меньше, чем произвольное число таких как < 100 (не идеальный)

  3. Проверьте, если имя поля имеет% в нем (то, что я, возможно, придется пойти с)

    Для каждого fld i п pt.PivotFields

    Если InStr (fld.Value, "%") Тогда

    Следующая

  4. Проверьте, если поле является вычисляемое поле (не совершенен)

    Для каждого FLD в pt.PivotFields

    Если fld.IsCalculated Тогда

    Следующая

Возможны ли первые два? Кто-нибудь имеет лучшие идеи?

Спасибо!

P.S. Еще одна вещь, которую я заинтересован в том, чтобы проверить, содержит ли поле текст или, возможно, поле не может быть суммировано.

+0

пока кто-то не дает лучший ответ, вы можете заглянуть в зацикливание по пунктам PivotField https://msdn.microsoft.com/en-us/library/office/ff820762.aspx (возможно, pivotTable1.ColumnFields (1) .ChildItems (1) .Value) – Slai

+0

Спасибо за это, я думаю, что у меня есть идея, я попробую суммировать поле, если ошибка, тогда это должен быть текст иначе после добавления su mmed в сводную таблицу, проверьте его значение, а затем отформатируйте его. –

+0

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

ответ

0

Это то, что я в конечном итоге делает, если кому-то интересно:

Sub AutoAddFields()

If MsgBox("Do you want to add all pivot table fields as values?", vbOKCancel + vbQuestion, "Accept/Reject") = vbCancel Then 
    Exit Sub 
End If 

Dim pt As PivotTable 
Dim pf As PivotField 
Dim pivotTableName As String 

On Error Resume Next 
Set pt = ActiveCell.PivotTable 

If pt Is Nothing Then 
    pivotTableName = InputBox("Enter the pivot table name.") 
    Set pt = ActiveSheet.PivotTables(pivotTableName) 
End If 

For Each pf In pt.PivotFields 
    If InStr(pf.Value, "%") > 0 Then 
     pt.AddDataField pt.PivotFields(pf.Name), pf.Name & " ", xlSum 
     pt.PivotFields(pf.Name & " ").NumberFormat = "0.0%" 
    Else 
     If pf.IsCalculated Then 
      If InStr(pf.Formula, "/") > 0 Then 
       pt.AddDataField pt.PivotFields(pf.Name), pf.Name & " ", xlSum 
       pt.PivotFields(pf.Name & " ").NumberFormat = "0.0%" 
      Else 
       pt.AddDataField pt.PivotFields(pf.Name), pf.Name & " ", xlSum 
       pt.PivotFields(pf.Name & " ").NumberFormat = "#,##0" 
      End If 
     Else 
      pt.AddDataField pt.PivotFields(pf.Name), pf.Name & " ", xlSum 
      pt.PivotFields(pf.Name & " ").NumberFormat = "#,##0" 
     End If 
    End If 
Next pf 

For Each pf In pt.PivotFields 
    If (pt.GetPivotData(pf.Value & " ") = 0) Then 
     pt.PivotFields(pf.Value & " ").Orientation = xlHidden 
    End If 
Next pf 

End Sub