Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Double click uniquement dans TCD

6 réponses
Avatar
René Delcourt
Bonjour à tous et excellente année 2006,

Je passe mes ébauches de solutions et vous expose plutôt mon besoin :
J'ai une feuille avec un Tableau Croisé Dynamique.
Je souhaite que l'utilisateur puisse utiliser le double click sur un chiffre
du tableau qui affiche le détail de ce chiffre.
Je ne veux cependant pas qu'il puisse double cliquer ailleurs que sur un
chiffre du tableau (hors tableau, en-tête de colonne ou de ligne).
Je vous remercie d'enlever ce caillou de ma chaussure.
--
René Delcourt

6 réponses

Avatar
Daniel
Bonsoir.
Je suis loin d'être un pro en TCD+VBA. Essaie néanmoins le code suivant en
adaptant le nom du TCD.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
Dim Plage As Range, NomFeuil As String, NouvFeuil As String
ActiveSheet.Unprotect
NomFeuil = ActiveSheet.Name
ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotSelect "", _
xlDataOnly, True
Set Plage = Selection
If Intersect(Plage, Target) Is Nothing Then Exit Sub
Target.ShowDetail = True
NouvFeuil = ActiveSheet.Name
Sheets(NomFeuil).Select
ActiveSheet.Protect
Sheets(NouvFeuil).Select
End Sub

et en mettant un mot de passe.
Cordialement.
Daniel
"René Delcourt" a écrit dans le message de news:

Bonjour à tous et excellente année 2006,

Je passe mes ébauches de solutions et vous expose plutôt mon besoin :
J'ai une feuille avec un Tableau Croisé Dynamique.
Je souhaite que l'utilisateur puisse utiliser le double click sur un
chiffre
du tableau qui affiche le détail de ce chiffre.
Je ne veux cependant pas qu'il puisse double cliquer ailleurs que sur un
chiffre du tableau (hors tableau, en-tête de colonne ou de ligne).
Je vous remercie d'enlever ce caillou de ma chaussure.
--
René Delcourt


Avatar
anonymousA
Bonjour

en supposant que sur la feuille ce soit le TCD N°1
l'instruction suivante te donnera l'addresse de la plage de données en
cours.
Ensuite, rien de plus facile que de controler sur une procédure
evenementielle doubleclick si target a une intersection avec la plage en
question

ActiveSheet.PivotTables(1).DataBodyRange.Address

A+


Bonjour à tous et excellente année 2006,

Je passe mes ébauches de solutions et vous expose plutôt mon besoin :
J'ai une feuille avec un Tableau Croisé Dynamique.
Je souhaite que l'utilisateur puisse utiliser le double click sur un chiffre
du tableau qui affiche le détail de ce chiffre.
Je ne veux cependant pas qu'il puisse double cliquer ailleurs que sur un
chiffre du tableau (hors tableau, en-tête de colonne ou de ligne).
Je vous remercie d'enlever ce caillou de ma chaussure.


Avatar
René Delcourt
Bonjour Anonymous,
Je m'y perds un peu avec les procédures événementielles qui utilisent
"Target", intersect et autres...
Voudrais-tu être plus explicite et, en bonus, m'indiquer une référence pour
que je sois plus au clair avec la chose.
Excellent 2006!
--
René Delcourt



Bonjour

en supposant que sur la feuille ce soit le TCD N°1
l'instruction suivante te donnera l'addresse de la plage de données en
cours.
Ensuite, rien de plus facile que de controler sur une procédure
evenementielle doubleclick si target a une intersection avec la plage en
question

ActiveSheet.PivotTables(1).DataBodyRange.Address

A+


Bonjour à tous et excellente année 2006,

Je passe mes ébauches de solutions et vous expose plutôt mon besoin :
J'ai une feuille avec un Tableau Croisé Dynamique.
Je souhaite que l'utilisateur puisse utiliser le double click sur un chiffre
du tableau qui affiche le détail de ce chiffre.
Je ne veux cependant pas qu'il puisse double cliquer ailleurs que sur un
chiffre du tableau (hors tableau, en-tête de colonne ou de ligne).
Je vous remercie d'enlever ce caillou de ma chaussure.





Avatar
anonymousA
Bonjour,

Dans ce qui suit, je t'ai volontairement laissé MsgBox
.Parent.PivotTables(1).DataBodyRange.Address pour te permettre de
visualiser l'adresse des données, mais ce n'est evidemment que
pédagogique et pas du tout essentiel pour ce que tu souhaites faire .

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel
As Boolean)

With Target
If Not Intersect(.Item(1), .Parent.PivotTables(1).DataBodyRange) Is
Nothing Then
MsgBox .Parent.PivotTables(1).DataBodyRange.Address
.ShowDetail = True
End If
End With

Cancel = True

End Sub

Ici, Target représente le range sur lequel a été exercée l'action
du Doubleclick. Intersect est une méthode renvoyant un objet range qui
représente l'intersection entre des plages de cellules (jusqu'à 30
plages possibles, dans notre cas, seulement 2 plages).
Si Intersect renvoie une plage alors Not Intersect renvoie nothing
puisque le complémentaire booléen d'un objet existant est "rien" donc
nothing. En conséquence, on teste si Not intersect entre la cellule
doublecliquée et la plage de cellules que l'on a choisi comme plage de
référence ( ici la plage que tu souhaites c.à.d
Target.Parent.PivotTables(1).DataBodyRange puisque target.parent
renvoie à la feuille qui abrite Target ) renvoie nothing . Si c'est le
cas, alors celà veut dire que l'utilisateur a cliqué sur une cellule
de la plage de cellules de référence. Auquel cas, on engage une
action, sinon on ne fait rien. Tu souhaitais avoir le détail des
éléments constitutifs de la cellule double cliquée des données d'un
TCD, donc on envoie la méthode showdetail de l'objet range , ici en
l'occurrence Target.

Voilà. Je ne sais pas si j'ai été clair. Quant à te renvoyer vers
une référence à Intersect ou aux procédures evenementielles, le
mieux et le plus facile c'est de compulser l'aide d'Excel et ensuite de
se faire des exemples pour vérifier que l'on a bien compris comment
tout ça ca fonctionne.

A+
Avatar
René Delcourt
Je te remercie infiniment pour ces éclaircissements et conseils.
--
René Delcourt



Bonjour,

Dans ce qui suit, je t'ai volontairement laissé MsgBox
..Parent.PivotTables(1).DataBodyRange.Address pour te permettre de
visualiser l'adresse des données, mais ce n'est evidemment que
pédagogique et pas du tout essentiel pour ce que tu souhaites faire .

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel
As Boolean)

With Target
If Not Intersect(.Item(1), .Parent.PivotTables(1).DataBodyRange) Is
Nothing Then
MsgBox .Parent.PivotTables(1).DataBodyRange.Address
.ShowDetail = True
End If
End With

Cancel = True

End Sub

Ici, Target représente le range sur lequel a été exercée l'action
du Doubleclick. Intersect est une méthode renvoyant un objet range qui
représente l'intersection entre des plages de cellules (jusqu'à 30
plages possibles, dans notre cas, seulement 2 plages).
Si Intersect renvoie une plage alors Not Intersect renvoie nothing
puisque le complémentaire booléen d'un objet existant est "rien" donc
nothing. En conséquence, on teste si Not intersect entre la cellule
doublecliquée et la plage de cellules que l'on a choisi comme plage de
référence ( ici la plage que tu souhaites c.à.d
Target.Parent.PivotTables(1).DataBodyRange puisque target.parent
renvoie à la feuille qui abrite Target ) renvoie nothing . Si c'est le
cas, alors celà veut dire que l'utilisateur a cliqué sur une cellule
de la plage de cellules de référence. Auquel cas, on engage une
action, sinon on ne fait rien. Tu souhaitais avoir le détail des
éléments constitutifs de la cellule double cliquée des données d'un
TCD, donc on envoie la méthode showdetail de l'objet range , ici en
l'occurrence Target.

Voilà. Je ne sais pas si j'ai été clair. Quant à te renvoyer vers
une référence à Intersect ou aux procédures evenementielles, le
mieux et le plus facile c'est de compulser l'aide d'Excel et ensuite de
se faire des exemples pour vérifier que l'on a bien compris comment
tout ça ca fonctionne.

A+




Avatar
anonymousA
Bonjour, René

j'en profite pour préciser ce que j'ai dit car je devais avoir l'esprit
embrumé.
En réalité , "Si Intersect renvoie une plage alors Not Intersect renvoie
nothing puisque le complémentaire booléen d'un objet existant est "rien"
donc nothing" est une hérésie.
Ce qui se passe réellement c'est que si rangeA et rangeB n'ont pas
d'intersection alors Intersect(rangeA,rangeB) renvoie nothing, donc
tester Intersect(rangeA,rangeB) is nothing revient à tester si on a une
égalité booléenne entre Intersect(rangeA,rangeB) et nothing . Donc si
c'est vrai , alors Not Vrai égale Faux .
Si le résultat de Not Intersect(rangeA,rangeB) is nothing est faux alors
on ne fait rien.

Par contre si il y a une intersection entre rangeA et rangeB alors le
résultat de l'égalité booléenne entre Intersect(rangeA,rangeB) et
nothing renvoie Faux ( puisqu'il n'y a pas rien comme intersection) donc
Not Faux étant égal à Vrai alors, on agit.

Voilà.Cette fois-ci, c'est juste.

Cordialement

Je te remercie infiniment pour ces éclaircissements et conseils.