2017-09-20 3 views
1

J'ai une table pivotante avec un élément caculé. Chaque fois que je change le paramètre dans le filtre principal du pivot, le formatage du texte revient par défaut.La macro VBA déclenchée par l'événement s'exécute mais ne s'exécute pas

Afin de ne pas formater la table à chaque fois, j'ai créé une macro, qui devrait formater le tableau croisé dynamique chaque fois que je mets une valeur dans la cellule D1. C2 est la cellule d'échantillon de format. Il semble que la macro s'exécute, mais ne s'exécute pas.

Pourriez-vous aider?

Le code:

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Address = "$d$1" Then 

Application.EnableEvents = False 

    Range("C2").Activate 
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
     "=ORAZ(JEŻELI($B2=" 'OFERTA/TOTAL RYNEK'";1;0);JEŻELI(C2>1;1;0))" 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Font 
     .Color = -16776961 
     .TintAndShade = 0 
    End With 

    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .ThemeColor = xlThemeColorAccent6 
     .TintAndShade = 0.399945066682943 
    End With 

    Selection.FormatConditions(1).StopIfTrue = False 
    Range("C2").Select 
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
     "=ORAZ(JEŻELI($B1=""OFERTA/TOTAL RYNEK"";1;0);JEŻELI(C1>1;1;0))" 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 

    With Selection.FormatConditions(1).Font 
     .Color = -16776961 
     .TintAndShade = 0 
    End With 

    With Selection.FormatConditions(1).Interior 
     .PatternColorIndex = xlAutomatic 
     .ThemeColor = xlThemeColorAccent6 
     .TintAndShade = 0.399945066682943 
    End With 

    Selection.FormatConditions(1).StopIfTrue = False 
    Selection.Copy 
    Columns("C:N").Select 
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ 
     SkipBlanks:=False, Transpose:=False 
    Application.CutCopyMode = False 

Application.EnableEvents = True 

End If 

End Sub 
+2

Pour commencer, vous avez besoin de 'If Target.Address =" $ D $ 1 "Then'. – SJR

Répondre

0

En comparant deux chaînes, telles que Target.Address et "$d$1" en utilisant les éléments suivants:

If Target.Address = "$d$1" Then 

.. ne peut jamais assimiler à TRUE, comme si Target.Address a fait référence à la colonne 4 , ligne 1, il contiendrait la chaîne "$D$1". En utilisant = pour comparer utilise essentiellement Comparer binaire.

Vous avez besoin soit de corriger à "$D$1", ou utiliser un texte Comparer méthode avec la fonction StrComp. Traverser l'événement et planer au-dessus du Target.Address l'aurait mis en évidence.

+0

Pour être juste envers OP, il m'a fallu beaucoup de temps avant que quelqu'un me montre comment passer à travers une procédure événementielle (en ajoutant une instruction 'Stop'). Peut-être existe-t-il d'autres moyens. – SJR

+1

@SJR Vous pouvez définir un point d'arrêt dans la procédure événementielle en cliquant dans la marge. –

+0

@VincentG - donc vous pouvez, comment n'ai-je jamais su cela! – SJR

0

Comme mentionné par l'autre affiche - la comparaison binaire ne sera jamais évaluer vous argument True vous pouvez soit enregistrer l'adresse sous forme de chaîne et changer l'argument If Target.Address = [Assigned String Name] Then mais il est préférable de changer simplement l'argument à ce qui suit:

If Not Intersect(Target, Range("$D$1")) Is Nothing And Target.Cells.Count = 1 Then 

    'code here 

End If 

Cela atténue le risque de ne pas se comporter de code comme vous le souhaitez et comme il ne laisse passer que l'argument si seuls changements D1 et, comme les commentaires ci-dessous l'état, est le code plus approprié.

+0

'Si Target = Range (" $ D $ 1 ")' - non, c'est faux parce qu'il va comparer les valeurs. Utiliser 'Address' est le chemin à parcourir (ou' Intersect'). – SJR

+1

@SJR J'accepte votre argument et j'ai mis à jour ma réponse en conséquence – Jeremy

+0

Je n'utiliserais pas le mot * 'plus facile' *. J'utiliserais le mot * 'mieux' *. Ce n'est pas plus facile (il y a plus à taper) mais c'est une meilleure méthode. Vous n'avez pas mentionné * pourquoi *, ce qui pourrait aider le PO. (Pourquoi - parce que si plus d'une cellule est changée à la fois - par exemple 'Target.Address =" $ D $ 1: $ D $ 2 "', n'utilisant pas 'Intersect' signifiera que la modification est ignorée si vous cherchez seulement une seule adresse de cellule .) – CLR