OVH Cloud OVH Cloud

export/import

30 réponses
Avatar
sabatier
bonjour,
je me livre aux douces joies de l'importationnement de modules après
exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un .bas et no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans l'autre
classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le ThisWorkbook, le
seul, le vrai, l'authentique, qui va recevoir la procédure importer...du
coup, c'est moi qui fais une drôle de tête de clone car je me pose la
question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce phénomène...un
grand merci par avance
jps

10 réponses

1 2 3
Avatar
sabatier
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez bien
vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au passage,
doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans un
classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas sur 10
millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens inné
de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces procs...jusqu'au
moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né celui
qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz, fût-il
l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes boutons,
je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse la
restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les modules
dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part que
la proc donne ce nom aux modules copiés dont on peut comprendre qu'il ne
soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais j'ai
confiance dans le québec d'où jaillira certainement une nouvelle fois la
lumière...quand le jour aura baigné de la sienne la belle province ('tain,
pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand même)
jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet d'importer
le

code de tous les modules ainsi que celui de ThisWorkbook et des feuilles
choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes documents")
SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in message
news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui avais
posé la question : je n'aurais jamais du...où avais-je encore la tête à
ce


moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
et


le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
texte

sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour de la
semaine ! ;-)


CLS = Extension de fichier signifiant : Code Language Specification
Cette extension de fichier est apparu avec la version 4 de Visual
basic



(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent dans le
cas


d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour formulaire).
Dans


ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite ...avec
tout


son contenu ! )

Dans excel, un module de classe sert à définir les propriétés, les
méthodes et les événements d'une classe spécifique

d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel objet
et



une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le nom
du



module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de classe ne
crée pas de "nouveaux boutons de commande" mais une

nouvelle classe d'objet ayant ses propres spécifications contenu dans
son


module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New" dans
le



code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier .cls)
par



les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objet


physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric Sigonneau
a



créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj = ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2, True)
Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > >

Et si tu veux récupérer le code du fichier créer et l'insérer dans un
module particulier, tu peux utiliser ceci :


'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre guillemets

"c:excelFeuil1.txt" est le chemin et le nom du fichier créé par la
procédure de Frédéric.



Si tu as procédé manuellement à l'exportation, l'extension de ton
fichier


est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de récupération, le
module de classe ("l'objet physique") de destination

devra être déjà présent et il devra aussi avoir même nom que le module
de


classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellement

ce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ces



lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code supplémentaire.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit dans le
message de

news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules après
exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un .bas et
no


problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans
l'autre


classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me pose la
question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps












Avatar
Michel Pierron
Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans lequel se
trouve les procédures de copie en CopyCode sinon, ce module sera effacé au
même titre que tout le reste. La référence à "Microsoft Visual basic for
applications Extensibility 5.3" n'est pas nécessaire si tu modifies ainsi
les procédures:
Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , Application.DefaultFilePath)
If SourceP = "" Then Exit Sub
1: SourceF = InputBox("Nom du fichier source", , "Classeur1.xls")
If SourceF = "" Then Exit Sub
If Dir(SourceP & "" & SourceF) = "" Then
MsgBox "Fichier " & SourceF & " non trouvé !", 64
GoTo 1
End If
On Error Resume Next
Workbooks(SourceF).Activate
If Err Then Workbooks.Open SourceP & "" & SourceF
On Error GoTo 0
If ActiveWorkbook.VBProject.Protection Then
MsgBox "Le projet de " & ActiveWorkbook.Name & " est protégé !", 64
Exit Sub
End If
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP
End Sub

Sub CopyModules(TargetF, SourceF, SourceP)
DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
With Workbooks(SourceF)
For i = 1 To .Worksheets.Count
CopySheetCode SourceF, TargetF, .Worksheets(i).CodeName
Next i
End With
End Sub

Private Sub DeleteAllVBA()
Dim VBComp As Object
With ActiveWorkbook.VBProject
For Each VBComp In .VBComponents
' Skip module containing copycode
If Not VBComp.Name = "CopyCode" Then
Select Case VBComp.Type
Case 1 To 3: .VBComponents.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
End If
Next VBComp
End With
End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As Object
With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then Kill FName
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> 100 Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With
End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub

MP

"sabatier" a écrit dans le message
de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au passage,
doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans un
classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas sur 10
millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces procs...jusqu'au
moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes boutons,
je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse la
restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part que
la proc donne ce nom aux modules copiés dont on peut comprendre qu'il ne
soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais j'ai
confiance dans le québec d'où jaillira certainement une nouvelle fois la
lumière...quand le jour aura baigné de la sienne la belle province ('tain,
pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand même)
jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des feuilles
choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes documents")
SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in message
news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la tête
à



ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
et


le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
texte

sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour de
la




semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language Specification
Cette extension de fichier est apparu avec la version 4 de Visual
basic



(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent dans
le




cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite ...avec
tout


son contenu ! )

Dans excel, un module de classe sert à définir les propriétés, les
méthodes et les événements d'une classe spécifique

d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel objet
et



une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le nom
du



module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de classe
ne




crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier .cls)
par



les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objet


physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2, True)
Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer dans
un




module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre guillemets

"c:excelFeuil1.txt" est le chemin et le nom du fichier créé par
la




procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de ton
fichier


est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de récupération,
le




module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellement

ce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ces



lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code supplémentaire.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit dans le
message de

news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules après
exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un .bas
et




no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans
l'autre


classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me pose
la




question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps
















Avatar
Michel Pierron
Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le fichier
après importation des modules car si l'on ferme Excel et qu'une instruction
astucieuse telle que:
ThisWorkbook.Saved = True ou ThisWorkbook.Close False se trouve dans la
procédure importé ThisWorkbook_BeforeClose, basta le boulot.
MP

"sabatier" a écrit dans le message
de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au passage,
doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans un
classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas sur 10
millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces procs...jusqu'au
moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes boutons,
je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse la
restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part que
la proc donne ce nom aux modules copiés dont on peut comprendre qu'il ne
soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais j'ai
confiance dans le québec d'où jaillira certainement une nouvelle fois la
lumière...quand le jour aura baigné de la sienne la belle province ('tain,
pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand même)
jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des feuilles
choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes documents")
SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in message
news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la tête
à



ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
et


le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
texte

sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour de
la




semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language Specification
Cette extension de fichier est apparu avec la version 4 de Visual
basic



(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent dans
le




cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite ...avec
tout


son contenu ! )

Dans excel, un module de classe sert à définir les propriétés, les
méthodes et les événements d'une classe spécifique

d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel objet
et



une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le nom
du



module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de classe
ne




crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier .cls)
par



les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objet


physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2, True)
Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer dans
un




module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre guillemets

"c:excelFeuil1.txt" est le chemin et le nom du fichier créé par
la




procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de ton
fichier


est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de récupération,
le




module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellement

ce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ces



lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code supplémentaire.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit dans le
message de

news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules après
exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un .bas
et




no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans
l'autre


classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me pose
la




question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps
















Avatar
jps
merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien trop
ardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier (si je
comprends bien) mais s'il y en a plusieurs à copier (importer?), ils auront
tous le même nom dans la nouvelle arborescence de VBE?
mais tu es d'accord avec moi que celui qui a le malheur de lancer cette proc
"kill" tous les modules existant dans son VBE ou non?
j'en frémis encore telle l'eau dans laquelle cuit la saucisse de moreteau
jps

"Michel Pierron" a écrit dans le message de
news:
Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans lequel
se

trouve les procédures de copie en CopyCode sinon, ce module sera effacé au
même titre que tout le reste. La référence à "Microsoft Visual basic for
applications Extensibility 5.3" n'est pas nécessaire si tu modifies ainsi
les procédures:
Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", ,
Application.DefaultFilePath)

If SourceP = "" Then Exit Sub
1: SourceF = InputBox("Nom du fichier source", , "Classeur1.xls")
If SourceF = "" Then Exit Sub
If Dir(SourceP & "" & SourceF) = "" Then
MsgBox "Fichier " & SourceF & " non trouvé !", 64
GoTo 1
End If
On Error Resume Next
Workbooks(SourceF).Activate
If Err Then Workbooks.Open SourceP & "" & SourceF
On Error GoTo 0
If ActiveWorkbook.VBProject.Protection Then
MsgBox "Le projet de " & ActiveWorkbook.Name & " est protégé !", 64
Exit Sub
End If
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP
End Sub

Sub CopyModules(TargetF, SourceF, SourceP)
DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
With Workbooks(SourceF)
For i = 1 To .Worksheets.Count
CopySheetCode SourceF, TargetF, .Worksheets(i).CodeName
Next i
End With
End Sub

Private Sub DeleteAllVBA()
Dim VBComp As Object
With ActiveWorkbook.VBProject
For Each VBComp In .VBComponents
' Skip module containing copycode
If Not VBComp.Name = "CopyCode" Then
Select Case VBComp.Type
Case 1 To 3: .VBComponents.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
End If
Next VBComp
End With
End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As Object
With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then Kill FName
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> 100 Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With
End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub

MP

"sabatier" a écrit dans le
message

de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au
passage,


doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans un
classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas sur
10


millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces
procs...jusqu'au


moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes
boutons,


je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse la
restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
que


la proc donne ce nom aux modules copiés dont on peut comprendre qu'il ne
soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais j'ai
confiance dans le québec d'où jaillira certainement une nouvelle fois la
lumière...quand le jour aura baigné de la sienne la belle province
('tain,


pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand
même)


jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des
feuilles



choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes
documents")



SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in message
news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la
tête




à
ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls




et
le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton




texte
sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour
de





la
semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language
Specification





Cette extension de fichier est apparu avec la version 4 de Visual
basic



(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent dans
le




cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite
...avec





tout
son contenu ! )

Dans excel, un module de classe sert à définir les propriétés, les
méthodes et les événements d'une classe spécifique

d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel
objet





et
une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le
nom





du
module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de
classe





ne
crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier
.cls)





par
les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objet


physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj > ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2, True)
Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer dans
un




module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre
guillemets






"c:excelFeuil1.txt" est le chemin et le nom du fichier créé par
la




procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de ton
fichier


est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de
récupération,





le
module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellement

ce qui est désiré... dans excel. De plus, il se permettra
d'ajouter





ces
lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code supplémentaire.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit dans
le





message de
news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
après





exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.bas





et
no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans
l'autre


classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me pose
la




question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps




















Avatar
jps
quand je te disais, michel, que ce CPearson ne doit pas avoir connu les 100
ans d'entente cordiale...un traître, oui, à la solde d'un ennemi qui
s'abrite derrière un Application.DisplayAlerts = False...
jps

"Michel Pierron" a écrit dans le message de
news:%
Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le fichier
après importation des modules car si l'on ferme Excel et qu'une
instruction

astucieuse telle que:
ThisWorkbook.Saved = True ou ThisWorkbook.Close False se trouve dans la
procédure importé ThisWorkbook_BeforeClose, basta le boulot.
MP

"sabatier" a écrit dans le
message

de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au
passage,


doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans un
classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas sur
10


millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces
procs...jusqu'au


moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes
boutons,


je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse la
restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
que


la proc donne ce nom aux modules copiés dont on peut comprendre qu'il ne
soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais j'ai
confiance dans le québec d'où jaillira certainement une nouvelle fois la
lumière...quand le jour aura baigné de la sienne la belle province
('tain,


pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand
même)


jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des
feuilles



choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes
documents")



SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in message
news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la
tête




à
ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls




et
le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton




texte
sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour
de





la
semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language
Specification





Cette extension de fichier est apparu avec la version 4 de Visual
basic



(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent dans
le




cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite
...avec





tout
son contenu ! )

Dans excel, un module de classe sert à définir les propriétés, les
méthodes et les événements d'une classe spécifique

d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel
objet





et
une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le
nom





du
module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de
classe





ne
crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier
.cls)





par
les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objet


physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj > ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2, True)
Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer dans
un




module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre
guillemets






"c:excelFeuil1.txt" est le chemin et le nom du fichier créé par
la




procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de ton
fichier


est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de
récupération,





le
module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellement

ce qui est désiré... dans excel. De plus, il se permettra
d'ajouter





ces
lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code supplémentaire.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit dans
le





message de
news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
après





exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.bas





et
no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans
l'autre


classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me pose
la




question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps




















Avatar
docm
Bonjour michdenis.


Bonsoir docm,

" Si je n'ai pas la berlue ..."
**** attention ça ne devrait pas tarder ... ;-)


Finalement, grâce à vos réponses, je tends à penser que je ne l'avais pas
après tout. ;)


Pour l'ami JPS qui a passé une partie de la nuit dans sa cave à arroser
les bons moments d'une réminiscence précoce, tu

aurais pu spécifier que ces procédures requièrent la bibliothèque suivante
:


"Microsoft Visual basic for applications Extensibility 5.3"


Mea culpa...jps.


Pour ce qui est du reste, je te laisse expliquer à JPS ce que font ces
procédures


Je pourrais peut-être le faire, mais il me faudrait plusieurs jours sinon
semaines... d'étude intensive sur le sujet afin de le comprendre d'abord
moi-même. Je préfère donc passer la main à ceux qui s'y connaissent,
toi-même par exemple.

....en espérant que JPS n'a pas trop la
gueule de bois ce matin !!! ;-))


Salutations!



Avatar
docm
Bonjour jps.

Il ne faut nommer "CopyCode" que le module contenant le code de cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.



"jps" wrote in message
news:#
merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien trop
ardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier (si
je

comprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auront

tous le même nom dans la nouvelle arborescence de VBE?
mais tu es d'accord avec moi que celui qui a le malheur de lancer cette
proc

"kill" tous les modules existant dans son VBE ou non?
j'en frémis encore telle l'eau dans laquelle cuit la saucisse de moreteau
jps

"Michel Pierron" a écrit dans le message de
news:
Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans lequel
se

trouve les procédures de copie en CopyCode sinon, ce module sera effacé
au


même titre que tout le reste. La référence à "Microsoft Visual basic for
applications Extensibility 5.3" n'est pas nécessaire si tu modifies
ainsi


les procédures:
Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", ,
Application.DefaultFilePath)

If SourceP = "" Then Exit Sub
1: SourceF = InputBox("Nom du fichier source", , "Classeur1.xls")
If SourceF = "" Then Exit Sub
If Dir(SourceP & "" & SourceF) = "" Then
MsgBox "Fichier " & SourceF & " non trouvé !", 64
GoTo 1
End If
On Error Resume Next
Workbooks(SourceF).Activate
If Err Then Workbooks.Open SourceP & "" & SourceF
On Error GoTo 0
If ActiveWorkbook.VBProject.Protection Then
MsgBox "Le projet de " & ActiveWorkbook.Name & " est protégé !", 64
Exit Sub
End If
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP
End Sub

Sub CopyModules(TargetF, SourceF, SourceP)
DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
With Workbooks(SourceF)
For i = 1 To .Worksheets.Count
CopySheetCode SourceF, TargetF, .Worksheets(i).CodeName
Next i
End With
End Sub

Private Sub DeleteAllVBA()
Dim VBComp As Object
With ActiveWorkbook.VBProject
For Each VBComp In .VBComponents
' Skip module containing copycode
If Not VBComp.Name = "CopyCode" Then
Select Case VBComp.Type
Case 1 To 3: .VBComponents.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
End If
Next VBComp
End With
End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As Object
With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then Kill FName
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> 100 Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With
End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub

MP

"sabatier" a écrit dans le
message

de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au
passage,


doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans
un



classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur



10
millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces
procs...jusqu'au


moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes
boutons,


je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse
la



restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
que


la proc donne ce nom aux modules copiés dont on peut comprendre qu'il
ne



soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'ai



confiance dans le québec d'où jaillira certainement une nouvelle fois
la



lumière...quand le jour aura baigné de la sienne la belle province
('tain,


pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand
même)


jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des
feuilles



choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes
documents")



SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in
message




news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la
tête




à
ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls




et
le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton




texte
sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour
de





la
semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language
Specification





Cette extension de fichier est apparu avec la version 4 de
Visual






basic
(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
dans






le
cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite
...avec





tout
son contenu ! )

Dans excel, un module de classe sert à définir les propriétés,
les






méthodes et les événements d'une classe spécifique
d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel
objet





et
une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le
nom





du
module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de
classe





ne
crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"





dans
le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier
.cls)





par
les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer
un






"objet
physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj > > ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2,
True)






Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer
dans






un
module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre
guillemets






"c:excelFeuil1.txt" est le chemin et le nom du fichier créé
par






la
procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de
ton






fichier
est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de
récupération,





le
module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de
classe






d'origine (code seulement) et ce n'est pas habituellement
ce qui est désiré... dans excel. De plus, il se permettra
d'ajouter





ces
lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code
supplémentaire.






VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit
dans






le
message de
news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
après





exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.bas





et
no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation
dans






l'autre
classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me
pose






la
question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps
























Avatar
docm
En fait, le code du fichier source sera copié dans le classeur actuel.
Donc si c'est un nouveau classeur, tu peux effacer l'appel à la procédure
"DeleteAllVBA". Cela devrait te rassurer. Inutile alors également de
renommer le module "CopyCode".


"jps" wrote in message
news:#
merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien trop
ardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier (si
je

comprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auront

tous le même nom dans la nouvelle arborescence de VBE?
mais tu es d'accord avec moi que celui qui a le malheur de lancer cette
proc

"kill" tous les modules existant dans son VBE ou non?
j'en frémis encore telle l'eau dans laquelle cuit la saucisse de moreteau
jps

"Michel Pierron" a écrit dans le message de
news:
Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans lequel
se

trouve les procédures de copie en CopyCode sinon, ce module sera effacé
au


même titre que tout le reste. La référence à "Microsoft Visual basic for
applications Extensibility 5.3" n'est pas nécessaire si tu modifies
ainsi


les procédures:
Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", ,
Application.DefaultFilePath)

If SourceP = "" Then Exit Sub
1: SourceF = InputBox("Nom du fichier source", , "Classeur1.xls")
If SourceF = "" Then Exit Sub
If Dir(SourceP & "" & SourceF) = "" Then
MsgBox "Fichier " & SourceF & " non trouvé !", 64
GoTo 1
End If
On Error Resume Next
Workbooks(SourceF).Activate
If Err Then Workbooks.Open SourceP & "" & SourceF
On Error GoTo 0
If ActiveWorkbook.VBProject.Protection Then
MsgBox "Le projet de " & ActiveWorkbook.Name & " est protégé !", 64
Exit Sub
End If
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP
End Sub

Sub CopyModules(TargetF, SourceF, SourceP)
DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
With Workbooks(SourceF)
For i = 1 To .Worksheets.Count
CopySheetCode SourceF, TargetF, .Worksheets(i).CodeName
Next i
End With
End Sub

Private Sub DeleteAllVBA()
Dim VBComp As Object
With ActiveWorkbook.VBProject
For Each VBComp In .VBComponents
' Skip module containing copycode
If Not VBComp.Name = "CopyCode" Then
Select Case VBComp.Type
Case 1 To 3: .VBComponents.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
End If
Next VBComp
End With
End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As Object
With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then Kill FName
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> 100 Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With
End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub

MP

"sabatier" a écrit dans le
message

de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au
passage,


doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans
un



classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur



10
millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces
procs...jusqu'au


moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes
boutons,


je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse
la



restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
que


la proc donne ce nom aux modules copiés dont on peut comprendre qu'il
ne



soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'ai



confiance dans le québec d'où jaillira certainement une nouvelle fois
la



lumière...quand le jour aura baigné de la sienne la belle province
('tain,


pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand
même)


jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des
feuilles



choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes
documents")



SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in
message




news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la
tête




à
ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls




et
le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton




texte
sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour
de





la
semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language
Specification





Cette extension de fichier est apparu avec la version 4 de
Visual






basic
(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
dans






le
cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite
...avec





tout
son contenu ! )

Dans excel, un module de classe sert à définir les propriétés,
les






méthodes et les événements d'une classe spécifique
d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel
objet





et
une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le
nom





du
module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de
classe





ne
crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier
.cls)





par
les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer
un






"objet
physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj > > ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2,
True)






Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer
dans






un
module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre
guillemets






"c:excelFeuil1.txt" est le chemin et le nom du fichier créé
par






la
procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de
ton






fichier
est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de
récupération,





le
module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de
classe






d'origine (code seulement) et ce n'est pas habituellement
ce qui est désiré... dans excel. De plus, il se permettra
d'ajouter





ces
lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code
supplémentaire.






VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit
dans






le
message de
news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
après





exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.bas





et
no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation
dans






l'autre
classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me
pose






la
question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps
























Avatar
docm
Bonjour Michel Pierron.

Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName existe
dans le classeur destination.



"Michel Pierron" wrote in message
news:#
Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le fichier
après importation des modules car si l'on ferme Excel et qu'une
instruction

astucieuse telle que:
ThisWorkbook.Saved = True ou ThisWorkbook.Close False se trouve dans la
procédure importé ThisWorkbook_BeforeClose, basta le boulot.
MP

"sabatier" a écrit dans le
message

de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au
passage,


doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans un
classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas sur
10


millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces
procs...jusqu'au


moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes
boutons,


je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse la
restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
que


la proc donne ce nom aux modules copiés dont on peut comprendre qu'il ne
soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais j'ai
confiance dans le québec d'où jaillira certainement une nouvelle fois la
lumière...quand le jour aura baigné de la sienne la belle province
('tain,


pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand
même)


jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des
feuilles



choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes
documents")



SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in message
news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la
tête




à
ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls




et
le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton




texte
sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour
de





la
semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language
Specification





Cette extension de fichier est apparu avec la version 4 de Visual
basic



(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent dans
le




cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite
...avec





tout
son contenu ! )

Dans excel, un module de classe sert à définir les propriétés, les
méthodes et les événements d'une classe spécifique

d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel
objet





et
une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le
nom





du
module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de
classe





ne
crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier
.cls)





par
les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objet


physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj > ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2, True)
Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer dans
un




module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre
guillemets






"c:excelFeuil1.txt" est le chemin et le nom du fichier créé par
la




procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de ton
fichier


est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de
récupération,





le
module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellement

ce qui est désiré... dans excel. De plus, il se permettra
d'ajouter





ces
lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code supplémentaire.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit dans
le





message de
news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
après





exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.bas





et
no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation dans
l'autre


classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me pose
la




question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps




















Avatar
Michel Pierron
Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une ligne On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP

"docm" a écrit dans le message de
news:
Bonjour Michel Pierron.

Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName existe
dans le classeur destination.



"Michel Pierron" wrote in message
news:#
Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le fichier
après importation des modules car si l'on ferme Excel et qu'une
instruction

astucieuse telle que:
ThisWorkbook.Saved = True ou ThisWorkbook.Close False se trouve dans la
procédure importé ThisWorkbook_BeforeClose, basta le boulot.
MP

"sabatier" a écrit dans le
message

de news:
bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bien

vous lever à une heure où chrisV n'est pas encore couché, non?)
merci d'avoir su trouver cette proc de CPearson qui, soit dit au
passage,


doit être un monsieur hyper-méticuleux : il envisage, avec son

If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If

le cas, fort rare AMHA, où quelque fou aurait pondu des modules dans
un



classeur NON enregistré ("mais imaginons" comme dirait Bigard dans son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur



10
millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le sens
inné

de la médisance, d'avoir rappeler la référence de la bibliothèque à
ajouter...
malgré ma g...d.b..., je me suis beaucoup intéressé à ces
procs...jusqu'au


moment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celui

qui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-il

l'honorable CPearson ; je ne m'appelle pas michel P, moi et à mes
boutons,


je m'y attache, comme disait ma grand'mère avant qu'elle ne connaisse
la



restauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe les
modules

dont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
que


la proc donne ce nom aux modules copiés dont on peut comprendre qu'il
ne



soit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'ai



confiance dans le québec d'où jaillira certainement une nouvelle fois
la



lumière...quand le jour aura baigné de la sienne la belle province
('tain,


pour un épilogue, ça c'est un épilogue mais cessez d'applaudir quand
même)


jps

"docm" a écrit dans le message de
news:uhm$
Bonjour jps.

Si je n'ai pas la berlue, le code suivant (de cpearson) permet
d'importer


le
code de tous les modules ainsi que celui de ThisWorkbook et des
feuilles



choisies.
Est-ce possible?

Sub Copies()
If ActiveWorkbook.Path = "" Then
MsgBox "Veuillez sauvegarder le présent classeur "
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
TargetF = ActiveWorkbook.Name
If Right(TargetF, 4) <> ".xls" Then TargetF = TargetF & ".xls"
SourceP = InputBox("Répertoire de la source", , "C:mes
documents")



SourceF = InputBox("Nom du fichier source", , "classeur1.xls")
Workbooks.Open SourceP & "" & SourceF
Workbooks(TargetF).Activate
CopyModules TargetF, SourceF, SourceP

End Sub



Sub CopyModules(TargetF, SourceF, SourceP)

DeleteAllVBA
CopyAllModules SourceF, TargetF
CopySheetCode SourceF, TargetF, "ThisWorkbook"
CopySheetCode SourceF, TargetF, "Feuil3"

End Sub
Sub DeleteAllVBA()
Dim VBComp As VBIDE.VBComponent
Dim VBComps As VBIDE.VBComponents

Set VBComps = ActiveWorkbook.VBProject.VBComponents
For Each VBComp In VBComps

'Skip module containing copycode
If VBComp.Name = "CopyCode" Then GoTo NextOne
Select Case VBComp.Type
Case vbext_ct_StdModule, vbext_ct_MSForm, _
vbext_ct_ClassModule
VBComps.Remove VBComp
Case Else
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
NextOne:
Next VBComp

End Sub

Sub CopyAllModules(SourceF, TargetF)
Dim FName As String
Dim VBComp As VBIDE.VBComponent

With Workbooks(SourceF)
FName = .Path & "code.txt"
If Dir(FName) <> "" Then
Kill FName
End If
For Each VBComp In .VBProject.VBComponents
If VBComp.Type <> vbext_ct_Document Then
VBComp.Export FName
Workbooks(TargetF).VBProject.VBComponents.Import FName
Kill FName
End If
Next VBComp
End With

End Sub

Sub CopySheetCode(SourceF, TargetF, ShName)
Set C = Workbooks(SourceF).VBProject.VBComponents.Item(ShName)
NumLines = C.CodeModule.CountOfLines
For i = 1 To NumLines
strcode = strcode & C.CodeModule.Lines(i, 1) & vbCr
Next

Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
On Error Resume Next
C.CodeModule.AddFromString (strcode)
End Sub



"sabatier" wrote in
message




news:#
waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi qui
avais



posé la question : je n'aurais jamais du...où avais-je encore la
tête




à
ce
moment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls




et
le
titre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton




texte
sur excelabo, mais j'ai peur qu'elle ne fasse pas recette...
bon samedi à toi aussi, denis
jps

"michdenis" a écrit dans le message de
news:
Bonjour JPS,

Ce n'est pas une quetion pour un samedi... ni pour un autre jour
de





la
semaine ! ;-)

CLS = Extension de fichier signifiant : Code Language
Specification





Cette extension de fichier est apparu avec la version 4 de
Visual






basic
(Le Programme) pour désigner un module de classe.

Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
dans






le
cas
d'un import-export du code des "Feuil". Et la
raison, ce sont des modules de classes contrairement au module
standard



(fichier .bas) Concernant les formulaires,
l'extension du fichier export est .Frm (abréviation pour
formulaire).




Dans
ce cas, c'est un peu différent car il y a l'objet
lui-même(formulaire) qui est exporté et importé par la suite
...avec





tout
son contenu ! )

Dans excel, un module de classe sert à définir les propriétés,
les






méthodes et les événements d'une classe spécifique
d'objets. Par exemple, si tu désires définir un comportement
particulier



pour un groupe de boutons de commande, le nom que tu
donnes au module de classe représente en même temps, un nouvel
objet





et
une nouvelle classe d'objet. Dans ce module,, tu
insèrera le code particulier à cette nouvelle classe d'objet. Le
nom





du
module de classe désigne à la fois le nouvel objet et
la nouvelle classe de l'objet. Mais attention, le module de
classe





ne
crée pas de "nouveaux boutons de commande" mais une
nouvelle classe d'objet ayant ses propres spécifications contenu
dans




son
module. Le nouvel objet créé sera présent seulement
au moment de l'instantiation de ce dernier avec le mot clé "New"
dans




le
code.
Dim JPS As New Toto (toto étant le nom du module de classe)

L'exportation et l'importation d'un module de classe (fichier
.cls)





par
les commandes du menu de la fenêtre VBE, correspond
essentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"



qui eux, sont créés par l'application Excel. Dans
excel, le module de classe ne crée lui-même l'objet "Feuil" ou
"ThisWorkbook" au sens où on les voit dans la fenêtre du

projet VBE. Il ne peut pas en conséquence, exporter ou importer
un






"objet
physique" mais seulement le code associé à cet
objet.

Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau




a
créé ceci : Une procédure qui copie le texte du
module de classe dans un fichier texte.

'========================= > > > > > > Sub test()
WriteModuleToTextFile "ThisWorkbook"
End Sub
'========================= > > > > > > Sub WriteModuleToTextFile(NomModule$)
Dim FSO As Object
Dim Obj As Object
Dim Txt As Object
Dim Contenu$

Set Obj > > ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
Contenu = Obj.Lines(1, Obj.CountOfLines)

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Txt = FSO.OpenTextFile("d:" & NomModule & ".txt", 2,
True)






Txt.Write Contenu
Txt.Close
End Sub 'fs
'========================= > > > > > >

Et si tu veux récupérer le code du fichier créer et l'insérer
dans






un
module particulier, tu peux utiliser ceci :

'----------------------
With ThisWorkbook
.VBProject.VBComponents("Feuil1").CodeModule.AddFromFile
"c:Feuil1.txt"

End With
'----------------------

Tu remplaces "Feuil1" par le nom du module désiré entre
guillemets






"c:excelFeuil1.txt" est le chemin et le nom du fichier créé
par






la
procédure de Frédéric.


Si tu as procédé manuellement à l'exportation, l'extension de
ton






fichier
est .Cls, et si tu désires récupérer le code du
fichier .cls, avec la procédure (3 lignes) soumise de
récupération,





le
module de classe ("l'objet physique") de destination
devra être déjà présent et il devra aussi avoir même nom que le
module




de
classe d'origine, sinon, il remplacera le module de
classe ("l'objet physique") de destination par le module de
classe






d'origine (code seulement) et ce n'est pas habituellement
ce qui est désiré... dans excel. De plus, il se permettra
d'ajouter





ces
lignes de code en début du module de destination
qu'il faudrait enlever par quelques lignes de code
supplémentaire.






VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
End


Salutations !

P.S. Bon samedi quand même !!!




"sabatier" a écrit
dans






le
message de
news:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
après





exportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.bas





et
no
problemo pour l'importer
par contre, pour le module ThisWorkbook, c'est moins sympa car
*Fichier/Exporter un fichier* crée un .cls et à l'importation
dans






l'autre
classeur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,


le
seul, le vrai, l'authentique, qui va recevoir la procédure
importer...du



coup, c'est moi qui fais une drôle de tête de clone car je me
pose






la
question de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...un

grand merci par avance
jps
























1 2 3