VBA- Insérer à l'aide d'une macro du code dans un autre classeur
2 réponses
Informatique_LIDV
Bonjour,
Est-il possible à partir d'une macro existante d'un classeur 1 d'insérer du
code dans ThisWorkbook et dans une feuille module d'un classeur 2 qui vient
d'être créé.
Si cela est possible, une solution me serait d'un grand secours et j'espère
que cela est possible.
"Informatique_LIDV" a écrit dans le message de news:
Bonjour,
Est-il possible à partir d'une macro existante d'un classeur 1 d'insérer du
code dans ThisWorkbook et dans une feuille module d'un classeur 2 qui vient
d'être créé.
Si cela est possible, une solution me serait d'un grand secours et j'espère
que cela est possible.
Merci par avance pour vos réponses.
Julien
anonymousA
bonjour,
des codes tout faits sont disponibles sur le site de Frédéric Sigonneau (sous la rubrique VBE.zip ) et Excelabo. Je t'invite à y aller. PAr ailleurs, je te communique ci-dessous un exemple de destruction de code, de construction de code avec une petite variante particulière interessante: la destruction de code du programme lui-même lors de l'ouverture du fichier et la reconstruction d'un workbook_open apr le programme lui-même. Au cas où ! Ah, j'oubliais, il te faut mettre une référence dans Outils/Références de VBE à la bibilothèque Microsoft Visual Basic Extensibility 3.5.
'les 2 procédures isn et workbook_open sont indissociables, la sub isn devant être placée 'impérativement dans un module standard
'Private Sub Workbook_Open() ' 'Dim vb As VBComponent ' ''on détruit toutes les macros contenues dans le présent fichier. même la sub workbook_open ''qui lance la destruction sera éffacée. Cependant, comme le compilateur a monté en mémoire ''les instructions, cette macro sera exécutée jusqu'au bout permettant donc l'appel à la sub isn ''qui reconstruira un workbook_open ' 'For Each vb In ThisWorkbook.VBProject.VBComponents ' If vb.Name <> "Module2" Then 'Module2 est le nom du module dans lequel se trouve la sub isn ' With vb.CodeModule ' .DeleteLines 1, .CountOfLines ' End With ' End If 'Next ' ''on est contraint de passer par une sub dans un module standard pour déclencher l'insertion des lignes ''que ce soit par insertlines ou par addfromstring. Cette insertion de lignes ''est evidemment necessaire pour recréer un workbook_open. Si on laisse les instructions ''insertlines ou par addfromstring dans le workbook_open, il y a déclenchement de la détection ''de virus et effacement immédiat de la sub workbook_open à l'enregistrement du fichier ' 'isn 'on fait appel à la sub de reconstruction d'un workbook_open ' 'With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule ' .DeleteLines 1, .CountOfLines 'End With ' 'Application.VBE.MainWindow.Visible = False ' 'End Sub
Sub isn()
Dim cd As CodeModule
'ici on déclare un objet de type codemodule sur le VBComponents(1) qui est toujours 'le thisworkbook car celui-ci a l'indice 1 quelque soit son codename
Set cd = ThisWorkbook.VBProject.VBComponents(1).CodeModule
'on crée la procédure evenementielle workbook_open
With cd .CreateEventProc "Open", "Workbook"
'on repère la ligne du début de la la macro workbook_open LiDeb = .ProcBodyLine("Workbook_Open", 0)
'on prépare le texte de la macro workbook_open s = s & "If Range(""A1"").Value@ Then" & vbLf s = s & "Msgbox ""40 an A1 !""" & vbLf s = s & "End If" 'on insére le texte préparé dans la macro workbook_open .InsertLines LiDeb + 1, s
End With
End Sub
Bonjour,
Est-il possible à partir d'une macro existante d'un classeur 1 d'insérer du code dans ThisWorkbook et dans une feuille module d'un classeur 2 qui vient d'être créé.
Si cela est possible, une solution me serait d'un grand secours et j'espère que cela est possible.
Merci par avance pour vos réponses.
Julien
bonjour,
des codes tout faits sont disponibles sur le site de Frédéric Sigonneau
(sous la rubrique VBE.zip ) et Excelabo. Je t'invite à y aller.
PAr ailleurs, je te communique ci-dessous un exemple de destruction de
code, de construction de code avec une petite variante particulière
interessante: la destruction de code du programme lui-même lors de
l'ouverture du fichier et la reconstruction d'un workbook_open apr le
programme lui-même. Au cas où !
Ah, j'oubliais, il te faut mettre une référence dans Outils/Références de
VBE à la bibilothèque Microsoft Visual Basic Extensibility 3.5.
'les 2 procédures isn et workbook_open sont indissociables, la sub isn
devant être placée
'impérativement dans un module standard
'Private Sub Workbook_Open()
'
'Dim vb As VBComponent
'
''on détruit toutes les macros contenues dans le présent fichier. même la
sub workbook_open
''qui lance la destruction sera éffacée. Cependant, comme le compilateur a
monté en mémoire
''les instructions, cette macro sera exécutée jusqu'au bout permettant donc
l'appel à la sub isn
''qui reconstruira un workbook_open
'
'For Each vb In ThisWorkbook.VBProject.VBComponents
' If vb.Name <> "Module2" Then 'Module2 est le nom du module dans lequel
se trouve la sub isn
' With vb.CodeModule
' .DeleteLines 1, .CountOfLines
' End With
' End If
'Next
'
''on est contraint de passer par une sub dans un module standard pour
déclencher l'insertion des lignes
''que ce soit par insertlines ou par addfromstring. Cette insertion de lignes
''est evidemment necessaire pour recréer un workbook_open. Si on laisse les
instructions
''insertlines ou par addfromstring dans le workbook_open, il y a
déclenchement de la détection
''de virus et effacement immédiat de la sub workbook_open à l'enregistrement
du fichier
'
'isn 'on fait appel à la sub de reconstruction d'un workbook_open
'
'With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
' .DeleteLines 1, .CountOfLines
'End With
'
'Application.VBE.MainWindow.Visible = False
'
'End Sub
Sub isn()
Dim cd As CodeModule
'ici on déclare un objet de type codemodule sur le VBComponents(1) qui est
toujours
'le thisworkbook car celui-ci a l'indice 1 quelque soit son codename
Set cd = ThisWorkbook.VBProject.VBComponents(1).CodeModule
'on crée la procédure evenementielle workbook_open
With cd
.CreateEventProc "Open", "Workbook"
'on repère la ligne du début de la la macro workbook_open
LiDeb = .ProcBodyLine("Workbook_Open", 0)
'on prépare le texte de la macro workbook_open
s = s & "If Range(""A1"").Value@ Then" & vbLf
s = s & "Msgbox ""40 an A1 !""" & vbLf
s = s & "End If"
'on insére le texte préparé dans la macro workbook_open
.InsertLines LiDeb + 1, s
End With
End Sub
Bonjour,
Est-il possible à partir d'une macro existante d'un classeur 1 d'insérer du
code dans ThisWorkbook et dans une feuille module d'un classeur 2 qui vient
d'être créé.
Si cela est possible, une solution me serait d'un grand secours et j'espère
que cela est possible.
des codes tout faits sont disponibles sur le site de Frédéric Sigonneau (sous la rubrique VBE.zip ) et Excelabo. Je t'invite à y aller. PAr ailleurs, je te communique ci-dessous un exemple de destruction de code, de construction de code avec une petite variante particulière interessante: la destruction de code du programme lui-même lors de l'ouverture du fichier et la reconstruction d'un workbook_open apr le programme lui-même. Au cas où ! Ah, j'oubliais, il te faut mettre une référence dans Outils/Références de VBE à la bibilothèque Microsoft Visual Basic Extensibility 3.5.
'les 2 procédures isn et workbook_open sont indissociables, la sub isn devant être placée 'impérativement dans un module standard
'Private Sub Workbook_Open() ' 'Dim vb As VBComponent ' ''on détruit toutes les macros contenues dans le présent fichier. même la sub workbook_open ''qui lance la destruction sera éffacée. Cependant, comme le compilateur a monté en mémoire ''les instructions, cette macro sera exécutée jusqu'au bout permettant donc l'appel à la sub isn ''qui reconstruira un workbook_open ' 'For Each vb In ThisWorkbook.VBProject.VBComponents ' If vb.Name <> "Module2" Then 'Module2 est le nom du module dans lequel se trouve la sub isn ' With vb.CodeModule ' .DeleteLines 1, .CountOfLines ' End With ' End If 'Next ' ''on est contraint de passer par une sub dans un module standard pour déclencher l'insertion des lignes ''que ce soit par insertlines ou par addfromstring. Cette insertion de lignes ''est evidemment necessaire pour recréer un workbook_open. Si on laisse les instructions ''insertlines ou par addfromstring dans le workbook_open, il y a déclenchement de la détection ''de virus et effacement immédiat de la sub workbook_open à l'enregistrement du fichier ' 'isn 'on fait appel à la sub de reconstruction d'un workbook_open ' 'With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule ' .DeleteLines 1, .CountOfLines 'End With ' 'Application.VBE.MainWindow.Visible = False ' 'End Sub
Sub isn()
Dim cd As CodeModule
'ici on déclare un objet de type codemodule sur le VBComponents(1) qui est toujours 'le thisworkbook car celui-ci a l'indice 1 quelque soit son codename
Set cd = ThisWorkbook.VBProject.VBComponents(1).CodeModule
'on crée la procédure evenementielle workbook_open
With cd .CreateEventProc "Open", "Workbook"
'on repère la ligne du début de la la macro workbook_open LiDeb = .ProcBodyLine("Workbook_Open", 0)
'on prépare le texte de la macro workbook_open s = s & "If Range(""A1"").Value@ Then" & vbLf s = s & "Msgbox ""40 an A1 !""" & vbLf s = s & "End If" 'on insére le texte préparé dans la macro workbook_open .InsertLines LiDeb + 1, s
End With
End Sub
Bonjour,
Est-il possible à partir d'une macro existante d'un classeur 1 d'insérer du code dans ThisWorkbook et dans une feuille module d'un classeur 2 qui vient d'être créé.
Si cela est possible, une solution me serait d'un grand secours et j'espère que cela est possible.