Mea culpa...jps.
Mea culpa...jps.
Mea culpa...jps.
Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" wrote in message
news:#merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien
trop
ardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier (si
jecomprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auronttous 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é
aumê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
ainsiles 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur10millions)...
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
larestauration 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
nesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
fois
lalumiè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
messagenews:#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
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
danslecasd'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,
lesmé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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
tonfichierest .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
classed'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
danslemessage 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
dansl'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
poselaquestion 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.
Il ne faut nommer "CopyCode" que le module contenant le code de cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" <jpsabatTheKingOfHS@wanadoo.fr> wrote in message
news:#ZJ4vlSfEHA.3944@tk2msftngp13.phx.gbl...
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
Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" wrote in message
news:#merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien
trop
ardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier (si
jecomprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auronttous 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é
aumê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
ainsiles 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur10millions)...
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
larestauration 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
nesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
fois
lalumiè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
messagenews:#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
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
danslecasd'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,
lesmé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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
tonfichierest .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
classed'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
danslemessage 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
dansl'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
poselaquestion 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;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une ligne
On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName existe
dans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichier
après importation des modules car si l'on ferme Excel et qu'une
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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur10millions)...
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
larestauration 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
nesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
fois
lalumiè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
messagenews:#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
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
danslecasd'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,
lesmé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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
tonfichierest .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
classed'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
danslemessage 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
dansl'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
poselaquestion 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;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une ligne
On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:uIdjKXTfEHA.644@tk2msftngp13.phx.gbl...
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 docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une ligne
On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName existe
dans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichier
après importation des modules car si l'on ferme Excel et qu'une
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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
son
sketch de la chauve-souris dont la morsure est mortelle dans un cas
sur10millions)...
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
larestauration 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
nesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
fois
lalumiè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
messagenews:#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
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi présent
danslecasd'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,
lesmé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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension de
tonfichierest .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
classed'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
danslemessage 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
dansl'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
poselaquestion 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
te absolvo, docm
vade in pace...
jps
"docm" a écrit dans le message de
news:%
Mea culpa...jps.
te absolvo, docm
vade in pace...
jps
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:%238swW8SfEHA.596@TK2MSFTNGP11.phx.gbl...
Mea culpa...jps.
te absolvo, docm
vade in pace...
jps
"docm" a écrit dans le message de
news:%
Mea culpa...jps.
ah! verstanden, docm...merci et tu as bien fait d'enfoncer le clou car je
n'avais pas compris ce qu'avait voulu dire michel P (P de Pierron, pas de
Péroche, l'homme qui s'accroche mais bien Pierron, l'homme qui vaut des
ronds) à ce sujet...
jps
"docm" a écrit dans le message de
news:Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de
cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" wrote in message
news:#merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien
tropardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier
(si
jecomprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auronttous 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
moreteaujps
"Michel Pierron" a écrit dans le message de
news:Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans
lequelsetrouve les procédures de copie en CopyCode sinon, ce module sera
effacéaumême titre que tout le reste. La référence à "Microsoft Visual basic
forapplications Extensibility 5.3" n'est pas nécessaire si tu modifies
ainsiles 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
pourriezbienvous 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cas
sur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le
sensinné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
connaisselarestauration 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
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi
quiavaisposé 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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présent
danslecasd'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,
lesmé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.
Lenomdumodule 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
contenudanssonmodule. 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
importerun"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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
de
tonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classed'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
danslemessage 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
dansl'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
poselaquestion 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
ah! verstanden, docm...merci et tu as bien fait d'enfoncer le clou car je
n'avais pas compris ce qu'avait voulu dire michel P (P de Pierron, pas de
Péroche, l'homme qui s'accroche mais bien Pierron, l'homme qui vaut des
ronds) à ce sujet...
jps
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:uhTNWMTfEHA.2396@TK2MSFTNGP11.phx.gbl...
Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de
cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" <jpsabatTheKingOfHS@wanadoo.fr> wrote in message
news:#ZJ4vlSfEHA.3944@tk2msftngp13.phx.gbl...
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
ah! verstanden, docm...merci et tu as bien fait d'enfoncer le clou car je
n'avais pas compris ce qu'avait voulu dire michel P (P de Pierron, pas de
Péroche, l'homme qui s'accroche mais bien Pierron, l'homme qui vaut des
ronds) à ce sujet...
jps
"docm" a écrit dans le message de
news:Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de
cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" wrote in message
news:#merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien
tropardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier
(si
jecomprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auronttous 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
moreteaujps
"Michel Pierron" a écrit dans le message de
news:Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans
lequelsetrouve les procédures de copie en CopyCode sinon, ce module sera
effacéaumême titre que tout le reste. La référence à "Microsoft Visual basic
forapplications Extensibility 5.3" n'est pas nécessaire si tu modifies
ainsiles 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
pourriezbienvous 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cas
sur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le
sensinné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
connaisselarestauration 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
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi
quiavaisposé 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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présent
danslecasd'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,
lesmé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.
Lenomdumodule 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
contenudanssonmodule. 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
importerun"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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
de
tonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classed'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
danslemessage 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
dansl'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
poselaquestion 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 Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" a écrit dans le message de
news:Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
OnError Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName
existe
dans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichieraprè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
laprocé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
pourriezbienvous 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cas
sur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le
sensinné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
connaisselarestauration 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
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi
quiavaisposé 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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présent
danslecasd'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,
lesmé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.
Lenomdumodule 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
contenudanssonmodule. 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
importerun"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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
de
tonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classed'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
danslemessage 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
dansl'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
poselaquestion 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 Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" <michel.pierron@free.fr> a écrit dans le message de
news:OTM0DKUfEHA.2396@TK2MSFTNGP11.phx.gbl...
Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:uIdjKXTfEHA.644@tk2msftngp13.phx.gbl...
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 Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" a écrit dans le message de
news:Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
OnError Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName
existe
dans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichieraprè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
laprocé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
pourriezbienvous 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cas
sur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le
sensinné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
connaisselarestauration 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
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi
quiavaisposé 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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présent
danslecasd'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,
lesmé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.
Lenomdumodule 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
contenudanssonmodule. 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
importerun"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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
de
tonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classed'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
danslemessage 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
dansl'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
poselaquestion 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
in nomine Patris et Filii et Spiritus jpSancti
"sabatier" wrote in message
news:u$#te absolvo, docm
vade in pace...
jps
"docm" a écrit dans le message de
news:%
Mea culpa...jps.
in nomine Patris et Filii et Spiritus jpSancti
"sabatier" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:u$#HgcVfEHA.708@TK2MSFTNGP09.phx.gbl...
te absolvo, docm
vade in pace...
jps
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:%238swW8SfEHA.596@TK2MSFTNGP11.phx.gbl...
Mea culpa...jps.
in nomine Patris et Filii et Spiritus jpSancti
"sabatier" wrote in message
news:u$#te absolvo, docm
vade in pace...
jps
"docm" a écrit dans le message de
news:%
Mea culpa...jps.
mit Vergnügen, jps
"sabatier" wrote in message
news:ah! verstanden, docm...merci et tu as bien fait d'enfoncer le clou car
je
n'avais pas compris ce qu'avait voulu dire michel P (P de Pierron, pas
de
Péroche, l'homme qui s'accroche mais bien Pierron, l'homme qui vaut des
ronds) à ce sujet...
jps
"docm" a écrit dans le message de
news:Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de
cpearsonafin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" wrote in message
news:#merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien
tropardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier
(sijecomprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auronttous 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
cetteproc"kill" tous les modules existant dans son VBE ou non?
j'en frémis encore telle l'eau dans laquelle cuit la saucisse de
moreteaujps
"Michel Pierron" a écrit dans le message de
news:Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans
lequelsetrouve les procédures de copie en CopyCode sinon, ce module sera
effacéaumême titre que tout le reste. La référence à "Microsoft Visual
basic
forapplications Extensibility 5.3" n'est pas nécessaire si tu
modifies
ainsiles 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
pourriezbienvous 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
dansunclasseur NON enregistré ("mais imaginons" comme dirait Bigard
dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cassur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage,
le
sensinné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
connaisselarestauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe
lesmodulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois
nulle
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
maisj'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
quandmê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
FNameKill 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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même
moi
quiavaisposé la question : je n'aurais jamais du...où avais-je
encore
latê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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présentdanslecasd'un import-export du code des "Feuil". Et laraison, ce sont des modules de classes contrairement au
modulestandard(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,lesmé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
nouvelobjetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe
d'objet.Lenomdumodule 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
contenudanssonmodule. 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
importerun"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érerdansunmodule 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ééparlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
detonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module
de
classed'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
danslemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de
modulesaprè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'importationdansl'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
meposelaquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur
cephénomène...ungrand merci par avance
jps
mit Vergnügen, jps
"sabatier" <biscotteUnScudJpsabatdelaile@wanadoo.fr> wrote in message
news:u3i0HhVfEHA.1424@tk2msftngp13.phx.gbl...
ah! verstanden, docm...merci et tu as bien fait d'enfoncer le clou car
je
n'avais pas compris ce qu'avait voulu dire michel P (P de Pierron, pas
de
Péroche, l'homme qui s'accroche mais bien Pierron, l'homme qui vaut des
ronds) à ce sujet...
jps
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:uhTNWMTfEHA.2396@TK2MSFTNGP11.phx.gbl...
Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de
cpearson
afin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" <jpsabatTheKingOfHS@wanadoo.fr> wrote in message
news:#ZJ4vlSfEHA.3944@tk2msftngp13.phx.gbl...
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
mit Vergnügen, jps
"sabatier" wrote in message
news:ah! verstanden, docm...merci et tu as bien fait d'enfoncer le clou car
je
n'avais pas compris ce qu'avait voulu dire michel P (P de Pierron, pas
de
Péroche, l'homme qui s'accroche mais bien Pierron, l'homme qui vaut des
ronds) à ce sujet...
jps
"docm" a écrit dans le message de
news:Bonjour jps.
Il ne faut nommer "CopyCode" que le module contenant le code de
cpearsonafin de protéger les procédures qu'il contient et qui sont en cours
d'exécution.
"jps" wrote in message
news:#merci, michel (pas denis) mais bouhhhhhhhhhhh que tout cela est bien
tropardu pour moi....
tu dis renommer "le" module dans lequel se trouve les procs à copier
(sijecomprends bien) mais s'il y en a plusieurs à copier (importer?), ils
auronttous 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
cetteproc"kill" tous les modules existant dans son VBE ou non?
j'en frémis encore telle l'eau dans laquelle cuit la saucisse de
moreteaujps
"Michel Pierron" a écrit dans le message de
news:Bonjour JPS;
En effet, il ne faut pas avoir oublier de renommer le module dans
lequelsetrouve les procédures de copie en CopyCode sinon, ce module sera
effacéaumême titre que tout le reste. La référence à "Microsoft Visual
basic
forapplications Extensibility 5.3" n'est pas nécessaire si tu
modifies
ainsiles 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
pourriezbienvous 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
dansunclasseur NON enregistré ("mais imaginons" comme dirait Bigard
dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cassur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage,
le
sensinné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
connaisselarestauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe
lesmodulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois
nulle
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
maisj'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
quandmê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
FNameKill 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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même
moi
quiavaisposé la question : je n'aurais jamais du...où avais-je
encore
latê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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présentdanslecasd'un import-export du code des "Feuil". Et laraison, ce sont des modules de classes contrairement au
modulestandard(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,lesmé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
nouvelobjetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe
d'objet.Lenomdumodule 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
contenudanssonmodule. 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
importerun"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érerdansunmodule 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ééparlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
detonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module
de
classed'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
danslemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de
modulesaprè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'importationdansl'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
meposelaquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur
cephénomène...ungrand merci par avance
jps
bonjour michel Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" a écrit dans le message de
news:Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
OnError Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName
existe
dans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichieraprè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
laprocé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
pourriezbienvous 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cas
sur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le
sensinné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
connaisselarestauration 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
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi
quiavaisposé 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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présent
danslecasd'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,
lesmé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.
Lenomdumodule 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
contenudanssonmodule. 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
importerun"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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
de
tonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classed'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
danslemessage 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
dansl'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
poselaquestion 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 Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" <michel.pierron@free.fr> a écrit dans le message de
news:OTM0DKUfEHA.2396@TK2MSFTNGP11.phx.gbl...
Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:uIdjKXTfEHA.644@tk2msftngp13.phx.gbl...
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 Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" a écrit dans le message de
news:Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
OnError Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName
existe
dans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichieraprè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
laprocé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
pourriezbienvous 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
unclasseur NON enregistré ("mais imaginons" comme dirait Bigard dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cas
sur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage, le
sensinné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
connaisselarestauration 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
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
mais
j'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même moi
quiavaisposé 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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présent
danslecasd'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,
lesmé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.
Lenomdumodule 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
contenudanssonmodule. 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
importerun"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
dansunmodule 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éé
parlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
de
tonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module de
classed'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
danslemessage 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
dansl'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
poselaquestion 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 Jean-paul;
Sans compter que tout ça revient simplement à ouvrir le classeur Source et
faire Enregistrer sous pour avoir le même résultat, c'est à dire un
classeur
contenant toutes les procédures du classeur source; comme quoi, il ne faut
pas hésiter à perdre 1/2 heure pour gagner 5 mn.
;-) MP
"sabatier" a écrit dans le
message
de news:%bonjour michel Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyend'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne
me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire
de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera
copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
enétait d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" a écrit dans le message de
news:Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligneOnError Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName
existedans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichieraprè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
laprocé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
pourriezbienvous 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
dansunclasseur NON enregistré ("mais imaginons" comme dirait Bigard
dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cassur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage,
le
sensinné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
connaisselarestauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe
lesmodulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois
nulle
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
maisj'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
quandmê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
FNameKill 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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même
moi
quiavaisposé la question : je n'aurais jamais du...où avais-je
encore
latê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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présentdanslecasd'un import-export du code des "Feuil". Et laraison, ce sont des modules de classes contrairement au
modulestandard(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,lesmé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
nouvelobjetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe
d'objet.Lenomdumodule 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
contenudanssonmodule. 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
importerun"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érerdansunmodule 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ééparlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
detonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module
de
classed'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
danslemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de
modulesaprè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'importationdansl'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
meposelaquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur
cephénomène...ungrand merci par avance
jps
Bonsoir Jean-paul;
Sans compter que tout ça revient simplement à ouvrir le classeur Source et
faire Enregistrer sous pour avoir le même résultat, c'est à dire un
classeur
contenant toutes les procédures du classeur source; comme quoi, il ne faut
pas hésiter à perdre 1/2 heure pour gagner 5 mn.
;-) MP
"sabatier" <biscotteUnScudJpsabatdelaile@wanadoo.fr> a écrit dans le
message
de news:%239RPblZfEHA.2848@TK2MSFTNGP10.phx.gbl...
bonjour michel Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyen
d'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne
me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire
de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera
copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
en
était d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" <michel.pierron@free.fr> a écrit dans le message de
news:OTM0DKUfEHA.2396@TK2MSFTNGP11.phx.gbl...
Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligne
On
Error Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" <docmarti@spamcolba.net> a écrit dans le message de
news:uIdjKXTfEHA.644@tk2msftngp13.phx.gbl...
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
Bonsoir Jean-paul;
Sans compter que tout ça revient simplement à ouvrir le classeur Source et
faire Enregistrer sous pour avoir le même résultat, c'est à dire un
classeur
contenant toutes les procédures du classeur source; comme quoi, il ne faut
pas hésiter à perdre 1/2 heure pour gagner 5 mn.
;-) MP
"sabatier" a écrit dans le
message
de news:%bonjour michel Pi, bonjour docm
ben moi, j'ai testé et viens de me donner la trouille de ma vie : pas
moyend'enregistrer un fichier modèle avec la proc Pearson 39 modifiée Pierron
45....alerte virale...bloodhoundmacro, que ça disait...document non
enregistré...et mon pote alsacien qui ne cessait de me dire "tous nos
brochets sont détruites"...mais je m'appelle pas michel Pé, moi ; je ne
me
suis pas précipité sur le forum en poussant des cries d'orfraie, voire
de
misange...ah que non, je suis allé rendre visite à mes autres potes de
symantec et hop, niveau de sécurité au plus bas....sacré C Pearson,
va...tout ça parce qu'il y a un "kill" dans sa macro, je suppose...
enfin, michel, pour ton info, je te précise que si on met en comments le
DeleteAllVBA et qu'on superpose divers classeurs source dans le même
classeur destination, s'il y a plusieurs Module1, le second qui sera
copié
deviendra Module11 mais je ne suis pas allé plus loin pour voir ce qu'il
enétait d'un troisième...
il n'empêche que je te remercie, docm, d'avoir donné cette proc qui peut
être d'un grand secours en cas de transhumance...
merci encore
jps
"Michel Pierron" a écrit dans le message de
news:Bonjour docm;
Oui, tu as raison, j'ai loupé celle la; il suffit de remonter d'une
ligneOnError Resume Next, sinon il faut créer ou copier la feuille.
Comme quoi, j'aurais du tester...
MP
"docm" a écrit dans le message de
news:Bonjour Michel Pierron.
Avant d'éxécuter
Set C = Workbooks(TargetF).VBProject.VBComponents.Item(ShName)
je crois qu'il serait judicieux de vérifier qu'une feuille ShName
existedans le classeur destination.
"Michel Pierron" wrote in message
news:#Re Jean-Paul;
Autre chose importante, rajouter une instruction pour sauver le
fichieraprè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
laprocé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
pourriezbienvous 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
dansunclasseur NON enregistré ("mais imaginons" comme dirait Bigard
dans
sonsketch de la chauve-souris dont la morsure est mortelle dans un
cassur10millions)...
merci aussi à...michel dont vous noterez, toujours au passage,
le
sensinné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
connaisselarestauration des systèmes...
ceci mis à part, je me demande pourquoi ce même CPearson skippe
lesmodulesdont le nom serait (ou incluerait?) "CopyCode" : je ne vois
nulle
partquela proc donne ce nom aux modules copiés dont on peut comprendre
qu'ilnesoit pas utile de les copier une nouvelle fois....
après tout, je suis peut-être complètement à côté de la plaque
maisj'aiconfiance dans le québec d'où jaillira certainement une nouvelle
foislalumiè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
quandmê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
FNameKill 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
messagenews:#waouh....et j'ai lu jusqu'au bout puisque c'est quand même
moi
quiavaisposé la question : je n'aurais jamais du...où avais-je
encore
latê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
mettetontextesur 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
jourdelasemaine ! ;-)
CLS = Extension de fichier signifiant : Code Language
SpecificationCette extension de fichier est apparu avec la version 4 de
Visualbasic(Le Programme) pour désigner un module de classe.
Ce que tu as observé avec Le "ThisWorkbook" est aussi
présentdanslecasd'un import-export du code des "Feuil". Et laraison, ce sont des modules de classes contrairement au
modulestandard(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,lesmé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
nouvelobjetetune nouvelle classe d'objet. Dans ce module,, tuinsèrera le code particulier à cette nouvelle classe
d'objet.Lenomdumodule 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
contenudanssonmodule. 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
importerun"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érerdansunmodule 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ééparlaprocédure de Frédéric.
Si tu as procédé manuellement à l'exportation, l'extension
detonfichierest .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
lemoduledeclasse d'origine, sinon, il remplacera le module declasse ("l'objet physique") de destination par le module
de
classed'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
danslemessage denews:ue%
bonjour,
je me livre aux douces joies de l'importationnement de
modulesaprè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'importationdansl'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
meposelaquestion de savoir ce qui va se passer ensuite...
si quelque bonne volonté aoûtienne peut m'en dire plus sur
cephénomène...ungrand merci par avance
jps