Création d'un bouton de commande par macro

P

Patrick.

Guest
Bonjour, j'ai un problème que j'ai du mal à appréhender.
A l'aide d'une macro de lancement, je crée un fichier temporaire de travail ou je copie des données, les trie, fait des comparaisons, ... et tout cela fonctionne et souvent avec des réponses du Forum (que je remercie encore) mais maintenant, j'aimerais que ma macro crée dans mon fichier temporaire un bouton de commande que j'aimerais nommé (Ex : retour"), lui donner des propriétes de couleur, de police, de position, de taille et que ce bouton puisse me donner le retour vers le fichier d'origine propriétaire de ma macro de lancement.
J'espère que mes explications sont suffisament claires
Je vous remercie si quelq'un a une solution ou entrevoit une possibilité.
Je suis récepteur de toutes vo suggestions
Patrick.
 
M

michel

Guest
bonjour Patrick

tu peux tester cette macro qui créée un nouveau , et y insere un bouton personnalisé permettant de fermer le classeur sans sauvegarde


Sub CreationBoutonETMacro()
Dim Obj As OLEObject
Dim Code As String, NextLine As String

Workbooks.Add 'creation nouveau classeur

Set Obj = ActiveSheet.OLEObjects.Add("Forms.CommandButton.1", _
Left:=10, Top:=10, Height:=20, Width:=100) 'ajout bouton dans nouveau classeur

Obj.Object.Caption = "Fermer classeur"
Obj.Object.BackColor = RGB(255, 255, 0) 'couleur bouton

Code = "Sub CommandButton1_Click()" & vbCrLf 'creation de la procedure associée au bouton
Code = Code & "ThisWorkBook.Close False" & vbCrLf
Code = Code & "End Sub"

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
NextLine = .CountOfLines + 1
.InsertLines NextLine, Code
End With

End Sub


bon apres midi
MichelXld
 
P

Patrick.

Guest
Bonjour Michel et merci pour ta réponse. Cela correpond à peu près à ce que je désire mais je ne comprends pas trop la signification des lignes suivantes :

ode = "Sub CommandButton1_Click()" & vbCrLf 'creation de la procedure associée au bouton
Code = Code & "ThisWorkBook.Close False" & vbCrLf
Code = Code & "End Sub"

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
NextLine = .CountOfLines + 1
.InsertLines NextLine, Code


Peux-tu m'aider ?
Merci
Patrick
 
M

michel

Guest
bonjour Patrick

cette partie de la procedure créée une nouvelle macro dynamiquement(par macro) et l'insére à un endroit précis dans l'éditeur de macros


tout d'abord , creation d'une procédure qui permet d'associer une action au nouveau bouton (cet exemple ferme le classeur contenant la macro , sans sauvegarde ; lorsque que l'on clique sur le bouton )
Code = "Sub CommandButton1_Click()" & vbCrLf 'creation de la procedure associée au bouton
Code = Code & "ThisWorkBook.Close False" & vbCrLf
Code = Code & "End Sub"


ensuite insérer la nouvelle macro dans la feuille active
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule'determine l'emplacement dans l'editeur de macros(ActiveSheet=Feuille active)
NextLine = .CountOfLines + 1 'compte le nombre de lignes dans l'editeur de macros
.InsertLines NextLine, Code 'inseres la procedure à la suite


si tu vas dans Visual Basic Editor ( Alt+F11 )apres avoir utilisé cette procedure ,
dans l'explorateur de projets cliques sur "Feuil1" ( pour le classeur temporaire ) : tu dois normalement voir la nouvelle macro créée

CommandButton1_Click()
ThisWorkBook.Close False
End Sub


bonne journée
MichelXld
 
P

Patrick.

Guest
Bonsoir Michel et merci pour ces éclaircissements mais j'ai encore des zones d'ombre au point de vue syntaxe.

Je pense avoir compris dans tes explications que les 3 lignes commençant par Code était la macro que normalement on développe avec l'éditeur. C'est à dire que je peux rajouter autant de lignes que je désire en commençant la ligne par Code = Code & "Ce que je désire" & vbCrLf (qui est le retour chariot et l'interligne). Merci de me dire si je me trompe.

Ce que je désire réellement est que dans mon fichier temporaire (ouvert par une macro du fichier "Lancement"), je positionne un bouton de commande (ce qui est fait par les premières lignes de ta macro) qui me permette lorsque je clique dessus de revenir dans une des feuilles de mon fichier de lancement sans fermer mon fichier temporaire car il m'est encore utile pour d'autres comparaisons ou contrôles.
J'ai essayé de faire dans le style :
Code = Code & "Windows("Lancement.xls").activate" & vbCrLf
Code = Code & "Sheet("Gestion").Select" & vbCrLf

et VBA m'a rit au nez, peut être toi aussi
Merci de te consacrer un peu de temps à mon problème
Cordialement et bonne soirée
Patrick.
 
M

michel

Guest
bonsoir Patrick

tu as parfaitement compris le principe de fonctionnement
de petites adaptations doivent etre apportées lorsqu'il y a des guillemets dans le code à créer ( comme tu pourras le voir dans l'adaptation ci dessous)


Sub CreationBoutonETMacro()
Dim Obj As OLEObject
Dim Code As String, NextLine As String

Workbooks.Add 'creation nouveau classeur

Set Obj = ActiveSheet.OLEObjects.Add("Forms.CommandButton.1", _
Left:=10, Top:=10, Height:=20, Width:=100) 'ajout bouton dans nouveau classeur

Obj.Object.Caption = "Fermer classeur"
Obj.Object.BackColor = RGB(255, 255, 0) 'couleur bouton

Code = "Sub CommandButton1_Click()" & vbCrLf 'creation de la procedure associée au bouton
Code = Code & "WorkBooks(""Lancement.xls"").activate" & vbCrLf
Code = Code & "Sheets(""Gestion"").Select" & vbCrLf
Code = Code & "End Sub"

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
NextLine = .CountOfLines + 1
.InsertLines NextLine, Code
End With

End Sub


bonne soiree
MichelXld
 
P

Patrick.

Guest
Bonjour Michel, c'est exactement ce que je voulais obtenir.
Je te remercie de ton aide.
Je n'aurais pas penser à mettre des ""

Il ne me reste plus qu'un point pour finir mon programme, c'est l'ouverture d'un fichier .xls sur intranet (c'est l'objet d'une autre demande que j'ai faite sur le Forum).

Bonne soirée et merci pour tout
Patrick
 
P

Patrick.

Guest
Bonsoir Michel, une dernière question sur cette macro.
Cela fonctionne parfaitement lorsque je pars d'une création de classeur par
WorkBooks.Add mais lorsque je pars d'un classeur existant, que j'active le classeur et sélectionne la feuille par :
WorkBooks("Fichier x.xls").activate
Sheets("Feuille essai").Select

Quand j'arrive à la ligne :
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule

de la macro, j'ai un message d'erreur d'exécution "9"
L'indice n'appartient pas à la sélection

As-tu une idée sur le problème
Merci de trouver un peu de temps pour m'aider.
Patrick
 
P

Patrick.

Guest
Bonsoir, mon problème semble venir du nom de la feuille active.

Quand dans ma sélection de feuille, je mets Sheets("Feuil1").Select et que je n'ai pas renommé la feuille, la macro fonctionne.

Si maintenant je renomme ma feuille 1 comme Feuil 1 (ajout d'espace) et que je la sélectionne par : Sheets ("Feuil 1 ").Select j'ai une erreur d'exécution dans la ligne
With ActiveWorkBook.VBProjet.VBComponents(ActiveSheet.Name).CodeModule

Pour moi, dans le deuxième cas il ne retrouve pas la feuille.
Quand je vais dans l'explorateur de projet, dans les différentes feuilles des projets, je trouve par exemple : Feuil1 (Feuil 1) et quant je clique sur la Feuil1,
les propriétés de la Feuil1 s'affichent. En haut, je trouve (Name) : Feuil1 et plus bas Name : Feuil 1. Pourquoi 2 "Name" ?
Je pense que mon problème vient de là.
Quel nom prend "ActiveSheet.Name" ?
Je concède que mon explication est assez confuse.
Merci de m'aider à débrouiller ce méli-mélo
Bonsoir
Patrick
 
M

michel

Guest
bonjour Patrick

ActiveSheet.Name correspond au nom de l'onglet actif dans la feuille Excel

par contre les XXXXXXX ci-dessous correspondent au nom de la feuille ( codeName ) dans l'editeur de macros
With ActiveWorkbook.VBProject.VBComponents(XXXXXXX).CodeModule

par défaut lors de la creation d'un nouveau classeur les 2 données sont identiques . si le nom de l'onglet et le nom de la feuille dans VBE sont differents tu ne peux donc plus utiliser la ligne
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule


tu peux tester cette modification

Workbooks("Fichier x.xls").Activate
Sheets("Feuille essai").Select

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
'...etc...


bonne journée
MichelXld
 
P

Patrick.

Guest
Bonjour Michel et merci pour ta réponse qui corrige parfaitement mon problème.
Juste une question concernant VBA. Aurais-tu un livre à conseiller à quelqu'un qui débute dans la programmation dans ce language.
J'ai un livre mais il ne parle jamais de VBCompenents, de CodeModule, de Name et de CodeName pour une feuille, ni d'exemple comme tu m'as généreusement fourni.
L'aide dans le logiciel n'est pas toujours compréhensible ou il manque quelque chose pour pouvoir comprendre.
Je te souhaite une bonne soirée et je te remercie encore pour ton aide et tes explications.
Patrick
 
M

michel

Guest
bonsoir Patrick


je ne connais pas de livres , mais tu peux utiliser la base de connaissances du forum Excel Downloads:
en utilisant les mots clés appropriés pour tes recherches , les 4 liens ci-dessous te permettont d'obtenir de nombreux exemples sur les macros , issus du forum XLD

https://www.excel-downloads.com/search/

Lien supprimé

Lien supprimé

Lien supprimé


tu peux aussi visiter ces pages ( il faut relancer une 2eme fois les liens , si un message d'erreur s'affiche )

Lien supprimé

Lien supprimé

https://www.excel-downloads.com/threads/ref-wiki-1-de-michelxld-generalites-excel.92356/


il y a aussi une zone de téléchargement par themes , avec de nombreux exemples prêt à l'emploi

Lien supprimé


bone soirée
MichelXld
 

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 336
Membres
111 104
dernier inscrit
JEMADA