OVH Cloud OVH Cloud

Suppression et import de modules en VBA

7 réponses
Avatar
John Fuss
Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je mets à
jour un module et un module de classe (Mod_JMO & cAccesFile). Le but est de
supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1 et
cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les techniques
que je peux utiliser pour laisser le temps à VBE de supprimer les éléments
pour que les noms soient dispo lors de l'import et éviter l'apparition du
'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes les
macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre une
pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John











Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo + vbQuestion,
"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And Application.VBE.VBProjects(i).name
<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")
Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,
NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And Application.VBE.VBProjects(i).name
<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1
Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,
NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2
Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,
NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function

7 réponses

Avatar
Michel Gaboly
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que tu cherches,
mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de feuille) contenant
le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le classeur actif :

Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les modules
' de feuille et le module ThisWorkbook, 3 pr les modules de UserForm)
If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je mets à
jour un module et un module de classe (Mod_JMO & cAccesFile). Le but est de
supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1 et
cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les techniques
que je peux utiliser pour laisser le temps à VBE de supprimer les éléments
pour que les noms soient dispo lors de l'import et éviter l'apparition du
'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes les
macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre une
pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo + vbQuestion,
"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And Application.VBE.VBProjects(i).name
<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")
Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,
NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And Application.VBE.VBProjects(i).name
<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1
Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,
NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2
Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,
NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com

Avatar
John Fuss
Ces infos sont très interessantes, je les mets de côté, de mon côté j'ai mis
une pause de 2 secondes entre la suppression des éléments et l'import des
fichiers. Ca fonctionne bien.

Merci bcp.

John

"Michel Gaboly" a écrit dans le message de
news:
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que tu
cherches,

mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de feuille)
contenant

le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option
Explicit

' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le classeur
actif :


Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les
modules

' de feuille et le module ThisWorkbook, 3 pr les modules de
UserForm)

If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule

' Le DeleteLines sert à éviter éviter d'avoir 2
fois Option Explicit

' si la déclaration explicite est cochée dans les
préférences

.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je
mets à


jour un module et un module de classe (Mod_JMO & cAccesFile). Le but
est de


supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1
et


cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les
techniques


que je peux utiliser pour laisser le temps à VBE de supprimer les
éléments


pour que les noms soient dispo lors de l'import et éviter l'apparition
du


'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes
les


macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre
une


pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo +
vbQuestion,


"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Michel Gaboly
Re,

Comme quoi, une pause n'est pas une perte de temps ;-)))


Ces infos sont très interessantes, je les mets de côté, de mon côté j'ai mis
une pause de 2 secondes entre la suppression des éléments et l'import des
fichiers. Ca fonctionne bien.

Merci bcp.

John

"Michel Gaboly" a écrit dans le message de
news:
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que tu
cherches,

mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de feuille)
contenant

le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option
Explicit

' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le classeur
actif :


Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les
modules

' de feuille et le module ThisWorkbook, 3 pr les modules de
UserForm)

If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM > ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule

' Le DeleteLines sert à éviter éviter d'avoir 2
fois Option Explicit

' si la déclaration explicite est cochée dans les
préférences

.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je
mets à


jour un module et un module de classe (Mod_JMO & cAccesFile). Le but
est de


supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1
et


cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les
techniques


que je peux utiliser pour laisser le temps à VBE de supprimer les
éléments


pour que les noms soient dispo lors de l'import et éviter l'apparition
du


'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes
les


macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre
une


pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo +
vbQuestion,


"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com



Avatar
Frédéric Sigonneau
Bonsoir,

A la place d'une pause, tu pourrais aussi essayer un DoEvents entre tes deux
boucles For ou, si le malade est rebelle, une bouclette de ce style :

For i=1 To 10
DoEvents
Next i

(très cochonne la bouclette, mais si ça marche..)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Ces infos sont très interessantes, je les mets de côté, de mon côté j'ai mis
une pause de 2 secondes entre la suppression des éléments et l'import des
fichiers. Ca fonctionne bien.

Merci bcp.

John

"Michel Gaboly" a écrit dans le message de
news:
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que tu
cherches,

mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de feuille)
contenant

le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option
Explicit

' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le classeur
actif :


Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les
modules

' de feuille et le module ThisWorkbook, 3 pr les modules de
UserForm)

If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM > ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule

' Le DeleteLines sert à éviter éviter d'avoir 2
fois Option Explicit

' si la déclaration explicite est cochée dans les
préférences

.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je
mets à


jour un module et un module de classe (Mod_JMO & cAccesFile). Le but
est de


supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1
et


cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les
techniques


que je peux utiliser pour laisser le temps à VBE de supprimer les
éléments


pour que les noms soient dispo lors de l'import et éviter l'apparition
du


'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes
les


macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre
une


pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo +
vbQuestion,


"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
John Fuss
J'ai essayé d'utiliser DoEvents mais sans succès... Mais c vrai que j'aurai
un peu honte d'utiliser cette boucle ( :-D)

Merci
John.

"Frédéric Sigonneau" a écrit dans le message
de news:
Bonsoir,

A la place d'une pause, tu pourrais aussi essayer un DoEvents entre tes
deux

boucles For ou, si le malade est rebelle, une bouclette de ce style :

For i=1 To 10
DoEvents
Next i

(très cochonne la bouclette, mais si ça marche..)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Ces infos sont très interessantes, je les mets de côté, de mon côté j'ai
mis


une pause de 2 secondes entre la suppression des éléments et l'import
des


fichiers. Ca fonctionne bien.

Merci bcp.

John

"Michel Gaboly" a écrit dans le message de
news:
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que
tu



cherches,
mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de
feuille)



contenant
le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule



' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option
Explicit

' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le
classeur



actif :

Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr
les



modules
' de feuille et le module ThisWorkbook, 3 pr les modules
de



UserForm)
If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM > > ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule

' Le DeleteLines sert à éviter éviter d'avoir
2



fois Option Explicit
' si la déclaration explicite est cochée dans
les



préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je
mets à


jour un module et un module de classe (Mod_JMO & cAccesFile). Le
but




est de
supprimer ces éléments dans toutes les macros complémentaires sauf
la




principale (MacroJMO) et d'importer ces éléments qui ont été
exporter de




MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des
Mod_JMO1




et
cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les
techniques


que je peux utiliser pour laisser le temps à VBE de supprimer les
éléments


pour que les noms soient dispo lors de l'import et éviter
l'apparition




du
'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde
toutes




les
macros complémentaires ça ne fonctionne pas. Je voudrai éviter de
mettre




une
pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en
+.





Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo +
vbQuestion,


"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export
fichier2




For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import
fichier1





Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import
fichier2





Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com











Avatar
John Fuss
Finalement je suis revenu sur ce post, ma pause n'a tenu qu'un temps, la
solution que j'ai usité est la 2ème : celle où l'on supprime le code des
modules que je rempli avec le code du même module de ThisWorkbook.

Merci encore.

ça à l'air de marcher très bien et plus vite en plus.

John

"Michel Gaboly" a écrit dans le message de
news:
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que tu
cherches,

mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de feuille)
contenant

le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option
Explicit

' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le classeur
actif :


Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les
modules

' de feuille et le module ThisWorkbook, 3 pr les modules de
UserForm)

If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule

' Le DeleteLines sert à éviter éviter d'avoir 2
fois Option Explicit

' si la déclaration explicite est cochée dans les
préférences

.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je
mets à


jour un module et un module de classe (Mod_JMO & cAccesFile). Le but
est de


supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1
et


cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les
techniques


que je peux utiliser pour laisser le temps à VBE de supprimer les
éléments


pour que les noms soient dispo lors de l'import et éviter l'apparition
du


'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes
les


macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre
une


pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo +
vbQuestion,


"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Michel Gaboly
De rien, John ;-))

C'est un truc que j'ai développé en 1999, pour mettre à jour une
appli chez un client. Autant que cela serve.


Finalement je suis revenu sur ce post, ma pause n'a tenu qu'un temps, la
solution que j'ai usité est la 2ème : celle où l'on supprime le code des
modules que je rempli avec le code du même module de ThisWorkbook.

Merci encore.

ça à l'air de marcher très bien et plus vite en plus.

John

"Michel Gaboly" a écrit dans le message de
news:
Re,

2 idées :

1 - Dans le Workbook_Open, utiliser une gestion d'errerur et renommer
les 2 VbComponents concernés.


2 - Modifier la technique de mise à jour, en conservant les modules
existants, mais en en remplaçant le code, en utilisant la propriété
CountOfLines et les méthodes DeleteLines et AddFromString.

Tu peux t'inspirer de ces exemples. Il ne font pas exactement ce que tu
cherches,

mais je te fais confiance pour adapter ;-))

Pour transférer un module d'un classeur vers le classeur actif :

Nb - Il faut que le module (un module standard, pas un module de feuille)
contenant

le code à récupérer ait été nommé "MSource"

Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module (lu dans CE CLASSEUR)
With ThisWorkbook.VBProject.VBComponents("MSource").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option
Explicit

' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub


Pour transférer tous les modules standards d'un classeur vers le classeur
actif :


Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les
modules

' de feuille et le module ThisWorkbook, 3 pr les modules de
UserForm)

If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM > ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With
ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule

' Le DeleteLines sert à éviter éviter d'avoir 2
fois Option Explicit

' si la déclaration explicite est cochée dans les
préférences

.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub



Bonjour à tous,

j'utilise le code n°1 en fin de post pour mettre à jour mes macros
complémentaires par rapport à ma macro complémentaire principale. Je
mets à


jour un module et un module de classe (Mod_JMO & cAccesFile). Le but
est de


supprimer ces éléments dans toutes les macros complémentaires sauf la
principale (MacroJMO) et d'importer ces éléments qui ont été exporter de
MacroJMO.

Quand ma fonction a fini de s'executer je me retrouve avec des Mod_JMO1
et


cAccesFile1 à la place de Mod_JMO & cAccesFile. Quels sont les
techniques


que je peux utiliser pour laisser le temps à VBE de supprimer les
éléments


pour que les noms soient dispo lors de l'import et éviter l'apparition
du


'1'.

J'ai testé de mettre une fonction SaveAllProjects qui sauvegarde toutes
les


macros complémentaires ça ne fonctionne pas. Je voudrai éviter de mettre
une


pause parec que j'ai 15 macros à mettre à jour et j'en aurai de + en +.

Merci d'avance.

John

Code 1 :

Public Function MAJ_Mod_JMO()
Dim i As Integer, fichier1 As String, fichier2 As String
On Error Resume Next

If MsgBox("Lancer la mise à jour des macros ?", vbYesNo +
vbQuestion,


"Validation") = vbNo Then Exit Function
fichier1 = MakeFileName(GetTempDir, "Mod_JMO.bas")
fichier2 = MakeFileName(GetTempDir, "cAccesFile.bas")
ThisWorkbook.VBProject.VBComponents("Mod_JMO").Export fichier1
ThisWorkbook.VBProject.VBComponents("cAccesFile").Export fichier2
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("Mod_JMO")
Application.VBE.VBProjects(i).VBComponents.Remove
Application.VBE.VBProjects(i).VBComponents("cAccesFile")

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
' SaveAllProjects
For i = 1 To Application.VBE.VBProjects.Count
If Application.VBE.VBProjects(i).name <>
GetFileInfo(ThisWorkbook.name, Nom) And
Application.VBE.VBProjects(i).name


<> "VBAProject" Then
Application.VBE.VBProjects(i).VBComponents.Import fichier1

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
Application.VBE.VBProjects(i).VBComponents.Import fichier2

Workbooks(GetFileInfo(Application.VBE.VBProjects(i).FileName,


NomComplet)).Save
End If
Next
Kill fichier1
Kill fichier2
' SaveAllProjects
End Function


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com