OVH Cloud OVH Cloud

Macro pour créer macro

5 réponses
Avatar
A QUEMENER
Bonjour à tous,

Je souhaite à partir d'une macro d'un fichier excel construire un nouveau
classeur de 3 feuilles en y intégrant du code qui lancera l'impression de
la feuille active après un double click.
Quelqu'un peut il m' aider
D'avance merci
cordialement
andré

5 réponses

Avatar
Hubert
salut ,

J'ai plein d'archives venant de MPFE à ce propos ...
dont ce qui ce trouve à la fin du msg...
Pour avoir utilisé ces méthodes il y a qq temps, je sais qu'il peut y avoir
un pb de version sur
la bibliothèque Microsoft Visual Basic For Applications Extensibility (
VBIDE)
qui est indispensable pour ce type de manip
et dont il faut éventuellement forcer le chargement avant ...
( excel97 et excel2000 n'ont pas la même version et donc cela nécessite des
tests préalables concernants
les références présentes ...
Je ne me souviens plus de la méthode pour traiter proprement le pb...

Cela dépend de ta situation , ( version, ..., ...)
situation dont on ne sait pas grand chose :o)

Je ne doute pas que des "balèzes" ,
qui pullulent ici,
ne t'aident dès que l'on saura exactement ce qui te convient.

Bon courage et ... patience

HubertB
---------------quelques procédures en vrac----------
--------------- rien que du vieux---------------------
----------------rien n'est de moi !--------------------

'créer un module dans un classeur
'(Stéphane Royer, mpfe)

Sub test()
'crée un module standard nommé "TestModule" dans le classeur actif
CreateNewModule ActiveWorkbook, 1, "TestModule"
End Sub

Sub CreateNewModule _
(ByVal wb As Workbook, _
ByVal ModuleTypeIndex As Integer, _
ByVal NewModuleName As String)
'nécessite que la bibliothèque
'Microsoft Visual Basic For Applications Extensibility 5.x
'soit cochée
' creates a new module of ModuleTypeIndex
'(1=standard module, 2=class module, 3=userform) in wb
' renames the new module to NewModuleName (if possible)

Dim VBC As VBComponent, mti As Integer

Set VBC = Nothing
mti = 0
Select Case ModuleTypeIndex
Case 1: mti = vbext_ct_StdModule ' standard module
Case 2: mti = vbext_ct_ClassModule ' class module
Case 3: mti = vbext_ct_MSForm ' userform
End Select
If mti <> 0 Then
On Error Resume Next
Set VBC = wb.VBProject.VBComponents.Add(mti)
If Not VBC Is Nothing Then
If NewModuleName <> "" Then
VBC.Name = NewModuleName
End If
End If
On Error GoTo 0
Set VBC = Nothing
End If
End Sub
-------------------------------

'créer un module de code
'(un module de code "se travaille" comme un fichier texte)

Sub CreateBasFile()
'Chip Pearson, mpep
Dim FNum As Integer
Dim FName As String

FName = "D:modTestModule.bas"
If Dir(FName) <> "" Then Kill FName
FNum = FreeFile
Open FName For Output Access Write As #FNum
'sans cette ligne, l'importation attribue un nom par défaut
'au module (comme Module1), quel que soit le nom et l'extension
'du fichier source
Print #FNum, "Attribute VB_Name = ""modTestModule"""
Print #FNum, ""
Print #FNum, "Option Explicit"
Print #FNum, ""
Print #FNum, "Sub TestMacro()"
Print #FNum, " MsgBox ""Hello World"""
Print #FNum, "End Sub"
Close FNum

ThisWorkbook.VBProject.VBComponents.Import Filename:=FName
Kill FName

End Sub
--------------------------------------------------
'créer un classeur avec une feuille de calcul
'et ajouter du code dans le module de cette feuille de calcul

Sub AddSheet()
'Patrick Molloy, mpep
Dim wb As Workbook
Dim ws As Worksheet

' add a new book with a single sheet
Set wb = Workbooks.Add(xlWBATWorksheet)
Set ws = wb.ActiveSheet
ws.Name = "MyNewSheet"

'create a code module
' Open "MyModule" For Output As #1
' Print #1, "Private Sub Worksheet_BeforeDoubleClick" _
' & "(ByVal Target As Range, Cancel As Boolean)"
' Print #1, " MsgBox ActiveSheet.Name,,Activeworkbook.name"
' Print #1, "End Sub"
' Close #1

'autre méthode (fs) (évite le fichier temporaire "MyModule")
Code = "Private Sub Worksheet_BeforeDoubleClick" _
& "(ByVal Target As Range, Cancel As Boolean)" & vbLf
Code = Code & " MsgBox ActiveSheet.Name,,Activeworkbook.name" & vbLf
Code = Code & "End Sub"

'load the code into the new wb
' wb.VBProject.VBComponents.Item(2).CodeModule.AddFromFile "MyModule"
wb.VBProject.VBComponents.Item(2).CodeModule.AddFromString Code

Set ws = Nothing
Set wb = Nothing

End Sub
------------------------------------
'copier le code d'un module dans un autre d'un autre classeur

'ajouter le code d'une module dans le module d'une feuille
'd'un nouveau classeur
Sub AddCode()
'fs
Dim S As String, Wbk As Workbook

With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With

Set Wbk = Workbooks.Add
With Wbk.VBProject.VBComponents("Feuil1").CodeModule
.AddFromString S
End With

End Sub 'fs

'recopier le code d'un module dans un autre classeur
'(en ajoutant d'abord un module dans cet autre classeur)
Sub CopieCodeModule()
'fs
Dim S As String, Wbk As Workbook

With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With

Set Wbk = Workbooks("Classeur2.xls") 'à adapter
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With

End Sub 'fs

'mettre à jour le code d'un module existant dans un autre classeur
Sub MAJCodeModule()
Dim S As String, Wbk As Workbook

'module à copier
With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With

Set Wbk = Workbooks("Perso.xls")
'détruire le module à mettre à jour s'il existe
On Error Resume Next
With Wbk.VBProject.VBComponents
.Remove .Item("MonModule")
End With
On Error GoTo 0
'ajouter un nouveau module et copier le code
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With

End Sub 'fs
----------------------------------
Avatar
JièL Goubert
Bonjoir(c) A QUEMENER

pourquoi ne pas mettre ta macro d'impression dans un modèle de classeur
(.XLT) ? une fois se modèle créé, tu créé une macro qui créé un classeur
basé sur le modèle en question... non ?

--
JièL / Jean-Louis GOUBERT
La FAQ Outlook est la : http://faq.outlook.free.fr/
***********************************************************************
Enquète sur les communautés techniques en France
http://www.sphinxonline.net/sphinxbrasil/quest-cerag/questionnaire.htm
***********************************************************************

Le 19/11/2004 23:35 vous avez écrit ceci :
Bonjour à tous,

Je souhaite à partir d'une macro d'un fichier excel construire un nouveau
classeur de 3 feuilles en y intégrant du code qui lancera l'impression de
la feuille active après un double click.
Quelqu'un peut il m' aider
D'avance merci
cordialement
andré


Avatar
anonymousA
A mon sens la solution préconisée par Jiel Goubert est de loin la plus simple
donc la moins contraignante. En effet au delà des précautions prises par
Hubert sur la version de la DLL Extensibility, je n'ai pas vu dans le code
transmis une indication sur la création de la macor evenementielle Double
Click que tu devrais construire pour répondre à ta demande.
Bonne chance


Bonjour à tous,

Je souhaite à partir d'une macro d'un fichier excel construire un nouveau
classeur de 3 feuilles en y intégrant du code qui lancera l'impression de
la feuille active après un double click.
Quelqu'un peut il m' aider
D'avance merci
cordialement
andré







Avatar
A QUEMENER
Merci Hubert de ta réponse.

Entre-temps j'ai trouvé la réponse sur http://www.cpearson.com/excel/vbe.htm
très cordialement
andré


"Hubert" a écrit dans le message de news:


salut ,

J'ai plein d'archives venant de MPFE à ce propos ...
dont ce qui ce trouve à la fin du msg...
Pour avoir utilisé ces méthodes il y a qq temps, je sais qu'il peut y
avoir un pb de version sur
la bibliothèque Microsoft Visual Basic For Applications Extensibility (
VBIDE)
qui est indispensable pour ce type de manip
et dont il faut éventuellement forcer le chargement avant ...
( excel97 et excel2000 n'ont pas la même version et donc cela nécessite
des tests préalables concernants
les références présentes ...
Je ne me souviens plus de la méthode pour traiter proprement le pb...

Cela dépend de ta situation , ( version, ..., ...)
situation dont on ne sait pas grand chose :o)

Je ne doute pas que des "balèzes" ,
qui pullulent ici,
ne t'aident dès que l'on saura exactement ce qui te convient.

Bon courage et ... patience

HubertB
---------------quelques procédures en vrac----------
--------------- rien que du vieux---------------------
----------------rien n'est de moi !--------------------

'créer un module dans un classeur
'(Stéphane Royer, mpfe)

Sub test()
'crée un module standard nommé "TestModule" dans le classeur actif
CreateNewModule ActiveWorkbook, 1, "TestModule"
End Sub

Sub CreateNewModule _
(ByVal wb As Workbook, _
ByVal ModuleTypeIndex As Integer, _
ByVal NewModuleName As String)
'nécessite que la bibliothèque
'Microsoft Visual Basic For Applications Extensibility 5.x
'soit cochée
' creates a new module of ModuleTypeIndex
'(1=standard module, 2=class module, 3=userform) in wb
' renames the new module to NewModuleName (if possible)

Dim VBC As VBComponent, mti As Integer

Set VBC = Nothing
mti = 0
Select Case ModuleTypeIndex
Case 1: mti = vbext_ct_StdModule ' standard module
Case 2: mti = vbext_ct_ClassModule ' class module
Case 3: mti = vbext_ct_MSForm ' userform
End Select
If mti <> 0 Then
On Error Resume Next
Set VBC = wb.VBProject.VBComponents.Add(mti)
If Not VBC Is Nothing Then
If NewModuleName <> "" Then
VBC.Name = NewModuleName
End If
End If
On Error GoTo 0
Set VBC = Nothing
End If
End Sub
-------------------------------

'créer un module de code
'(un module de code "se travaille" comme un fichier texte)

Sub CreateBasFile()
'Chip Pearson, mpep
Dim FNum As Integer
Dim FName As String

FName = "D:modTestModule.bas"
If Dir(FName) <> "" Then Kill FName
FNum = FreeFile
Open FName For Output Access Write As #FNum
'sans cette ligne, l'importation attribue un nom par défaut
'au module (comme Module1), quel que soit le nom et l'extension
'du fichier source
Print #FNum, "Attribute VB_Name = ""modTestModule"""
Print #FNum, ""
Print #FNum, "Option Explicit"
Print #FNum, ""
Print #FNum, "Sub TestMacro()"
Print #FNum, " MsgBox ""Hello World"""
Print #FNum, "End Sub"
Close FNum

ThisWorkbook.VBProject.VBComponents.Import Filename:=FName
Kill FName

End Sub
--------------------------------------------------
'créer un classeur avec une feuille de calcul
'et ajouter du code dans le module de cette feuille de calcul

Sub AddSheet()
'Patrick Molloy, mpep
Dim wb As Workbook
Dim ws As Worksheet

' add a new book with a single sheet
Set wb = Workbooks.Add(xlWBATWorksheet)
Set ws = wb.ActiveSheet
ws.Name = "MyNewSheet"

'create a code module
' Open "MyModule" For Output As #1
' Print #1, "Private Sub Worksheet_BeforeDoubleClick" _
' & "(ByVal Target As Range, Cancel As Boolean)"
' Print #1, " MsgBox ActiveSheet.Name,,Activeworkbook.name"
' Print #1, "End Sub"
' Close #1

'autre méthode (fs) (évite le fichier temporaire "MyModule")
Code = "Private Sub Worksheet_BeforeDoubleClick" _
& "(ByVal Target As Range, Cancel As Boolean)" & vbLf
Code = Code & " MsgBox ActiveSheet.Name,,Activeworkbook.name" & vbLf
Code = Code & "End Sub"

'load the code into the new wb
' wb.VBProject.VBComponents.Item(2).CodeModule.AddFromFile "MyModule"
wb.VBProject.VBComponents.Item(2).CodeModule.AddFromString Code

Set ws = Nothing
Set wb = Nothing

End Sub
------------------------------------
'copier le code d'un module dans un autre d'un autre classeur

'ajouter le code d'une module dans le module d'une feuille
'd'un nouveau classeur
Sub AddCode()
'fs
Dim S As String, Wbk As Workbook

With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With

Set Wbk = Workbooks.Add
With Wbk.VBProject.VBComponents("Feuil1").CodeModule
.AddFromString S
End With

End Sub 'fs

'recopier le code d'un module dans un autre classeur
'(en ajoutant d'abord un module dans cet autre classeur)
Sub CopieCodeModule()
'fs
Dim S As String, Wbk As Workbook

With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With

Set Wbk = Workbooks("Classeur2.xls") 'à adapter
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With

End Sub 'fs

'mettre à jour le code d'un module existant dans un autre classeur
Sub MAJCodeModule()
Dim S As String, Wbk As Workbook

'module à copier
With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With

Set Wbk = Workbooks("Perso.xls")
'détruire le module à mettre à jour s'il existe
On Error Resume Next
With Wbk.VBProject.VBComponents
.Remove .Item("MonModule")
End With
On Error GoTo 0
'ajouter un nouveau module et copier le code
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With

End Sub 'fs
----------------------------------



Avatar
A QUEMENER
Merci à tous pour vos réponses,
Solution sur http://www.cpearson.com/excel/vbe.htm
très cordialement
andré

"A QUEMENER" a écrit dans le message de news:
cnlseu$9dg$
Bonjour à tous,

Je souhaite à partir d'une macro d'un fichier excel construire un nouveau
classeur de 3 feuilles en y intégrant du code qui lancera l'impression de
la feuille active après un double click.
Quelqu'un peut il m' aider
D'avance merci
cordialement
andré