Votre question
Résolu

Excel Bouton(macro) qui renvoi le numéro de la ligne dans lequel il est ?

Tags :
  • Microsoft Excel
  • Programmation
Dernière réponse : dans Programmation
1 Mars 2016 13:45:53

Bonjour,

j'aimerais savoir si il est possible de créer une colonne de boutons chacun reliés à une même macro. Et que chaque bouton actionne la macro mais avec le numéro de la ligne dans laquelle il se trouve.

Le but étant de copier la ligne à la suite dans un classeur excel. Et de juste avoir à cliquer sur le bouton qui se trouve sur la ligne que l'on veut copier.

Je ne sais pas du tout si c'est réalisable.
Si vous avez une meilleure idée pour réaliser cela, je suis preneur.

Une autre solution qui conviendrait très bien au problème. Serait une macro qui se lancerait en récupérant le numéro de la ligne dans laquelle se trouve la cellule sélectionner.

Merci d'avance à tout ceux qui pourront m'aider.

Autres pages sur : excel bouton macro renvoi numero ligne

a c 77 L Programmation
1 Mars 2016 15:28:11

Salut, pour les boutons c'est loin d'être facile car il ne sont pas lié a la cellule dans laquelle tu la placé ...
ça ne veut pas dire que c'est impossible, tu pourrais utiliser le nom du bouton pour passer le numéro de ligne, mais c'est vite contraignant, surtout si tu insères ou effaces des lignes ...
Ta deuxième solution est donc a privilégier. Comment aimerais-tu que la macro se lance ? (on peut imaginer un double click sur la cellule, une simple selection de la cellule, l'ajout d'une entrée dans le menu contextuelle (click droit), un bouton quelque part sur la page ...)
m
0
l
1 Mars 2016 15:38:23

Je trouve aussi que la deuxième solution est la mieux.
Tu proposes des solutions que je ne savais même pas réalisable. ^^ Mais a choisir l'ajout d'une entrée dans le menu contextuelle ( Soit le click droit) est le plus propre.

J'ai déjà un premier jet de ma macro, il ne me reste plus qu'à la débuguer:

  1. Sub test()
  2.  
  3. Dim sourceSheet As Worksheet
  4. Dim destSheet As Worksheet
  5.  
  6. Set sourceSheet = ActiveSheet
  7.  
  8. Workbooks.Open Filename:="S:\folder\file.xlsx"
  9. Set destSheet = Worksheets("Bordereau envoi") 'si j'ai bien compris "Bordereau envoi" est le nom de mon onglet ?
  10.  
  11. 'Copie de la colonne A à L pour la ligne 5 et collé dans la colonne B à M à la ligne 5
  12. sourceSheet.Range(sourceSheet.Cells(5, "A"), sourceSheet.Cells(5, "L")).Copy destSheet.Range(destSheet.Cells(5, "B"), destSheet.Cells(5, "M"))
  13.  
  14. sourceSheet.Cells(4, "S").Copy destSheet.Cells(4, "O")
  15.  
  16. ActiveWorkbook.Save
  17.  
  18. End Sub


J'ai d'ailleur une erreur d'automation quand je fais ma copie:
  1. "sourceSheet.Range(sourceSheet.Cells(5, "A"), sourceSheet.Cells(5, "L")).Copy destSheet.Range(destSheet.Cells(5, "B"), destSheet.Cells(5, "M"))"


Je dois encore mal appliquer mes fonctions... ><
m
0
l
Contenus similaires
a c 77 L Programmation
1 Mars 2016 16:51:22

Evidement le bouton droit, c'est pas la solution la plus simple ;) 


Pour ton erreur, assure toi que ton Workbook source est bien actif quand tu lance ta macro ! (pour les tests je te conseille toujours fermer "file.xlsx")
Une fois que l'erreur sera régler je montre comment ajouter qqch dans le menu contextuel
m
0
l
2 Mars 2016 14:04:14

Ca fonctionne, je devais avoir le fichier file.xlsx ouvert donc la fonction Open buguait... Bienvu ^^
m
0
l
a c 77 L Programmation
2 Mars 2016 14:18:48

Ok, toujours intéressé par le menu contextuel ?
m
0
l
3 Mars 2016 15:22:02

Oui, très. ^^
Excuse moi si je mets du temps à répondre à chaque fois. J'ai une accumulation de boulot/Projets en ce moment. ><
m
0
l
a c 77 L Programmation
3 Mars 2016 16:27:08

Pas de soucis, j'essaie de te pondre quelque chose demain, sinon lundi ....
m
0
l

Meilleure solution

a c 77 L Programmation
4 Mars 2016 08:38:51

Dans le "Project Navigator" (la fenêtre sur la gauche dans VBA), double clique sur "ThisWorkbook", ensuite copie le code suivant:

  1. Private Sub Workbook_Activate() ' on crée les boutons a chaque activation du classeur
  2. Dim cmdBar As CommandBar
  3. Dim contextItem As Variant
  4. For Each cmdBar In Application.CommandBars
  5. If cmdBar.Name = "Cell" And cmdBar.Position = msoBarPopup Then
  6. If cmdBar.Controls(1).Tag <> "myContextButton" Then ' choisit un nom cohérent il doit être unique prends en donc un différent pour chaque boutons
  7. Set contextItem = cmdBar.Controls.Add(msoControlButton, , , 1, True)
  8. With contextItem
  9. .Tag = "myContextButton" 'le même nom que ci dessus!
  10. .Caption = "ma macro" ' le texte qui sera affiché dans le menu contextuel
  11. .OnAction = "test" 'Le nom de la macro à lancer. Elle doit impérativement être dans un module !
  12. .BeginGroup = True 'crée un nouveau "groupe" donc une barre au dessus du nom dans le menu contextuel
  13. .Enabled = True 'pour pouvoir cliquer dessus ....
  14. End With
  15. End If
  16. End If
  17. Next
  18. End Sub
  19.  
  20. Private Sub Workbook_Deactivate() ' et on les détruits à chque désactivation, afin d'éviter de retrouver tes fonctions dans d'autres classeurs ...
  21. Dim cmdBar As CommandBar
  22. On Error Resume Next
  23. For Each cmdBar In Application.CommandBars
  24. cmdBar.FindControl(msoControlButton, , "myContextButton").Delete 'supprime le bouton quand tu désactive ton workbook
  25. Next
  26. End Sub


Ok, le bouton est crée dans le menu contextuel, maintenant il faut crée un module (dans le project explorer, click droit sur le projet --> insert --> module) et mettre la macro test dedans.
Ci dessous un exemple qui affichera le contenu de la cellule "A" pour chaque ligne de ta selection:

  1. Public Sub test()
  2. Dim cell As Range
  3.  
  4. For Each cell In Selection.Rows
  5. MsgBox Cells(cell.Row, 1).Value
  6. Next
  7.  
  8. End Sub


N.B. si tu veux un deuxième bouton, il faudra changer le nom et l'indice du bouton:
  1. '...
  2. If cmdBar.Controls(2).Tag <> "myContextButton2" Then 'un autre nom
  3. Set contextItem = cmdBar.Controls.Add(msoControlButton, , , 2, True)
  4. With contextItem
  5. .Tag = "myContextButton2" 'le même nom que ci dessus!
  6. '...

La variable "contextItem" peut par contre être réutilisé, et n'oublie pas de le détruire dans "deactivate" !
partage
4 Mars 2016 10:36:24

Ouah merci beaucoup, c'est beaucoups plus propre avec ça. ^^
m
0
l
a c 77 L Programmation
4 Mars 2016 10:52:46

Déjà tester ? ça fonctionne comme tu le désires ?
m
0
l
12 Avril 2016 10:39:33

Salut Drul,

j'ai pu tester la technique que tu expliques: Création du bouton dans le menu contextuel ainsi que de la macro.
Malheureusement, même si le bouton dans le menu contextuel est bel et bien créé, la macro ne s'exécute pas et le message d'erreur suivant d'affiche: " impossible d'exécuter la macro [...] Il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros soient désactivées."

J'ai repris la macro que tu as posté pour faire un test dans un premier temps. Vois tu ce qui pourrait clocher ?
m
0
l
a c 77 L Programmation
13 Avril 2016 08:32:17

Salut, la macro que tu dois appeler dois se trouver dans un "module" sinon ça marche pas.



Il faut bien la déclarer comme étant public cf. mon message précédent
m
0
l
13 Avril 2016 11:34:16

Oui, c'est bien le cas. Elle est déclaré en public et bien dans un module.

Néanmoins avant d'aller plus loin, est-t-il possible qu'en cliquant sur cette macro avec le clic droit, la macro se lance avec en variable d'entrée le numéro de la ligne à laquelle appartient la cellule ?

Le but étant de faire un clic droit sur la ligne pour lancer la macro AjouterLigneDansLeBordereau.
Ce qui ajouterait certain champs de cette ligne dans un autre fichier déjà créé.

Du coups, si ce n'est pas possible, ça ne sert à rien qu'on recherche l'erreur. ^^ Et j'utiliserais une autre méthode.
m
0
l
13 Avril 2016 11:52:06

J'ai déjà une méthode qui me permettrait de contourner le clic droit si ça ne fonctionne pas. ( mm si c'est moins élégant)

Par contre, j'ai commencé à coder et je tombe sur une erreur. Encore une fois j'applique une fonction sur un objet qui ne la possède pas.

Public Sub AjoutBordereauArchiveco()

Dim i As Long

Dim sourceSheet As Workbook
Dim bordereau As Worksheet

Set sourceSheet = ActiveSheet
Set bordereau = Workbooks.Open("S:\GS-PF\SecurisationDesarchivage\Maquette Bordereau envoi à ARCHIVECO.xlsx")

bordereau.Sheets(1).Cells(1, "A") = sourceSheet.Cells(4, "B")

bordereau.Save , local:=True

End Sub


J'ai essayé comme ça mais ça ne marche pas mieux: erreur Erreur d'execution 13: Incompatibilité de type.

  1. Public Sub AjoutBordereauArchiveco()
  2.  
  3. Dim i As Long
  4.  
  5. Dim sourceSheet As Workbook
  6. Dim destSheet As Workbook
  7. Dim bordereau As Worksheet
  8.  
  9. Set sourceSheet = ActiveSheet
  10. Set destSheet = Workbooks.Open("S:\GS-PF\SecurisationDesarchivage\Maquette Bordereau envoi à ARCHIVECO.xlsx")
  11. Set bordereau = destSheet.Sheets(1)
  12.  
  13. bordereau.Cells(1, "A") = sourceSheet.Cells(4, "B")
  14.  
  15. bordereau.SaveAs Filename:="001.xlsx", local:=True
  16.  
  17. End Sub
m
0
l
a c 77 L Programmation
13 Avril 2016 12:46:08

Je manque de temps actuellement, mais en fait non, tu ne peux pas passer d'argument à la fonction de cette manière. C'est dans la fonction appeler que tu dois déterminer la cellule sur laquelle tu as clické àl'aide de "selection.gnagnagna"
m
0
l