Comment générer une nouvelle macro par VBA


Dans certains cas, il peut être utile de demander à une macro de générer une nouvelle macro (voir l'exemple "mise à jour de page Web par VBA").

Il suffit d'ajouter un module à la collection VBComponents du classeur concerné :
ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) va ajouter un nouveau module dans le classeur actif.
Si la commande ne fonctionne pas, ajoutez une référence à "Microsoft Visual Basic for Applications Extensibility" (dans VBA, Outils / Références...).
Pour inscrire le texte de la nouvelle macro, il suffit d'utiliser CodeModule.InsertLines.
Sub création_de_nouvelle_macro()
'créer un nouveau classeur
Set nouv = Workbooks.Add
'ajouter un module dans le nouveau classeur
Set Module = nouv.VBProject.VBComponents.Add(vbext_ct_StdModule)
Module.Name = "zaza"
'inscrire les lignes de commande dans le nouveau module
'la nouvelle macro ouvre rien, inscrit bonjour, ferme en enregistrant
Module.CodeModule.InsertLines 1, "sub toto()"
Module.CodeModule.InsertLines 2, "Workbooks.Open " & Chr(34) & "c:\rien.xls" & Chr(34)
Module.CodeModule.InsertLines 3, "cells(1)= " & Chr(34) & "bonjour" & Chr(34)
Module.CodeModule.InsertLines 4, "activeworkbook.close(true)"
Module.CodeModule.InsertLines 5, "end sub"
End Sub
La macro crée un nouveau fichier par Workbooks.Add, ajoute un module dans ce nouveau classeur par Set Module = nouv.VBProject.VBComponents.Add(vbext_ct_StdModule), puis inscrit les lignes de la nouvelle macro par Module.CodeModule.InsertLines 1, "sub toto()"...
Noter l'utilisation de CHR(34) pour inscrire un guillemet ( " ).

La nouvelle macro : Sub toto()
Workbooks.Open "c:\rien.xls"
Cells(1) = "bonjour"
ActiveWorkbook.Close (True)
End Sub