2017-02-14 1 views
1

Je ne sais pas si c'est possible mais j'essaye de concevoir une macro qui ajoute tous les champs de pivot dans la section de valeurs d'un tableau croisé dynamique nombres ou pourcentages.Excel VBA Vérifiez si le champ pivot doit être formaté en nombre ou en pourcentage

Voici ce que j'ai jusqu'à présent:

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 

Mais à côté, je voudrais ajouter une instruction if pour voir si oui ou non le champ doit être formaté en pourcentage à la place. Mes idées étaient:

  1. Vérifiez une seule valeur d'enregistrement dans un champ pour voir si elle est inférieure à 100% (ou 1) (ce serait idéal dans 95% des situations dans lesquelles je suis)

  2. Vérifiez que la somme d'un champ est inférieur à un nombre arbitraire, comme < 100 (pas parfait)

  3. Vérifiez si le nom du champ a% en elle (ce que je vais probablement aller avec

    Pour chaque Fld i n pt.PivotFields

    Si InStr (fld.Value, "%") Puis

    Suivant

  4. Vérifiez si le champ est un champ calculé (pas parfait)

    Pour chaque fld en pt.PivotFields

    Si fld.IsCalculated Puis

    Suivant

Les deux premiers sont-ils possibles? Est-ce que quelqu'un a de meilleures idées?

Merci!

P.S. Une autre chose que je voulais faire est de vérifier si le champ contient du texte ou peut-être si le champ ne peut pas être additionné.

+0

jusqu'à ce que quelqu'un donne une meilleure réponse, vous pouvez regarder en boucle à travers les éléments du PivotField https://msdn.microsoft.com/en-us/library/office/ff820762.aspx (peut-être pivotTable1.ColumnFields (1) .ChildItems (1) .Value) – Slai

+0

Merci pour cela, je pense que j'ai un idée, je vais essayer de sommer le champ si erreur alors il doit être le texte sinon après avoir ajouté le su Dans le tableau croisé dynamique, vérifiez sa valeur puis formatez-la. –

+0

Sum ignore les valeurs de texte, mais vous pourriez trouver d'autres fonctions qui ne le sont pas. Je pensais en passant par les valeurs de pivotField un par un pour les vérifier et les sommer – Slai

Répondre

0

C'est ce que je fini par faire si quelqu'un est intéressé:

Sous 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