Rajout d'un bouton par un code VBA

Bonjour le Forum,

J'ai essayé - par le code déjà en place dans mon fichier ci-joint - d'ajouter un bouton permettant de lancer par la suite une deuxième macro (cette deuxième macro n'est pas encore créée, mais je devrais pouvoir y arriver tout seul par la suite). Cette première macro est lancée - à condition qu'il y ait des données à traiter, autrement cliquer sur le bouton "Exemple pour un essai" - par le bouton "Sous-totaux et Tableau croisé dynamique".

Voici un extrait de ma macro actuelle avec l'un de mes essais avortés ; ça bloque sur les lignes neutralisées par des apostrophes.

        Range("G" & i + 5) = "Cette macro ne peut être utilisée qu'une seule fois."
        Range("G" & i + 6) = "Pour d'autres essais, ouvrir à nouveau le fichier de base."

'......................................

       Range("G" & i + 7).Select
'    With .Buttons.Add(1, 1, 100, 50)
'        .OnAction = "Effacement"
'        .Characters.Text = "Effacer les deux lignes ci-dessus"
'    End With
'   End With

Pouvez-vous m'aider sur ces simples explications ou avez-vous besoin de renseignements complémentaires ?

Bonnes salutations.

31journal-v1.zip (30.14 Ko)

Bonjour,

Essaie comme ceci :

With Activesheet.Buttons.Add(1, 1, 100, 50)
       .OnAction = "Effacement"
       .Caption= "Effacer les deux lignes ci-dessus"
End With

Amicalement

Salut Dan et merci beaucoup pour ta réponse.

Le nouveau bouton est bien mis en place grace à ton complément de code ; j'aurais cependant désiré qu'il apparaisse proche des deux cellules [Range("G" & i + 5) et Range("G" & i + 6)] qui seraient par la suite effacées par ce bouton (et par le code à créer encore).

C'est la raison pour laquelle j'avais essayé de sélectionner la cellule Range("G" & i + 7) dans l'espoir que le nouveau bouton y soit rattaché.

Peux-tu encore m'aider sur ce coup-là ?

A te relire

re,

C'est la raison pour laquelle j'avais essayé de sélectionner la cellule Range("G" & i + 7) dans l'espoir que le nouveau bouton y soit rattaché.

Faire référence à une cellule pour un objet n'est pas évident. Imaginons que tu élargisses tes cellules. La position d'un objet se détermine en point depuis le début de ta feuille. On peut positionner un objet mais delà à le faire bouger en fonction des cellules cela deviendrait complexe.

Pourquoi ne pas faire une barre d'outils spécifique qui reprend tes trois boutons ? un exemple ici dans le fichier "Mammouth 5.zip" que j'ai posté Lun Aoû 09, 2010 9:31 pm --> https://forum.excel-pratique.com/excel/degraissez-le-mammouth-test-macro-t18303-10.html?hilit=mammouth

A te relire

Salut Dan,

Merci beaucoup pour ta réponse. J'ai jeté un coup d'oeil à la solution proposé, mais ça n'a pas l'air si simple.

J'ai encore eu une autre idée. Si j'inscrit le bout de code ci-dessous, est-il possible d'activer la fonction qui ferait qu'une macro serait lancée lorsque l'on cliquerait dans cette cellule ?

Range("G" & i + 7) = "Cliquer dans la cellule G" & i + 7 & "afin d'effacer les deux lignes ci-dessus"

J'ai maintenant créé la macro Sub Effacer_3_lignes() qui devrait être lancée lorsque l'on clique dans la cellule G & i + 7.

A te relire.

19journal-v2.zip (29.73 Ko)

Re

Si j'ai bien saisi ta dernière demande, fais ceci :

- Dans la feuille Base mets ce code :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Macro Dan pour yvouille le 24/08/2010
If Not Intersect(Target, Range("G" & Range("G65536").End(xlUp).Row + 7)) Is Nothing Then
Call Effacer_3_lignes
End If
End Sub

- Dans le module, remplace le code existant par celui-ci :

Sub Effacer_3_lignes()
Dim i As Integer
i = ActiveSheet.Range("G65536").End(xlUp).Row
Rows(i & ":" & i - 2).Delete
Range("A" & i).Select
End Sub

Le code sera exécuté si tu cliques sur la cellule se trouvant 7 cellules en dessous de la dernière cellule complétée en colonne G.

A te relire

Re-salut Dan,

Je pense que tu as bien compris mon idée, mais ça ne semble pas être si simple.

Ta nouvelle macro Private Sub Worksheet_SelectionChange - qui appelle la macro Effacer_3_lignes - est maintenant déclanchée à tout bout de champs, je pense à chaque fois que la cellule Range("G" & Range("G65536").End(xlUp).Row + 7) est modifiée.

Ainsi si je lance ma macro Démo par exemple, j'ai des drôles de résultats (des lignes sont effacées par erreur) et si je lance la macro TDC, ça bloque sur la macro Effacer_3_lignes à la ligne Rows(i & ":" & i - 2).Delete.

Penses-tu qu'il y a une solution ?

Ci-joint un fichier avec tes nouvelles macros et des cas réduits pour de nouveaux essais.

A te relire.

28journal-v3.zip (25.38 Ko)

re,

je pense à chaque fois que la cellule Range("G" & Range("G65536").End(xlUp).Row + 7) est modifiée.

Non elle réagit à chaque changement de sélection sur ta feuille mais on peut aussi la faire réagir uniquement sur changement de valeur en G & i + 7. Le code Effacer est quant à lui exécuté lors de la sélection de G & i +7.

j'ai des drôles de résultats

Fais ceci :

- Dans la feuille Base, mets cette instruction juste avant le If Not Intersect

If ok = True Then Exit Sub
  • Dans le module juste après "Option explicit", mets ceci --> Public ok As Boolean
  • dans le module, remplace la macro DEMO par celle ci-dessous :
Sub Démo()
ok = True
Application.ScreenUpdating = False
Sheets("Cas pour démo").Rows("1:188").Copy Sheets("Base").Range("A2")
Sheets("Base").Select
Range("K1").Select
ok = False
End Sub

A te relire

Dan,

J'ai effectué les modifications que tu m'as indiquées et la macro DEMO passe bien.

Comme la macro TDC bloquait toujours au même endroit, j'ai essayé d'y ajouter également ok = true au début et ok = false à la fin. Cette macro passe alors également sans problème de même que - à la suite - l'effacement des lignes désirées. Youpie !

A tout hasard, voici le travail final :

34journal-v4.zip (24.60 Ko)

Un tout grand merci pour ton aide.

Bonnes salutations.

Rechercher des sujets similaires à "rajout bouton code vba"