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
letitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
textesur 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
casd'un import-export du code des "Feuil". Et laraison, 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).
Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite ...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulier
pour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel objet
et
une nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le nom
du
module de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de classe ne
crée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu dans
sonmodule. Le nouvel objet créé sera présent seulementau 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, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"
qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
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 dumodule 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
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de récupération, le
module de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le module
declasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ces
lignes de code en début du module de destinationqu'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 denews: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
noproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, 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...ungrand merci par avance
jps
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
letitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
textesur 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
casd'un import-export du code des "Feuil". Et laraison, 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).
Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite ...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulier
pour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel objet
et
une nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le nom
du
module de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de classe ne
crée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu dans
sonmodule. Le nouvel objet créé sera présent seulementau 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, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"
qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
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 dumodule 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
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de récupération, le
module de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le module
declasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ces
lignes de code en début du module de destinationqu'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 denews: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
noproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, 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...ungrand merci par avance
jps
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
lecode 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
à
cemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
textesur 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
casd'un import-export du code des "Feuil". Et laraison, 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).
Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite ...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de classe
ne
crée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
dans
sonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
dans
lecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau
acréé ceci : Une procédure qui copie le texte dumodule 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
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de récupération,
le
module de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
module
declasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
noproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, 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...ungrand merci par avance
jps
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
lecode 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
à
cemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
textesur 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
casd'un import-export du code des "Feuil". Et laraison, 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).
Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite ...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de classe
ne
crée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
dans
sonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
dans
lecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau
acréé ceci : Une procédure qui copie le texte dumodule 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
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de récupération,
le
module de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
module
declasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
noproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, 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...ungrand merci par avance
jps
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
lecode 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
à
cemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
textesur 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
casd'un import-export du code des "Feuil". Et laraison, 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).
Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite ...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de classe
ne
crée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
dans
sonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
dans
lecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau
acréé ceci : Une procédure qui copie le texte dumodule 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
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de récupération,
le
module de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
module
declasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
noproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, 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...ungrand merci par avance
jps
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
lecode 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
à
cemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la .cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette ton
textesur 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
casd'un import-export du code des "Feuil". Et laraison, 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).
Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite ...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de classe
ne
crée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
dans
sonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
dans
lecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneau
acréé ceci : Une procédure qui copie le texte dumodule 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
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de récupération,
le
module de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
module
declasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
noproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, 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...ungrand merci par avance
jps
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
bienvous 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é
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont 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'importerlecode 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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
tête
àcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton
textesur 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
lasemaine ! ;-)
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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classe
necrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,
lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
etnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:upCtgNRfEHA.3928@TK2MSFTNGP11.phx.gbl...
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans
le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
bienvous 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é
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont 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'importerlecode 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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
tête
àcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton
textesur 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
lasemaine ! ;-)
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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classe
necrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,
lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
etnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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
bienvous 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é
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont 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'importerlecode 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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
tête
àcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton
textesur 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
lasemaine ! ;-)
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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classe
necrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,
lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
etnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:upCtgNRfEHA.3928@TK2MSFTNGP11.phx.gbl...
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans
le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
bienvous 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é
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont 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'importerlecode 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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
tête
àcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton
textesur 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
lasemaine ! ;-)
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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classe
necrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,
lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
etnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
Bonsoir docm,
" Si je n'ai pas la berlue ..."
**** attention ça ne devrait pas tarder ... ;-)
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"
Pour ce qui est du reste, je te laisse expliquer à JPS ce que font ces
procédures
....en espérant que JPS n'a pas trop la
gueule de bois ce matin !!! ;-))
Salutations!
Bonsoir docm,
" Si je n'ai pas la berlue ..."
**** attention ça ne devrait pas tarder ... ;-)
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"
Pour ce qui est du reste, je te laisse expliquer à JPS ce que font ces
procédures
....en espérant que JPS n'a pas trop la
gueule de bois ce matin !!! ;-))
Salutations!
Bonsoir docm,
" Si je n'ai pas la berlue ..."
**** attention ça ne devrait pas tarder ... ;-)
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"
Pour ce qui est du reste, je te laisse expliquer à JPS ce que font ces
procédures
....en espérant que JPS n'a pas trop la
gueule de bois ce matin !!! ;-))
Salutations!
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
setrouve 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
messagede news:bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bienvous 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
10millions)...
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'aumoment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
quela 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'importerlecode de tous les modules ainsi que celui de ThisWorkbook et des
feuilleschoisies.
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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
têteàcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.clsetletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
tontextesur 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
delasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette 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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avectoutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nomdumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classenecrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer
un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouterceslignes de code en début du module de destinationqu'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
lemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
aprèsexportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.basetnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me
pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
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" <michel.pierron@free.fr> a écrit dans le message de
news:enXgSASfEHA.3988@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:upCtgNRfEHA.3928@TK2MSFTNGP11.phx.gbl...
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in
message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit
dans
le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
setrouve 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
messagede news:bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bienvous 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
10millions)...
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'aumoment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
quela 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'importerlecode de tous les modules ainsi que celui de ThisWorkbook et des
feuilleschoisies.
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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
têteàcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.clsetletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
tontextesur 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
delasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette 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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avectoutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nomdumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classenecrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer
un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouterceslignes de code en début du module de destinationqu'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
lemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
aprèsexportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.basetnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me
pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
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
setrouve 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
messagede news:bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bienvous 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
10millions)...
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'aumoment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
quela 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'importerlecode de tous les modules ainsi que celui de ThisWorkbook et des
feuilleschoisies.
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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
têteàcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.clsetletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
tontextesur 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
delasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette 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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avectoutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nomdumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classenecrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer
un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouterceslignes de code en début du module de destinationqu'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
lemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
aprèsexportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.basetnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me
pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
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" <michel.pierron@free.fr> a écrit dans le message de
news:enXgSASfEHA.3988@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:upCtgNRfEHA.3928@TK2MSFTNGP11.phx.gbl...
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in
message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit
dans
le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
setrouve 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
messagede news:bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bienvous 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
10millions)...
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'aumoment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
quela 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'importerlecode de tous les modules ainsi que celui de ThisWorkbook et des
feuilleschoisies.
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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
têteàcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.clsetletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
tontextesur 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
delasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette 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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avectoutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nomdumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classenecrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer
un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouterceslignes de code en début du module de destinationqu'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
lemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
aprèsexportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.basetnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me
pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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
bienvous 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é
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont 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'importerlecode 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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
tête
àcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton
textesur 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
lasemaine ! ;-)
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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classe
necrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,
lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
etnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:upCtgNRfEHA.3928@TK2MSFTNGP11.phx.gbl...
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans
le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
bienvous 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é
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont 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'importerlecode 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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
tête
àcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.cls
etletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
ton
textesur 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
lasemaine ! ;-)
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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avec
toutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objet
etune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nom
dumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classe
necrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)
parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,
lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouter
ceslignes de code en début du module de destinationqu'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 denews: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
etnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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
instructionastucieuse 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
messagede news:bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bienvous 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
10millions)...
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'aumoment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
quela 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'importerlecode de tous les modules ainsi que celui de ThisWorkbook et des
feuilleschoisies.
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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
têteàcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.clsetletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
tontextesur 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
delasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette 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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avectoutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nomdumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classenecrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer
un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouterceslignes de code en début du module de destinationqu'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
lemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
aprèsexportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.basetnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me
pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps
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" <michel.pierron@free.fr> wrote in message
news:#thiWDSfEHA.636@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:upCtgNRfEHA.3928@TK2MSFTNGP11.phx.gbl...
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" <docmarti@spamcolba.net> a écrit dans le message de
news:uhm$FUPfEHA.3556@TK2MSFTNGP12.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in
message
news:#rWmT7KfEHA.1764@TK2MSFTNGP10.phx.gbl...
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" <michdenis@hotmail.com> a écrit dans le message de
news:ObajTDJfEHA.236@tk2msftngp13.phx.gbl...
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" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit
dans
le
message de
news:ue%23DDOEfEHA.2896@TK2MSFTNGP11.phx.gbl...
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
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
instructionastucieuse 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
messagede news:bonjour docm, bonjour denis, allez debout les québécois (vous pourriez
bienvous 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
10millions)...
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'aumoment où j'ai lu avec effroi "DeleteAllVBA" : il n'est pas encore né
celuiqui, à l'insu de mon plein gré, voudrait faire péter mon usine à gaz,
fût-ill'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
modulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois nulle part
quela 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'importerlecode de tous les modules ainsi que celui de ThisWorkbook et des
feuilleschoisies.
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
avaisposé la question : je n'aurais jamais du...où avais-je encore la
têteàcemoment-là?
enfin, merci, denis, pour ces autres esseuplications...ça sent la
.clsetletitre de MVP, non?... j'ai failli suggérer à misange qu'elle mette
tontextesur 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
delasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette 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
lecasd'un import-export du code des "Feuil". Et laraison, 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).Dansce cas, c'est un peu différent car il y a l'objetlui-même(formulaire) qui est exporté et importé par la suite
...avectoutson 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écifiqued'objets. Par exemple, si tu désires définir un comportement
particulierpour un groupe de boutons de commande, le nom que tudonnes au module de classe représente en même temps, un nouvel
objetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe d'objet. Le
nomdumodule de classe désigne à la fois le nouvel objet etla nouvelle classe de l'objet. Mais attention, le module de
classenecrée pas de "nouveaux boutons de commande" mais unenouvelle classe d'objet ayant ses propres spécifications contenu
danssonmodule. Le nouvel objet créé sera présent seulementau moment de l'instantiation de ce dernier avec le mot clé "New"
danslecode.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)parles commandes du menu de la fenêtre VBE, correspondessentiellement au code de l'objet "Feuil" ou de l'objet
"ThisWorkbook"qui eux, sont créés par l'application Excel. Dansexcel, 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 duprojet VBE. Il ne peut pas en conséquence, exporter ou importer
un
"objetphysique" mais seulement le code associé à cetobjet.
Pour conserver le code d'un module de classe, l'ami Frédéric
Sigonneauacréé ceci : Une procédure qui copie le texte dumodule 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
unmodule 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
laprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
ton
fichierest .Cls, et si tu désires récupérer le code dufichier .cls, avec la procédure (3 lignes) soumise de
récupération,lemodule de classe ("l'objet physique") de destinationdevra être déjà présent et il devra aussi avoir même nom que le
moduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classe
d'origine (code seulement) et ce n'est pas habituellementce qui est désiré... dans excel. De plus, il se permettra
d'ajouterceslignes de code en début du module de destinationqu'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
lemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de modules
aprèsexportationnage d'iceux....
pour un module standard, *Fichier/Exporter un fichier* crée un
.basetnoproblemo 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'autreclasseur, c'est un ThisWorkbook1 qui va s'ajouter et non le
ThisWorkbook,leseul, le vrai, l'authentique, qui va recevoir la procédure
importer...ducoup, c'est moi qui fais une drôle de tête de clone car je me
pose
laquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur ce
phénomène...ungrand merci par avance
jps