Creer un bouton avec une macro?

BIOoOAG123 - 29 mars 2013 à 14:01
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 30 mars 2013 à 09:09
Bonjour tous le monde, je n'arrive pas à trouver la réponse à cette question, comment on créait une macro qui créé un bouton.

Pour l'instant, je copie colle des infos sur une nouvelle feuille, mais dans cette feuille je souhaite faire apparaitre un bouton (Avec une macro dessus bien évidement -> ça déjà je pense que c'est avec call ou un truc du genre) :)

Donc quel est le code pour créer ce bouton? (malgré mes recherche je n'y arrive pas.. Mon code de base pour l'instant c'est ça.)


'*******************Stockerl'analyse****************************************************
Sub StockerAnalyse()
Dim NomFeuille As String
Dim WorkSh As Worksheet

Select Case MsgBox("Les valeurs de l'analyse seront stockées sur une nouvelle feuille" & vbCrLf & "Voulez vous continuer?", vbYesNo + vbQuestion, "Stocker les valeurs de l'analyse")

Case vbYes
        i = Sheets.Count
        NomFeuille = InputBox("Entrez le nom de la feuille", "Nouvelle feuille", "Sauvegarde Analyse " & (i + 1 - 4))
        Set WorkSh = Sheets.Add(After:=Sheets(Sheets.Count))
        WorkSh.Name = NomFeuille
        Worksheets(NomFeuille).Range("A1").Value = Date
        Worksheets(4).Activate
        
        Range("B2:AY100").Select
        Selection.Copy
        
            With Worksheets(NomFeuille).Range("B3:AY1000")
            .PasteSpecial Paste:=xlPasteValues
            .PasteSpecial Paste:=xlPasteFormats
            .Application.CutCopyMode = False
            End With
        '*******Mise en page************
        Worksheets(NomFeuille).Columns("A:B").ColumnWidth = 18
        Worksheets(NomFeuille).Columns("C:C").ColumnWidth = 35
        Worksheets(NomFeuille).Columns("D:D").ColumnWidth = 19
        
        
Case vbNo
    Exit Sub
End Select


Worksheets(NomFeuille).Activate

End Sub


:)

14 réponses

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 14:08
Bonjour,
Quelle est donc l'absolue nécessité d'avoir ce bouton et cette macro sur la feuille créée et non ailleurs (sur n'importe quelle feuille déjà existante, par exemple et entre autres ) ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Le but est de stocker les résultats d'une autres feuille sur une nouvelle et de pouvoir avoir des boutons dessus servant à l'analyser par le biais de macro.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 14:15
Ca, c'est le but.
Je ne vois toujours pas pourquoi il serait indispensable de créer un bouton et une macro sur la feuille ajoutée et pourquoi ce bouton et cette macro ne pourraient pas être mis n'importe où ailleurs, sur de l'existant .


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 14:16
Y compris (mais pas uniquement) sur un Userform, alors affiché


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Juste une question de faciliter l'utilisation pour éviter de changer de feuille. Et UserForm ça va encombrer un peu non?
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 15:20
Juste une question de faciliter l'utilisation pour éviter de changer de feuille. Et UserForm ça va encombrer un peu non?

Tu peux traduire par "juste que question de compliquer les choses".
Tu sembles mal avoir compris que :
- il n'est pas nécessaire de se trouver sur une feuille pour agir sur ces cellules
- il n'est même pas nécessaire qu'elle soit visible, carrément
Excel est composé d'objets (classeur, feuilles, cellules, etc ...), sur lesquels on peut agir sans s'y rendre
WorkSheets("toto").Range("B12").value =  "bonjour"

placé n'importe où (où tu veux) dans ton appli, écrira "bonjour" dans la cellule B12 de la feuille toto, que cette feuille soit active ou non, visible ou pas !

A ce propos (et par ailleurs ) :
ce que tu as écrit là :
Set WorkSh  = Sheets.Add(After:=Sheets(Sheets.Count))
WorkSh.Name = NomFeuille
Worksheets(NomFeuille).Range("A1").Value = Date
Worksheets(4).Activate
Range("B2:AY100").Select
Selection.Copy
With Worksheets(NomFeuille).Range("B3:AY1000")
   .PasteSpecial Paste:=xlPasteValues
   .PasteSpecial Paste:=xlPasteFormats
   .Application.CutCopyMode = False
End With
'*******Mise en page************
Worksheets(NomFeuille).Columns("A:B").ColumnWidth = 18
Worksheets(NomFeuille).Columns("C:C").ColumnWidth = 35
Worksheets(NomFeuille).Columns("D:D").ColumnWidth = 19

n'est jamais rien d'autre, selon toujours le même principe de travail direct sur les objets, que :

With Sheets.Add(After:=Sheets(Sheets.Count))
   .Name = NomFeuille
  .Range("A1").Value = Date
  Range("B2:AY100").Copy Destination:=.Range("B3")
  .Columns("A:B").ColumnWidth = 18
  .Columns("C:C").ColumnWidth = 35
  .Columns("D:D").ColumnWidth = 19
 End With

Tu comprends ? Si tou : commence à travailler de cette manière. Tu ne pourras que t'en féliciter et ton appli s'en trouvera allégée et accélérée.
Profite de ton week-end pour te mettre sur ces rails là.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 15:45
J'appellerai plus tard (quand tu auras "digéré" d'abord ce début) ton attention sur un autre aspect assez dangereux du code que tu as écrit (tel qu'il est : sans autre précaution indispensable)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
J'ai comprend l'utilisation du With pour améliorer le code et l'alléger en travaillant directement sur les objets.

Mais dis moi toujours, je suis toute la journée à coder, donc je digère vite! :)
En tout cas merci beaucoup de ton aide, ça me fait progresser rapidement.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 15:59
"Dis-moi" quoi ? Où est le danger, dans ton code ?
Tout simplement en saisissant par malheur le nom d'une feuille déjà existance
Essaye et tu verras.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Ah oui effectivement! ^^ Faut vraiment penser à tout ce que peut faire un utilisateur!
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 18:39
Oui.
Et alors ? ===>>> A prévoir.
En fouillant parmi mes réponses (moins d'un mois, je pense), tu vas trouver la précaution à prendre.
Si tu ne trouves pas, dis et je te fais quelque chose.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
29 mars 2013 à 19:06
Regarde par exemple ce que fait ce petit bout de code :
Dim invite As String, nomfeuille As String, toto As String
invite = "Entrez le nom de la feuille"
Do
  nomfeuille = InputBox(invite, "Nouvelle feuille", "Sauvegarde Analyse " & (i + 1 - 4))
  On Error Resume Next
  toto = Worksheets(nomfeuille).Name
  If Err And nomfeuille <> "" Then
    On Error GoTo 0
    Exit Do
  Else
   invite = IIf(nomfeuille <> "", "ce nom de feuille existe déjà ! recommencez", "donnez un nom de feuille !")
  End If
Loop



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Je t'avoue que j'ai regardé dans tes réponses jusqu’au 02/02/2013 et je n'ai pas trouvé ce dont tu parles. :(
En gros c'est la gestion des erreurs si je comprend bien

Dès qu'il y a une erreur il relance le code, c'est bien ça? Le "Exit Do sert à quoi si la macro se relance à chaque erreur?


Sur msdn ils mettent ça :
Resume Next
Indique que dans le cadre d'une erreur d'exécution, le contrôle passe à l'instruction qui suit directement celle où s'est produite l'erreur ;
l'exécution se poursuit à partir de ce point. Utilisez ce formulaire plutôt que On Error GoTo lors de l'accès aux objets.?
J'ai du mal à saisir la différence..


Le "Err" dans ton code c'est quoi?
If Err And nomfeuille <> "" Then

Et le IIf?
invite = IIf(nomf...


Je t'avoue que c'est la 1ere fois que je vois ces contrôles.. :(
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
30 mars 2013 à 09:09
C'est simple
toto = Worksheets(nomfeuille).Name
provoquera une erreur si la feuille n'existe pas (précisément ce qu'on veut : qu'elle n'existe pas, hein...), mais provoquerait une erreur qui nous "jetterait".
Le On Error Resume Next qui le précède permet d'ignorer l'erreur et de continuer.
Mais on va, grâce à l'objet Err (ouvre ton aide sur sur mot), voir s'il y avait ou non une erreur (si err (si err > 0), il y avait une erreur et donc la feuille n'existait pas>> c'est alors bon et on quitte la boucle) Si au contraire err = 0 (donc pas si err), c'est que la feuille existe déjà ===>> on refuse et oblige l'utilisateur à revenir à la saisie (le Do va l'y obliger)
On Error Goto 0 fait que le prochain éventuel passage en boucle ne trimbalera pas l'erreur (err) précédente (on remet tout à 0)
Pas difficile, comme tu vois, juste un peu de gymnastique intellectuelle, comme au jeu du menteur.

PS : si j'ai ajouté la condition and nomfeuille <> "", c'est tout simplement pour éviter de traiter en gestion d'erreur alors que l'utilisateur n'aurait rien saisi.

Amuse-toi ce week-end à t'exercer à ce genre de gestion d'erreur. C'est un bon exercice intellectuel.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0