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

  • Auteur de la discussion Aboutblank
  • Date de début

Aboutblank

Habitué
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.

 

drul

Obscur pro du hardware
Staff
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 ...)
 

Aboutblank

Habitué
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:

Code:
Sub test()

Dim sourceSheet As Worksheet
Dim destSheet As Worksheet
 
Set sourceSheet = ActiveSheet

Workbooks.Open Filename:="S:\folder\file.xlsx"
Set destSheet = Worksheets("Bordereau envoi") 'si j'ai bien compris "Bordereau envoi" est le nom de mon onglet ?

'Copie de la colonne A à L pour la ligne 5 et collé dans la colonne B à M à la ligne 5
sourceSheet.Range(sourceSheet.Cells(5, "A"), sourceSheet.Cells(5, "L")).Copy destSheet.Range(destSheet.Cells(5, "B"), destSheet.Cells(5, "M"))

sourceSheet.Cells(4, "S").Copy destSheet.Cells(4, "O")

ActiveWorkbook.Save

End Sub

J'ai d'ailleur une erreur d'automation quand je fais ma copie:
Code:
"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... ><
 

drul

Obscur pro du hardware
Staff
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
 

Aboutblank

Habitué
Ca fonctionne, je devais avoir le fichier file.xlsx ouvert donc la fonction Open buguait... Bienvu ^^
 

drul

Obscur pro du hardware
Staff
Ok, toujours intéressé par le menu contextuel ?
 

Aboutblank

Habitué
Oui, très. ^^
Excuse moi si je mets du temps à répondre à chaque fois. J'ai une accumulation de boulot/Projets en ce moment. ><
 

drul

Obscur pro du hardware
Staff
Pas de soucis, j'essaie de te pondre quelque chose demain, sinon lundi ....
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
Dans le "Project Navigator" (la fenêtre sur la gauche dans VBA), double clique sur "ThisWorkbook", ensuite copie le code suivant:

Code:
Private Sub Workbook_Activate() ' on crée les boutons a chaque activation du classeur
Dim cmdBar As CommandBar
Dim contextItem As Variant
For Each cmdBar In Application.CommandBars
    If cmdBar.Name = "Cell" And cmdBar.Position = msoBarPopup Then
        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
            Set contextItem = cmdBar.Controls.Add(msoControlButton, , , 1, True)
            With contextItem
                .Tag = "myContextButton" 'le même nom que ci dessus!
                .Caption = "ma macro" ' le texte qui sera affiché dans le menu contextuel
                .OnAction = "test" 'Le nom de la macro à lancer. Elle doit impérativement être dans un module !
                .BeginGroup = True 'crée un nouveau "groupe" donc une barre au dessus du nom dans le menu contextuel
                .Enabled = True 'pour pouvoir cliquer dessus ....
            End With
        End If
    End If
Next
End Sub

Private Sub Workbook_Deactivate() ' et on les détruits à chque désactivation, afin d'éviter de retrouver tes fonctions dans d'autres classeurs ...
Dim cmdBar As CommandBar
On Error Resume Next
For Each cmdBar In Application.CommandBars
    cmdBar.FindControl(msoControlButton, , "myContextButton").Delete 'supprime le bouton quand tu désactive ton workbook
Next
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:

Code:
Public Sub test()
Dim cell As Range

For Each cell In Selection.Rows
    MsgBox Cells(cell.Row, 1).Value
Next

End Sub

N.B. si tu veux un deuxième bouton, il faudra changer le nom et l'indice du bouton:
Code:
'...
        If cmdBar.Controls(2).Tag <> "myContextButton2" Then 'un autre nom
            Set contextItem = cmdBar.Controls.Add(msoControlButton, , , 2, True)
            With contextItem
                .Tag = "myContextButton2" 'le même nom que ci dessus!
'...
La variable "contextItem" peut par contre être réutilisé, et n'oublie pas de le détruire dans "deactivate" !
 

Aboutblank

Habitué
Ouah merci beaucoup, c'est beaucoups plus propre avec ça. ^^
 

drul

Obscur pro du hardware
Staff
Déjà tester ? ça fonctionne comme tu le désires ?
 

Aboutblank

Habitué
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 ?
 

drul

Obscur pro du hardware
Staff
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
 

Aboutblank

Habitué
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.
 

Aboutblank

Habitué
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.

Code:
Public Sub AjoutBordereauArchiveco()

Dim i As Long

Dim sourceSheet As Workbook
Dim destSheet As Workbook
Dim bordereau As Worksheet

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

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

bordereau.SaveAs Filename:="001.xlsx", local:=True
 
End Sub
 

drul

Obscur pro du hardware
Staff
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"
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 068
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut