Se connecter avec
S'enregistrer | Connectez-vous

Excel 2003 Bouton avec code

Dernière réponse : dans Programmation

Bonjour à tous,

J'ai un bouton dans un onglet d'excel qui m'ouvre un onglet existant et me crée un bouton dessus.
Je voudrais savoir comment faire pour ajouter du code sur ce deuxième bouton qui me permettra d'ouvrir un autre onglet existant.
J'ai donc ce code qui après click sur le premier bouton, fait une recherche et, si elle est fructueuse, m'ouvre un onglet existant et crée un bouton dessus.

  1. Private Sub Chercher_Click()
  2. On Error Resume Next
  3.  
  4. Sheets(Range("B19").Value).Visible = 1
  5. If Err <> 0 Then
  6. MsgBox "Pas d'invité avec ce nom dans la liste. Faites une autre recherche. Attention à l'orthographe et aux accents.", , "Message Erreur"
  7. End If
  8. Sheets(Range("B19").Value).Activate
  9. ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
  10. , DisplayAsIcon:=False, Left:=183.75, Top:=119.25, Width:=169.5, _
  11. Height:=79.5).Select
  12. ActiveSheet.Shapes("CommandButton1").Select
  13.  
  14. End Sub


Je voudrais donc ajouter du code sur ce bouton, style :
Sheets("Modification").Activate

mais je ne sais pas comment l'appliquer à ce bouton.

Je demande donc votre aide. Merci.

Autres pages sur : excel 2003 bouton code

Lassé par la pub ? Créez un compte
Expert Programmation

Vindiou !!!! Du "vas-y comme je te pousse et si ça plante, je gère". Beurk.
Lis ce petit topic pour améliorer ta programmation. (Si je me suis donné la peine de l'écrire il y a déjà deux ans, c'est que tu n'es pas le seul à faire comme ça. Ça n'empêche que c'est très moche.)

Arrête avec tout ces Select et ces ActiveTruc, c'est mal.
Seul le Activate de la ligne 8 est légitime.

Utilise des variables pour désigner tes objets.

Par exemple, dans mon code, ws est la variable qui désigne la feuille (Worksheet) sur laquelle est ton bouton, et btn est la variable qui désigne ton bouton :
  1. Dim cm As CodeModule
  2.  
  3. Set cm = ws.Parent.VBProject.VBComponents(ws.Name).CodeModule
  4.  
  5. cm.InsertLines cm.CountOfLines + 1, _
  6. "Sub " & btn.Name & "_Click()" & vbCrLf & _
  7. " MsgBox ""HelloBEBER1212""" & vbCrLf & _
  8. "End Sub"

Merci,

Je vais prendre le temps d'étudier tout ça, histoire de coder dans les règles. :D 
Je précise que je débute, je n'avais jamais ni codé ni même ajouté un bouton dans Excel avant.

Je vais donc lire et voir ce que je peux faire avec tout ça. Merci en tous cas.

zeb,

La preuve que je débute vraiment : le code que tu me donnes, je ne sais même pas où le mettre pour le tester.
Est ce que je dois créer une macro avec ça ? L'entrer dans VB (mais je ne sais pas après comment le lancer) ?

Je comprends bien que ça doit m'ouvrir un message, mais bon...

Je réessayerai tout ça ce soir.

Merci.

Bonjour à tous, j'ai eu ma réponse pour faire ce que je souhaitais faire, à savoir un bouton créé automatiquement sur une page, pour en ouvrir une autre.
Le problème se situait dans la ligne :


  1. With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule




Il fallait remplacer .Name par .CodeName

Maintenant ça fonctionne.
Pour info, mon code en entier :


  1. Private Sub Chercher_Click()
  2. Dim laMacro As String
  3. Dim x As Integer
  4. On Error Resume Next
  5.  
  6. Sheets(Range("B19").Value).Visible = 1
  7. Application.ScreenUpdating = False
  8. If Err <> 0 Then
  9. MsgBox "Pas d'invité avec ce nom dans la liste. Faites une autre recherche. Attention à l'orthographe et aux accents.", , "Message Erreur"
  10.  
  11. Else: Sheets(Range("B19").Value).Activate
  12. With ActiveSheet
  13. .OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
  14. , DisplayAsIcon:=False, Left:=183.75, Top:=119.25, Width:=169.5, _
  15. Height:=79.5).Select
  16. .OLEObjects("CommandButton1").Object.Caption = "Modifier"
  17.  
  18. End With
  19.  
  20.  
  21. laMacro = "Sub CommandButton1_Click()" & vbCrLf
  22. laMacro = laMacro & "Sheets(""Modification"").Visible=1" & vbCrLf
  23. laMacro = laMacro & "Sheets(""Modification"").Activate" & vbCrLf
  24. laMacro = laMacro & "End Sub"
  25.  
  26.  
  27. With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
  28. x = .CountOfLines + 1
  29. .InsertLines x, laMacro
  30. End With
  31.  
  32.  
  33. Application.ScreenUpdating = True
  34. End If
  35. End Sub



Merci pour votre aide.
Expert Programmation

Ça marche, c'est l'essentiel.

-------------------

N'empêche que ton code est dégueulasse (*) :

Faire planter exprès l'appli c'est vraiment nul. Je t'ai filé de quoi faire autrement.
Ne pas de servir de variables pour pointer tes objets, ce n'est pas mieux. Ca ne marche que si tu n'as qu'un seul bouton. Et puis utiliser des variables te permettrait de t'affranchir des objets sélectionnés ou pas.

Pour ajouter une référence, clique sur le menu Outils/Références. VBA est modulaire, tous les modules ne sont pas chargés par défaut. Avec la façon dont tu as écrit ton code, tu n'as pas besoin de déclarer le CodeModule.

Tes ScreenUpdating ne sont pas correctement balancés. Tu vas au devant de problèmes.

Enfin, mais c'est pour pinailler, remplace tes Sheets par des Worksheets.

Citation :
Il fallait remplacer .Name par .CodeName
Tout à fait exact. Quand on ne change pas le nom des feuilles, Name = CodeName. Donc ça marche. Mais comme il est légitime de changer le nom des feuilles, il ne faut utiliser CodeName. Cette démonstration vaut surtout parce qu'elle pourrait s'appliquer aux éléments dont je te fais part juste avant.


(*) Pas toi, le code. Si le mot est rude, c'est pour appuyer bien fort.

Bonjour Zeb,

Effectivement, ça marche c'est l'essentiel, et effectivement mon code est peut-être dégueulasse. Je ne peux pas juger car je ne m'y connais pas assez.
Citation :
Faire planter exprès l'appli c'est vraiment nul

Tu parles du If Err <> 0 Then ... ?
En effet tu m'as donné un truc pour ça, mais comme je n'y connais vraiment rien, je ne sais pas du tout comment l'adapter à mon fichier. D'ailleurs il y a surement beaucoup d'autres choses dedans qui sont "dégueulasses".

Pour me servir de variables, c'est pareil. Je ne sais pas du tout comment m'en servir, ni comment les définir.

Les ScreenUpdating, idem. J'ai vu que ça permettait de ne pas voir les changements de pages et autre, mais je ne sais pas si il y a une façon correcte de les placer.

Voila, pour l'instant je ne sais donc pas comment l'améliorer...

Merci.

Expert Programmation

Voilà ce que je te propose. A étudier :o 

  1. Sub Chercher_Click()
  2. Dim laMacro As String
  3. Dim NomFeuille As String
  4. Dim Feuille As Worksheet
  5. Dim Bouton As OLEObject
  6.  
  7. NomFeuille = Worksheets("le nom de la feuille de départ").Range("B19").Value
  8. If Not WorksheetExists(NomFeuille) Then
  9. MsgBox "Pas d'invité du nom de '" & NomFeuille & "' dans la liste. " & vbCrLf & _
  10. "Faites une autre recherche. Attention à l'orthographe et aux accents.", , "Message Erreur"
  11. Exit Sub
  12. End If
  13.  
  14. Set Feuille = Worksheets(NomFeuille)
  15. Feuille.Activate
  16.  
  17. Set Bouton = Feuille.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
  18. Left:=183.75, Top:=119.25, Width:=169.5, Height:=79.5)
  19. Bouton.Object.Caption = "Modifier"
  20. Bouton.Name = "MonBouton" ' // <-- Version Luxe. Inutile en fait ;)
  21.  
  22. laMacro = "Sub " & Bouton.Name & "_Click()" & vbCrLf & _
  23. " Sheets(""Modification"" ).Visible=1" & vbCrLf & _
  24. " Sheets(""Modification"" ).Activate" & vbCrLf & _
  25. "End Sub"
  26. With ThisWorkbook.VBProject.VBComponents(Feuille.CodeName).CodeModule
  27. .InsertLines .CountOfLines + 1, laMacro
  28. End With
  29. End Sub


L'utilisation de ce code :
  1. With ThisWorkbook.VBProject.VBComponents(Feuille.CodeName).CodeModule
  2. .InsertLines .CountOfLines + 1, laMacro
  3. End With
te dispense d'avoir à utiliser celui-ci :
  1. Dim cm As CodeModule
  2. Set cm = Feuille.Parent.VBProject.VBComponents(Feuille.Name).CodeModule
  3. cm.InsertLines cm.CountOfLines + 1, laMacro


Je ne me traîne pas de clause Else trop longue. Je mets un Exit Sub dès qu'une condition sine qua non est fausse. (Ligne 10) (Je me suis permis de changer un peu ton message ;)  ).
Demande à Excel l'aide de la fonction Add() de l'objet OLEObjects. Tu verras que Link et DisplayAsIcon sont inutiles. Je les ai donc virés. (Ligne 16)
Je ne vois pas l'intérêt des ScreenUpdating. Même punition : virés.

Bonjour Zeb,

Merci pour ta réponse. Effectivement ce code est plus joli.
J'ai un problème avec :
  1. If Not WorksheetExists(NomFeuille) Then

"Sub ou fonction non définie"

J'ai cherché dans l'aide de VB, mais pas de résultat pour "WorksheetExists"... Je ne sais donc pas ce qui cloche.

Merci pour la modif du message d'erreur, je n'aurais pas su y intégrer le nom de la feuille.

A quoi sert la ligne 20, si elle est inutile ?

Merci.


Bonjour,

J'avais bien lu à la fois ton post, et le lien que tu m'as montré. Mais je me suis peut être mal expliqué.
Je sais ce qu'est WorksheetExists(), je sais que c'est pour permettre de trouver si une feuille existe dans un WorkBook, sans avoir à toutes les parcourir.
J'ai même essayé d'une autre façon que celle que tu m'as donné, en utilisant ce qu'il y a sur le lien, mais j'ai quand même un problème.
J'ai essayé avec ça :
  1. Dim NomFeuille As String
  2. Dim Feuille As Worksheet
  3. Dim Bouton As OLEObject
  4. Dim ws As Worksheet
  5.  
  6. Set wb = ActiveWorkbook
  7. NomFeuille = Worksheets("Recherche").Range("B19").Value
  8. For Each ws In wb.Worksheets
  9. If Not ws.Name = (NomFeuille) Then
  10. MsgBox "Pas d'invité du nom de '" & NomFeuille & "' dans la liste. " & vbCrLf & _
  11. "Faites une autre recherche. Attention à l'orthographe et aux accents.", , "Message Erreur"
  12. Exit For
  13. End If
  14. Next


Même si la page existe j'ai le message d'erreur, mais il l'ouvre quand même et ajoute le bouton...?!?
Je ne sais pas pourquoi j'ai le message d'erreur alors que j'ai "If not"...

Merci.
Expert Programmation

Mais qu'est-ce que tu fais !? :ouch:  (*)

Avec ce code, tu parcours toutes les feuilles, et à chaque fois que tu en rencontres une qui n'est pas la bonne, tu auras le message d'erreur, évidemment.

Copie WorksheetExists() telle quelle, et utilise-la dans ton code comme je te le propose.

------------------
(*) J'aime bien quand même le fait que tu ais cherché à comprendre et à modifier à ton profit le code que je te proposais ;) 

Citation :
Mais qu'est-ce que tu fais !? :ouch:  (*)
:D 

C'est bien ce qui me semblait, que mon code vérifiait toutes les pages, mais je n'étais pas sûr...

Quand tu me dis
Citation :
Copie WorksheetExists() telle quelle
, tu parles de ton code dans ton précédent post ? ou le code du lien que tu m'as donné pour vérifier si un onglet existe ?
J'ai essayé avec ton code, en remplaçant "le nom de la feuille de départ", par "Recherche" (le nom de la feuille de départ ;)  ), mais comme je t'ai dit, j'ai un problème avec :
  1. 1. If Not WorksheetExists(NomFeuille) Then

"Sub ou fonction non définie" ...
Expert Programmation

WorksheetExists() est une fonction que j'ai écrite et publiée pour vous tous.
Le code est dans l'autre topic. Copie ce code dans ton module, avant ta fonction Chercher_Click(). Elle ne sera plus non définie.

OK, merci. Je n'avais pas pigé qu'il fallait "lier" les deux. Maintenant ça fonctionne comme je le voulais.

Je vais pouvoir m'attaquer à "comment supprimer le bouton son code" en appuyant sur un autre bouton. Pfiuuu...

Merci.

Edit : P.S : j'ai ajouté la ligne
  1. Feuille.Visible=1
avant la ligne 15
  1. Feuille.Activate

Merci.

Comment supprimer un bouton et son code, sur une feuille qui n'existe pas encore mais qui , une fois créée, aura pour nom : Worksheets("Recherche" ).Range("B19" ).Value

Je m'explique :

Sur une feuille "1", j'ai un bouton qui me crée :
- une feuille "2" que je renomme avec la valeur d'une cellule de la feuille "1", soit Worksheets("1" ).Range("B19" ).Value
- un bouton sur cette feuille "2"

Le bouton créé sur la feuille "2" m'ouvre une feuille "3" (qui existe déjà mais cachée) sur laquelle il existe un bouton qui :
- copie une ligne de la feuille "3" sur la feuille "1"
- supprime le bouton et son code de la feuille "2" qui s'appelle en fait maintenant : Worksheets("1" ).Range("B19" ).Value

Voila. Est-ce plus clair ? De toutes façons je ne sais pas comment l'être plus... :D 
Expert Programmation

Citation :
Qui n'existe pas encore.

Ah, voilà l'explication. C'est clair.

Alors tu te souviens que je te disais que c'était du luxe de nommer tes boutons. Pour ce que nous avions à faire avant, oui. Pour ce que nous avons à faire maintenant, non.
:sol: 

Or donc. Tu vas dans l'éditeur VBA et tu ouvres le menu Option/Références de ton projet. Tu y trouves la ligne VBA Extensibility ou un truc comme ça, et tu coches.

Comment trouver un bouton dans une feuille ?

Souvenons-nous d'abord comment on le crée. Soit ws, une variable pointant sur la feuille (Worksheet) :
  1. Dim btn As OLEObjet
  2. Set btn = ws.OLEObjects.Add("Forms.CommandButton.1")
  3. btn.Name = "le_bouton_de_la_feuille_2_auquel_beber_a_penser_a_donner_un_nom"


Pour le retrouver, facile. Il suffit de l'appeler par son nom que l'on connaît puique c'est nous qui l'avons choisi :spamafote: 
Il reste à le supprimer.

  1. Dim btn As OLEObjet
  2. Set btn = ws.OLEObjects("le_bouton_de_la_feuille_2_auquel_beber_a_penser_a_donner_un_nom")
  3. btn.Delete

Srofacile :sol: 

Bon, maintenant il reste des bouts de code perdu :/ 
Alors avant la fatidique ligne Delete, on va ajouter ce code :

  1. Dim Start As Long
  2. Dim Count As Long
  3. Dim cm As CodeModule
  4.  
  5. Set cm = ws.Parent.VBProject.VBComponents(ws.CodeName).CodeModule
  6.  
  7. Start = cm.ProcStartLine (btn.Name & "_Click", vbext_pk_Proc)
  8. Count = cm.ProcCountLines(btn.Name & "_Click", vbext_pk_Proc)
  9. cm.DeleteLines Start, Count

En fait j'ai été plus clair :)  , sauf que je me suis trompé. :( 
Je reprends :

Pas de Changement :
Sur une feuille "1", j'ai un bouton qui me crée :
- une feuille "2" que je renomme avec la valeur d'une cellule de la feuille "1", soit Worksheets("1" ).Range("B19" ).Value
- un bouton sur cette feuille "2"

Changement:
Le bouton créé sur la feuille "2" :
- m'ouvre une feuille "3" (qui existe déjà mais cachée) sur laquelle il existe un bouton qui copie une ligne de la feuille "3" sur la feuille "1"
- supprime le bouton et son code de la feuille "2" qui s'appelle en fait maintenant : Worksheets("1" ).Range("B19" ).Value

C'est le bouton de la feuille "2" qui une fois qu'il a ouvert la feuille "3", se supprime et supprime son code. Je pense donc qu'il ne faut pas supprimer le code avant le bouton (sinon il ne "saura" plus qu'il doit se supprimer).

Je dois donc ajouter les lignes de suppression au code :
  1. laMacro = "Sub " & Bouton.Name & "_Click()" & vbCrLf & _
  2.               "  Sheets(""Modification"" ).Visible=1" & vbCrLf & _
  3.               "  Sheets(""Modification"" ).Activate" & vbCrLf & _
  4.               "End Sub"


J'ai essayé :
  1. laMacro = "Sub " & Bouton.Name & "_Click()" & vbCrLf & _
  2. " Dim NomFeuille As String" & vbCrLf & _
  3. " Dim Btn As OLEObject" & vbCrLf & _
  4. " Dim Start As Long" & vbCrLf & _
  5. " Dim Count As Long" & vbCrLf & _
  6. " Dim cm As CodeModule" & vbCrLf & _
  7. " Dim ws As Worksheet" & vbCrLf & _
  8. " Sheets(""Recherche"" ).Visible=0" & vbCrLf & _
  9. " Sheets(""Modification"" ).Visible=1" & vbCrLf & _
  10. " Sheets(""Modification"" ).Activate" & vbCrLf & _
  11. " NomFeuille = Worksheets(""Recherche"").Range(""B19"").Value" & vbCrLf & _
  12. " Set Feuille = Worksheets(NomFeuille)" & vbCrLf & _
  13. " Set cm = ws.Parent.VBProject.VBComponents(ws.CodeName).CodeModule" & vbCrLf & _
  14. " Start = cm.ProcStartLine(Btn.Name & ""_Click"", vbext_pk_Proc)" & vbCrLf & _
  15. " Count = cm.ProcCountLines(Btn.Name & ""_Click"", vbext_pk_Proc)" & vbCrLf & _
  16. " cm.DeleteLines Start, Count" & vbCrLf & _
  17. " Set btn = Feuille.OLEObjects(""MonBouton"")" & vbCrLf & _
  18. " btn.Delete" & vbCrLf & _
  19. " End Sub"


Mais il y a un problème à la ligne 13 : Variable objet ou variable de bloc with non définie. :( 
Expert Programmation

C'est ws qui est inconnu. Et pour cause :

J'ai écris :
Citation :
Soit ws, une variable pointant sur la feuille

Tu as codé :
  1. Set Feuille = Worksheets(NomFeuille)


Ben si tu donnes un nom différent à tes variables, adapte le code que je te propose :spamafote: 
Eh, t'aurais pas oublié de déclarer ta variable ,

EDIT:
Tiens en passant, ça prouve que tu n'utilises pas l'Option Explicit (c'est mal).

Au dessus, j'ai :
  1. " Dim ws As Worksheet" & vbCrLf & _


Et même en essayant :
  1. " Set cm = Feuille.Parent.VBProject.VBComponents(Feuille.CodeName).CodeModule" & vbCrLf & _

ça marche pas...

C'est quoi l'Option Explicit ? OK je viens de voir sur le net.
Par contre je viens d'activer l'option "Déclaration des variables obligatoire", mais ça se met apparemment que sur les nouvelles feuilles. Comment je fais pour ajouter l'Option Explicit (Edit: sur une Sub qui existe déjà)?
Lassé par la pub ? Créez un compte