IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Dans un TCD, savoir si une cellule est une donnée ou un sous-total [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 489
    Points : 3 036
    Points
    3 036
    Par défaut Dans un TCD, savoir si une cellule est une donnée ou un sous-total
    Bonjour tout le monde

    J'ai déjà une macro qui exécute tout un traitement à partir d'un double-clic sur une cellule d'un Tableau Croisé Dynamique.

    Seulement maintenant, je voudrais que mon traitement soit différent suivant si on double-clique sur une cellule de valeur ou sur une cellule d'un sous-total (ou d'un total).

    Dans mon TCD, je peux avoir plusieurs champs en ligne (ainsi que plusieurs champs en colonne).
    Je n'ai qu'un champ dans mes valeurs.

    Sous 2010, Excel affiche gentiment les valeurs sur un fond blanc. Quand il s'agit d'un sous-total en ligne, les nombres affichés sont en gras. Quand il s'agit d'un sous-total en colonne, les nombres sont affichés sur un fond gris. Le total général en colonne est lui en gras sur fond bleu (assez bizarrement le total général en ligne n'a pas de format particulier).

    Je voudrais donc pouvoir détecter en VBA si la cellule sur laquelle je fais un double-clic est une valeur ou si elle est un sous-total ou un total.

    Merci d'avance à ceux qui prendront le temps de me répondre.

    Bonne journée

    Pierre

  2. #2
    Membre averti Avatar de XLRATOR
    Homme Profil pro
    Comptable Analyste
    Inscrit en
    Août 2012
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Comptable Analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 226
    Points : 356
    Points
    356
    Par défaut
    Bonjour Pierre,
    Vous pouvez par exemple boucler sur les cellules de la plage qui vous concerne en recupérant leurs valeurs puis les comparer à une chaine de caractére que vous allez spécifier vous même.
    Dans un TCD les Cellules des Sous-Totaux sont bien distinguées par leur valeurs & la chaine de caractéres qui spécifie le nom du calcul qu'elles efféctuent.
    A l'exemple de ce code qui compare la valeur de chaque cellule de la plage B1:B80 à la chaine de caractéres "*Sous-Total", Vers la fin vous aurez "Ici Ya Sous-Total" ou "Ici Yapa Sous-Total" dans la colonne F, selon le contenu de la cellule du TCD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    'Pour un TCD de 81 Lignes
    Dim rng As Range, i As Byte
    Set Rng1 = Range("B4:B80") 'Ici Je metterai à la place de A et 80 les reférence qui me conviennent
    Application.ScreenUpdating = False
    For Each rng In Rng1.Cells
    i = rng.Count
        If rng.Value Like "*Sous-Total" Then
        Do
        i = i + 1
        'Vôtre Expréssion si Vrai
        rng.Offset(0, 4).Value = "Ici ya Sous-Total" 'C'est juste un éssai
        Loop Until i = 80
        Else
        i = rng.Count
        Do
        i = i + 1
        'Vôtre Expréssion si Faux
         rng.Offset(0, 4).Value = "Ici YaPa Sous-Total" 'C'est juste un éssai
        Loop Until i = 80
        End If
    Next
    Set Rng1 = Nothing
    Application.ScreenUpdating = True
    L'inconvénient de cette boucle c'est que si le nombre de lignes dépasse les 1000, son éxécution risque de prendre énormément temps voir 5 minutes, je dirait donc qu'il peut y a avoir un bien meilleur code, on verra

    Cordialement.

    Karim

  3. #3
    Membre expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 489
    Points : 3 036
    Points
    3 036
    Par défaut
    Merci bien de ce début de réponse.

    Mais comme je suis déjà au milieu d'un traitement qui arrive à s'exécuter quasi-instantannément, je cherche une solution qui puisse m'indiquer très rapidement si la cellule est un sous-total (ou un total) ou bien une valeur.

    Quelqu'un a une autre idée ?

    Pierre

  4. #4
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Seulement maintenant, je voudrais que mon traitement soit différent suivant si on double-clique sur une cellule de valeur ou sur une cellule d'un sous-total (ou d'un total).
    il s'agit d'une cellule ciblée, donc pas besoin de boucler normalement, une piste : tu peux tenter d'exploiter la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If IsNumeric(Target) = True Then ' voir aussi si vides etc...
    '    voir les différentes propriété Value, formula et text de l'objet range dans l'aide VBA...
        If Val(ActiveCell.Formula) = ActiveCell.Value Then MsgBox "Cellule de données" Else MsgBox "contient une formule"
    End If
    End Sub
    PS : c'est un pirouette, je n'ai pas testé toutes les situations

    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier

  5. #5
    Membre expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 489
    Points : 3 036
    Points
    3 036
    Par défaut
    Merci Ormonth d'avoir répondu.
    Effectivement il s'agit d'une cellule ciblée, ce n'est pas la peine de faire une boucle.

    Par contre, je viens d'essayer ce code, mais cela ne fonctionne pas.

    Que l'on soit sur une cellule de sous-total ou de valeur dans le TCD, cela donne la même réponse.
    Mais cela est compréhensible, puisque aucune cellule d'un TCD ne contient de formule.

    Je n'ai toujours pas de piste me permettant de trouver la réponse à ma question.

    Bonne journée

    Pierre

  6. #6
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 504
    Points : 16 428
    Points
    16 428
    Par défaut
    Bonjour

    Dans nombre de cas on peut se référer au libellé de la 1ère colonne ou la première ligne pour les totaux.

    Dans nombre de cas, la structure permet aussi d'identifier visuellement les sous-totaux, donc il doit être possible de trouver des repères.

    Compte tenu des 1000 et 1 façon de présenter un TCD, il faut partir de ta présentation...

  7. #7
    Membre expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 489
    Points : 3 036
    Points
    3 036
    Par défaut
    Rebonjour

    Je met un fichier Test.xlsx qui contient un TCD.

    On peut voir que dans cet exemple (mais il pourrait être différent), les données sont en normal sur fond blanc.
    Par contre, les sous-totaux sont soit en gras (pour les commerciaux), soit sur fond gris (pour les secteurs), que les totaux en colonnes sont en gras sur fond bleu. Mais les totaux en ligne n'ont rien de particulier par rapport aux données

    Je cherche donc une macro qui puisse me dire, quand je double-clique, si je suis sur une cellule particulière à l'intérieur de mon TCD ou si je suis sur une donnée ou sur un sous-total.

    J'ai épuré mon code, mais voilà à quoi il ressemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.PivotCell.PivotCellType = xlPivotCellValue Then
        Cancel = True
     
        MsgBox "Traitement sur double-clic dans une valeur d'un TCD"
     
    End If
     
    End Sub
    En espérant être compris

    Bonne journée

    Pierre

  8. #8
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 504
    Points : 16 428
    Points
    16 428
    Par défaut
    Bonjour

    La mise en forme (gras, couleur) étant attachée au TCD et non à la cellule je ne sais si on peut l'exploiter.

    Ton TCD étant en mode compacté on ne peut se baser sur le remplissage de la colonne 1.

    Le code suivant se base sur le mot Total en colonne 1 ou ligne 4 pour les totaux, sur l'égalité entre l'origine de la valeur et le nom en colonne 1, pour les sous-totaux (commerciaux). A adapter si tu as plusieurs niveaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.PivotCell.PivotCellType = xlPivotCellValue Then
        Cancel = True
        If InStr(Cells(Target.Row, 1), "Total") > 0 Or InStr(Cells(4, Target.Column), "Total") > 0 Then
            MsgBox "Traitement sur double-clic dans une cellule du total"
        ElseIf Target.PivotCell.RowItems(1) = Cells(Target.Row, 1).Value Then
            MsgBox "Traitement sur double-clic dans une cellule de sous-total"
        Else
            MsgBox "Traitement sur double-clic dans une cellule de valeur"
        End If
    End If
     
    End Sub

  9. #9
    Membre expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 489
    Points : 3 036
    Points
    3 036
    Par défaut
    Merci pour la réponse, car le code fonctionne parfaitement pour cet exemple.

    Mais il ne fonctionne plus pour toutes les cellules si on bascule le champ "Marque" qui est en colonne dans les étiquettes de lignes.

    Par contre, j'ai cherché de mon côté et j'ai trouvé une autre solution qui semble fonctionner quelque soit le type de TCD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.PivotCell.PivotCellType = xlPivotCellValue Then
        Cancel = True
        a = ActiveCell.PivotTable.ColumnFields.Count 'nombre de champ de colonne totaux
        b = ActiveCell.PivotCell.ColumnItems.Count 'nombre de champ de colonne pour cette valeur
        If b <> a Then
            MsgBox "Ceci est un (sous-)total en colonne"
        End If
     
        a = ActiveCell.PivotTable.RowFields.Count 'nombre de champ de ligne totaux
        b = ActiveCell.PivotCell.RowItems.Count 'nombre de champ de ligne pour cette valeur
        If b <> a Then
            MsgBox "Ceci est un (sous-)total en ligne"
        End If
    End If
    End Sub
    Est-ce que quelqu'un peut me dire si j'ai fait une erreur ou s'il y a plus rapide ou mieux ?

    En tout cas, j'ai une solution à mon problème, donc tout va bien.

    Bonne journée

    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [XL-2007] Savoir si une cellule est une formule ou une valeur
    Par Syvolc dans le forum Excel
    Réponses: 3
    Dernier message: 23/06/2014, 14h50
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Lancement d'une macro lorsuqe une cellule est renseignée...
    Par rsoul dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/10/2008, 10h57
  5. Réponses: 23
    Dernier message: 01/08/2008, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo