OVH Cloud OVH Cloud

Savoir quel bouton d'une feuille de calcul a été cliqué

20 réponses
Avatar
Marc Vuffray
Bonjour,

J'ai une feuille qui contient un nombre variable de ligne. Normal ;)

J'aimerai pouvoir détruire une ligne ainsi qu'une série d'autres ligne dans
une autre feuille attachées à cette ligne. Tout ça en cliquant sur un
bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure, puisque je dois
pouvoir rajouter des lignes "destructibles" par la même procédure.


Mon problème est que je ne sais pas comment retrouver le nom du bouton (qui
se situe sur une feuille et pas sur un userform) qui détermine aussi la
ligne à supprimer.

Quelqu'un a une idée ?

10 réponses

1 2
Avatar
Marc Vuffray
Oups :>

Je croyais que les comptables n'aimaient pas les supressions d'écriture ...

Re,

Met en haut de la feuille, dans une zone xie (Figer les volets), un bouton
Aide, avec quelques infos, dont le double clic, et le problème est résolu.

PS - Je suis expert-comptable de formation, et je n'ai pas fait de syncope
;-))



Effectivement, c'est une bonne idée... Je vais y réfléchir.

A priori, il y a un défaut, C'est moins parlant: Un utilisateur non initié
va plus surement cliqué sur un bouton clairement nommé plutôt que
doucle-cliquer sur une ligne, mais bon pour l'usage interne que je veux en
faire, je suppose que ça suffirai. Ca me semble plus souple et plus simple à
programmer surtout :)))

Bonjour,

N'est-il pas plus simple d'exploiter l'événement Doucle clic, et d'afficher
un UserForm affichant différents boutons correspondant aux actions
plausibles en fonction de la cellule dans laquelle on a double-cliqué ?

Cela évite d'avoir une multitude de boutons, tout en conservant une grande
souplesse.



Ben, ça dépend,

Je développe une application simple de gestion/comptabilité et le but est
de
pouvoir détruire une ligne d'écriture erronnée (je sais les comptables en
feraient des syncopes).

Il est vrai que je pourrais avoir un bouton destruction qui me demande la
ligne à détruire. Ca marcherais très bien, mais c'est moins convivial. De
plus les aplications possibles ne se limitent pas à la destruction, mais
peuvent s'étendre à la modification, la visualisation de détail, la
comptabilisation, la composition d'un numéro de tél. dans une liste
d'adresse, bref possibilité infinies, donc oui je pense que c'est
raisonnable et nécessaire.n :))

Je désire avoir un bouton destruction sur chaque ligne.


Est-ce vraiment nécessaire/raisonnable ?

AV





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com









Avatar
Denis Michon
Bonjour Marc,

Tu crées un bouton
Tu affectes la macro au bouton
Tu peux reproduire le bouton par copier-coller aussi souvent que tu veux, la macro fonctionne toujours bien.

Je ne comprends pas ta technique :

"ma série de bouton est créée par copie de bouton existant"

Comment fais-tu ?


Salutations!



"Marc Vuffray" a écrit dans le message de news:BBF2A95E.1273%
Oups,

A deux minutes près ...

J'ai quand même essayé cette solution, qui est plus souple que la mienne.

J'ai ajouté un .Delete dans la boucle pour que le bouton soit aussi détruit.
J'ai supprimé la ligne .placement inutile si on détruit le bouton.

Par contre comme ma série de bouton est créée par copie de bouton existant,
il enregistre apparemment toujours les memes adresses .TopLeftCell.Row &
.BottomRightCell.Row quelque soit le bouton concerné, ce qui est embètant vu
que du coup il détuit systèmatiquement la première ligne de la série et pas
celle concernée.

Si je dessine chaque bouton individuellement, alors là ça marche type top.

Y a-t-il moyen de contourner cela ?


Bonjour Marc,

Ceci devrait te donner ce que tu cherches à faire...

Tu dois adapter le nom de la feuille et affecter cette macro à chaque bouton
de ta feuille.

Si ton bouton repose sur plus d'une ligne, les lignes seront toutes
supprimées.

'-------------------------
Sub LeBouton()

Dim SonNom As String, A As Long, B As Long
SonNom = Application.Caller

With Worksheets("feuil5")
With .Shapes(SonNom)
.Placement = xlFreeFloating
A = .TopLeftCell.Row
B = .BottomRightCell.Row
End With
.Rows(A & ":" & B).EntireRow.Delete (xlUp)
End With

End Sub
'-------------------------


Salutations!


"Marc Vuffray" a écrit dans le message de
news:BBF29A84.EE6%
Bonjour Denis,

Merci beaucoup.

Ca marche, je sais quel bouton a appelé la fonction.

Mais...

Comment faire pour savoir sur quelle ligne il se trouve ? Son nom n'indique
pas la ligne, car je peux avoir d'autres boutons sur la feuille.

Je te remercie pour cette première info qui est essentiel et m'aprend une
nouvelle méthode ou propriété: .Caller
Bonjour Marc,


Attache cette macro, à chacun des boutons de ta feuille.

'----------------------
Sub LeBouton()
Dim SonNom As String
SonNom = Application.Caller

With Worksheets("feuil5").Shapes(SonNom)
MsgBox .Name
End With
End Sub
'----------------------

Salutations!


"Marc Vuffray" a écrit dans le message de
news:BBF28BDF.906%
Bonjour,

J'ai une feuille qui contient un nombre variable de ligne. Normal ;)

J'aimerai pouvoir détruire une ligne ainsi qu'une série d'autres ligne dans
une autre feuille attachées à cette ligne. Tout ça en cliquant sur un
bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure, puisque je dois
pouvoir rajouter des lignes "destructibles" par la même procédure.


Mon problème est que je ne sais pas comment retrouver le nom du bouton (qui
se situe sur une feuille et pas sur un userform) qui détermine aussi la
ligne à supprimer.

Quelqu'un a une idée ?








Avatar
Michel Gaboly
Il faut s'adapter ;-))

Ce qui est important est d'avoir une procédure de validation de journal ou
de période après laquelle on ne peut plus modifier les éléments concernés.

Après la validation, une correction implique une écriture supplémentaire,
facile à repérer en cas de besoin.

Autrement, il n'y aurait aucune sécurité : ou pourrait faire contrôler des
comptes et tout changer après ;-((



Oups :>

Je croyais que les comptables n'aimaient pas les supressions d'écriture ...

Re,

Met en haut de la feuille, dans une zone xie (Figer les volets), un bouton
Aide, avec quelques infos, dont le double clic, et le problème est résolu.

PS - Je suis expert-comptable de formation, et je n'ai pas fait de syncope
;-))



Effectivement, c'est une bonne idée... Je vais y réfléchir.

A priori, il y a un défaut, C'est moins parlant: Un utilisateur non initié
va plus surement cliqué sur un bouton clairement nommé plutôt que
doucle-cliquer sur une ligne, mais bon pour l'usage interne que je veux en
faire, je suppose que ça suffirai. Ca me semble plus souple et plus simple à
programmer surtout :)))

Bonjour,

N'est-il pas plus simple d'exploiter l'événement Doucle clic, et d'afficher
un UserForm affichant différents boutons correspondant aux actions
plausibles en fonction de la cellule dans laquelle on a double-cliqué ?

Cela évite d'avoir une multitude de boutons, tout en conservant une grande
souplesse.



Ben, ça dépend,

Je développe une application simple de gestion/comptabilité et le but est
de
pouvoir détruire une ligne d'écriture erronnée (je sais les comptables en
feraient des syncopes).

Il est vrai que je pourrais avoir un bouton destruction qui me demande la
ligne à détruire. Ca marcherais très bien, mais c'est moins convivial. De
plus les aplications possibles ne se limitent pas à la destruction, mais
peuvent s'étendre à la modification, la visualisation de détail, la
comptabilisation, la composition d'un numéro de tél. dans une liste
d'adresse, bref possibilité infinies, donc oui je pense que c'est
raisonnable et nécessaire.n :))

Je désire avoir un bouton destruction sur chaque ligne.


Est-ce vraiment nécessaire/raisonnable ?

AV





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
Vincent.
Bonjour à tous et toutes,
Après avoir lu l'ensemble des posts de ce sujet, je n'ai
pas vu une solution qui est très compréhensible pour le
non-initié et basée sur un InputBox :

Sub zaza()
On Error Resume Next
Dim LigneSuppr As Range
Set LigneSuppr = Application.InputBox( _
"Sélectionner les lignes à supprimer", "Suppression" _
, , , , , , 8)
If Err.Number <> 0 Then: Exit Sub
If LigneSuppr.Cells.Count <> _
LigneSuppr.EntireRow.Cells.Count Then
MsgBox "Vous devez sélectionner une " & vbLf & _
"ou plusieurs ligne(s)."
zaza
End If
LigneSuppr.Delete
End Sub

Ca évite la gestion des boutons qui peut s'avérer délicate
dans certains cas (superposition de boutons...)
A+

V.

-----Message d'origine-----
Bonjour,

J'ai une feuille qui contient un nombre variable de
ligne. Normal ;)


J'aimerai pouvoir détruire une ligne ainsi qu'une série
d'autres ligne dans

une autre feuille attachées à cette ligne. Tout ça en
cliquant sur un

bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure,
puisque je dois

pouvoir rajouter des lignes "destructibles" par la même
procédure.



Mon problème est que je ne sais pas comment retrouver le
nom du bouton (qui

se situe sur une feuille et pas sur un userform) qui
détermine aussi la

ligne à supprimer.

Quelqu'un a une idée ?

.



Avatar
Vincent.
Bonjour à tous et toutes,
Après avoir lu l'ensemble des posts de ce sujet, je n'ai
pas vu une solution qui est très compréhensible pour le
non-initié et basée sur un InputBox :

Sub zaza()
On Error Resume Next
Dim LigneSuppr As Range
Set LigneSuppr = Application.InputBox( _
"Sélectionner les lignes à supprimer", "Suppression" _
, , , , , , 8)
If Err.Number <> 0 Then: Exit Sub
If LigneSuppr.Cells.Count <> _
LigneSuppr.EntireRow.Cells.Count Then
MsgBox "Vous devez sélectionner une " & vbLf & _
"ou plusieurs ligne(s)."
zaza
End If
LigneSuppr.Delete
End Sub

Ca évite la gestion des boutons qui peut s'avérer délicate
dans certains cas (superposition de boutons...)
A+

V.

-----Message d'origine-----
Bonjour,

J'ai une feuille qui contient un nombre variable de
ligne. Normal ;)


J'aimerai pouvoir détruire une ligne ainsi qu'une série
d'autres ligne dans

une autre feuille attachées à cette ligne. Tout ça en
cliquant sur un

bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure,
puisque je dois

pouvoir rajouter des lignes "destructibles" par la même
procédure.



Mon problème est que je ne sais pas comment retrouver le
nom du bouton (qui

se situe sur une feuille et pas sur un userform) qui
détermine aussi la

ligne à supprimer.

Quelqu'un a une idée ?

.



Avatar
Marc Vuffray
Bonjour Denis,

Autant pour moi !!!

Hier j'ai essayé de toutes les manières, rien n'y faisait, il supprimait
toujours la même ligne.

Aujourd'hui j'ai ré-essayer et effectivement ça marche parfaitement au
détails près que le bouton doit être détruit, sinon il se superpose avec le
bouton suivant.

Mais autrement ça marche, je sais pas ce que j'ai fait hier soir.

Bref.

Finalement j'ai choisi la méthode de Michel Gaboly car en y réfléchissant,
j'avais effectivement beaucoup d'opération possible sur chaque ligne et cela
aurai multiplié les boutons d'autant que je peux m'attendre a avoir des
centaines de lignes voir des miliers à gérer. Beaucoup de boutons, beaucoup
de mémoire.

Par contre la méthode reste valable pour des cas ou le nombre de lignes
serait limité. Une série de petit bouton graphiques en face de chaque ligne
peut être sympa. En plus on peut imaginer qu'ils changent d'aspect avec
l'état du contenu de la ligne :)

Merci à tous les deux pour vos contributions.

Meilleures salutations et à bientôt.

Bonjour Marc,

Tu crées un bouton
Tu affectes la macro au bouton
Tu peux reproduire le bouton par copier-coller aussi souvent que tu veux, la
macro fonctionne toujours bien.

Je ne comprends pas ta technique :

"ma série de bouton est créée par copie de bouton existant"

Comment fais-tu ?


Salutations!



"Marc Vuffray" a écrit dans le message de
news:BBF2A95E.1273%
Oups,

A deux minutes près ...

J'ai quand même essayé cette solution, qui est plus souple que la mienne.

J'ai ajouté un .Delete dans la boucle pour que le bouton soit aussi détruit.
J'ai supprimé la ligne .placement inutile si on détruit le bouton.

Par contre comme ma série de bouton est créée par copie de bouton existant,
il enregistre apparemment toujours les memes adresses .TopLeftCell.Row &
.BottomRightCell.Row quelque soit le bouton concerné, ce qui est embètant vu
que du coup il détuit systèmatiquement la première ligne de la série et pas
celle concernée.

Si je dessine chaque bouton individuellement, alors là ça marche type top.

Y a-t-il moyen de contourner cela ?


Bonjour Marc,

Ceci devrait te donner ce que tu cherches à faire...

Tu dois adapter le nom de la feuille et affecter cette macro à chaque bouton
de ta feuille.

Si ton bouton repose sur plus d'une ligne, les lignes seront toutes
supprimées.

'-------------------------
Sub LeBouton()

Dim SonNom As String, A As Long, B As Long
SonNom = Application.Caller

With Worksheets("feuil5")
With .Shapes(SonNom)
.Placement = xlFreeFloating
A = .TopLeftCell.Row
B = .BottomRightCell.Row
End With
.Rows(A & ":" & B).EntireRow.Delete (xlUp)
End With

End Sub
'-------------------------


Salutations!


"Marc Vuffray" a écrit dans le message de
news:BBF29A84.EE6%
Bonjour Denis,

Merci beaucoup.

Ca marche, je sais quel bouton a appelé la fonction.

Mais...

Comment faire pour savoir sur quelle ligne il se trouve ? Son nom n'indique
pas la ligne, car je peux avoir d'autres boutons sur la feuille.

Je te remercie pour cette première info qui est essentiel et m'aprend une
nouvelle méthode ou propriété: .Caller
Bonjour Marc,


Attache cette macro, à chacun des boutons de ta feuille.

'----------------------
Sub LeBouton()
Dim SonNom As String
SonNom = Application.Caller

With Worksheets("feuil5").Shapes(SonNom)
MsgBox .Name
End With
End Sub
'----------------------

Salutations!


"Marc Vuffray" a écrit dans le message de
news:BBF28BDF.906%
Bonjour,

J'ai une feuille qui contient un nombre variable de ligne. Normal ;)

J'aimerai pouvoir détruire une ligne ainsi qu'une série d'autres ligne dans
une autre feuille attachées à cette ligne. Tout ça en cliquant sur un
bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure, puisque je dois
pouvoir rajouter des lignes "destructibles" par la même procédure.


Mon problème est que je ne sais pas comment retrouver le nom du bouton (qui
se situe sur une feuille et pas sur un userform) qui détermine aussi la
ligne à supprimer.

Quelqu'un a une idée ?












Avatar
Marc Vuffray
Bonjour Vincent.

J'ai essayé cette technique qui marche pas mal. Allez ça marche même bien.
Mais ça ne correspond pas vraiment à ce que je veux faire.

Par contre l'utilisation de inputbox est interressante et je la retient pour
plus tard.

Merci bien.

Bonjour à tous et toutes,
Après avoir lu l'ensemble des posts de ce sujet, je n'ai
pas vu une solution qui est très compréhensible pour le
non-initié et basée sur un InputBox :

Sub zaza()
On Error Resume Next
Dim LigneSuppr As Range
Set LigneSuppr = Application.InputBox( _
"Sélectionner les lignes à supprimer", "Suppression" _
, , , , , , 8)
If Err.Number <> 0 Then: Exit Sub
If LigneSuppr.Cells.Count <> _
LigneSuppr.EntireRow.Cells.Count Then
MsgBox "Vous devez sélectionner une " & vbLf & _
"ou plusieurs ligne(s)."
zaza
End If
LigneSuppr.Delete
End Sub

Ca évite la gestion des boutons qui peut s'avérer délicate
dans certains cas (superposition de boutons...)
A+

V.

-----Message d'origine-----
Bonjour,

J'ai une feuille qui contient un nombre variable de
ligne. Normal ;)


J'aimerai pouvoir détruire une ligne ainsi qu'une série
d'autres ligne dans

une autre feuille attachées à cette ligne. Tout ça en
cliquant sur un

bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure,
puisque je dois

pouvoir rajouter des lignes "destructibles" par la même
procédure.



Mon problème est que je ne sais pas comment retrouver le
nom du bouton (qui

se situe sur une feuille et pas sur un userform) qui
détermine aussi la

ligne à supprimer.

Quelqu'un a une idée ?

.





Avatar
Vincent.
Bouarf !
Tant pis, mais c'était effectivement plus pour la démo de
cette utilisation précise des inputbox qu'autre chose que
je disais ça !
A+

-----Message d'origine-----
Bonjour Vincent.

J'ai essayé cette technique qui marche pas mal. Allez ça
marche même bien.

Mais ça ne correspond pas vraiment à ce que je veux faire.

Par contre l'utilisation de inputbox est interressante et
je la retient pour

plus tard.

Merci bien.

Bonjour à tous et toutes,
Après avoir lu l'ensemble des posts de ce sujet, je n'ai
pas vu une solution qui est très compréhensible pour le
non-initié et basée sur un InputBox :

Sub zaza()
On Error Resume Next
Dim LigneSuppr As Range
Set LigneSuppr = Application.InputBox( _
"Sélectionner les lignes à supprimer", "Suppression" _
, , , , , , 8)
If Err.Number <> 0 Then: Exit Sub
If LigneSuppr.Cells.Count <> _
LigneSuppr.EntireRow.Cells.Count Then
MsgBox "Vous devez sélectionner une " & vbLf & _
"ou plusieurs ligne(s)."
zaza
End If
LigneSuppr.Delete
End Sub

Ca évite la gestion des boutons qui peut s'avérer
délicate


dans certains cas (superposition de boutons...)
A+

V.

-----Message d'origine-----
Bonjour,

J'ai une feuille qui contient un nombre variable de
ligne. Normal ;)


J'aimerai pouvoir détruire une ligne ainsi qu'une série
d'autres ligne dans

une autre feuille attachées à cette ligne. Tout ça en
cliquant sur un

bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure,
puisque je dois

pouvoir rajouter des lignes "destructibles" par la même
procédure.



Mon problème est que je ne sais pas comment retrouver
le



nom du bouton (qui
se situe sur une feuille et pas sur un userform) qui
détermine aussi la

ligne à supprimer.

Quelqu'un a une idée ?

.




.





Avatar
Dom

Bonjour,

J'ai une feuille qui contient un nombre variable de ligne. Normal ;)

J'aimerai pouvoir détruire une ligne ainsi qu'une série d'autres ligne dans
une autre feuille attachées à cette ligne. Tout ça en cliquant sur un
bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure, puisque je dois
pouvoir rajouter des lignes "destructibles" par la même procédure.


Mon problème est que je ne sais pas comment retrouver le nom du bouton (qui
se situe sur une feuille et pas sur un userform) qui détermine aussi la
ligne à supprimer.

Quelqu'un a une idée ?



Pourquoi ne pas utiliser une colonne supplémentaire avec dans chaque
cellule un texte (destruire) et faire une macro de détection de clic
sur la cellule. Dans ce cas, pas de problème de bouton et récupération
aisée du numéro de ligne.

Dom.

Avatar
Marc Vuffray
C'est la solution que j'avais fini par adopter avant de poser la qestion au
forum. Mais je la trouvais pas estétique.


--
Meilleures salutations
Marc Vuffray



Bonjour,

J'ai une feuille qui contient un nombre variable de ligne. Normal ;)

J'aimerai pouvoir détruire une ligne ainsi qu'une série d'autres ligne dans
une autre feuille attachées à cette ligne. Tout ça en cliquant sur un
bouton.

Je désire avoir un bouton destruction sur chaque ligne.

Chacun de ces boutons fait appel à la même procédure, puisque je dois
pouvoir rajouter des lignes "destructibles" par la même procédure.


Mon problème est que je ne sais pas comment retrouver le nom du bouton (qui
se situe sur une feuille et pas sur un userform) qui détermine aussi la
ligne à supprimer.

Quelqu'un a une idée ?



Pourquoi ne pas utiliser une colonne supplémentaire avec dans chaque
cellule un texte (destruire) et faire une macro de détection de clic
sur la cellule. Dans ce cas, pas de problème de bouton et récupération
aisée du numéro de ligne.

Dom.




1 2