Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

remplacer/mettre =c3=a0 jour =c3=a0 jour du code VBA depuis un autre classeur

10 réponses
Avatar
Fredo P.
Bonjour
Un classeur Cdmes.xls élaboré par moi même est utilisé par un ami
éloigné. j'y apport quelques améliorations sur le code VBA, cet ami n'y
connaissant pas grand chose en manipulation de module, j'ai eu l'idée de
mettre à jour son classeur à l'aide d'un second classeur qu'il suffirait
d'ouvrir pour mettre à jour le sien, est ce possible, je pense que oui
et existe t'il une telle opération ou quelque exemple.?
--
Fredo P.
http://cdrm4f.jimdo.com

10 réponses

Avatar
Michd
Bonjour,
Place dans un MODULE FEUILLE dans le classeur qui doit mettre l'autre classeur.
Cette procédure supprime tous les modules STANDARD du fichier à mettre à jour et les remplace par
les nouveaux modules du fichier où tu copieras cette procédure. Le code du ThisWorkbook et des
feuilles module n'est pas touché... il en est de même pour les modules de classe si tu en as.
Tu n'as qu'à adapter le chemin du fichier à mettre à jour et son nom dans la procédure.
'-------------------------------------------------------
Sub SupprimeTousLesModulesEtLesRemplace
Dim VBComp As Object, T(), A As Long
Dim VBComps As Object, Elt As Variant
Dim Wk As Workbook, Chemin As String
Dim Fichier As String
'Chemin du fichier à ouvrir pour le mettre à jour
'Le nom du fichier
Chemin = "F:Documents"
Fichier = "Classeur1.xlsm"
'Ouvrir le fichier à mettre à jour
Set Wk = Workbooks.Open(Chemin & Fichier)
Set VBComps = Wk.VBProject.VBComponents
'******Cette section supprime tous les modules
'Standard et tous les modules de classes
For Each VBComp In VBComps
Select Case VBComp.Type
Case 100
Case Else
VBComps.Remove VBComp
End Select
Next VBComp
'Met dans une variable tableau le nom des modules
'du présent classeur
With ThisWorkbook
For Each VBComp In .VBProject.VBComponents
Select Case VBComp.Type
Case 100
Case Else
A = A + 1
ReDim Preserve T(1 To A)
T(A) = VBComp.codemodule.Name
End Select
Next
'Exportation de chaque module
For Each Elt In T
.VBProject.VBComponents(Elt).Export Chemin & Elt & ".bas"
'Exporter le module standard vers le classeur Wk
Wk.VBProject.VBComponents.Import(Chemin & Elt & ".bas").Name = Elt
'Suppprime le fichier
Kill Chemin & Elt & ".bas"
Next
End With
End Sub
'-------------------------------------------------------
MichD
Avatar
Michd
En passant, la procédure traite aussi les "Formulaires" si tu en as dans ton classeur.
MichD
Avatar
Fredo P.
Le 01/09/2018 à 02:16, Michd a écrit :
En passant, la procédure traite aussi les "Formulaires" si tu en as dans
ton classeur.
MichD

Merci MichD
T 1 chef
--
Fredo P.
http://cdrm4f.jimdo.com
Avatar
Fredo P.
Le 01/09/2018 à 08:52, Fredo P. a écrit :
Le 01/09/2018 à 02:16, Michd a écrit :
En passant, la procédure traite aussi les "Formulaires" si tu en as
dans ton classeur.
MichD

Merci MichD
T 1 chef
Et je pense que pour ne pas exporter la routine proposée, un

troisième classeur est nécessaire, Si coquille il y a, mets le pied dessus!
Sub SupprimeTousLesModulesEtLesRemplace
Dim VBComp As Object, T(), A As Long
Dim VBComps As Object, Elt As Variant
Dim Wk As Workbook, Chemin As String
Dim Wk2 As Workbook, Chemin As String
Dim Fichier As String
Dim Fichier2 As String
'Chemin du fichier à ouvrir pour le mettre à jour
'Le nom du fichier
Chemin = "F:Documents"
Fichier = "Classeur1.xlsm"
Fichier2 = "Classeur2.xlsm"
'Ouvrir le fichier à mettre à jour
Set Wk = Workbooks.Open(Chemin & Fichier)
Set Wk2 = Workbooks.Open(Chemin & Fichier2)
Set VBComps = Wk.VBProject.VBComponents
'******Cette section supprime tous les modules
'Standard et tous les modules de classes
For Each VBComp In VBComps
Select Case VBComp.Type
Case 100
Case Else
VBComps.Remove VBComp
End Select
Next VBComp
'Met dans une variable tableau le nom des modules
'du présent classeur
With Workbooks(Fichier2)
For Each VBComp In .VBProject.VBComponents
Select Case VBComp.Type
Case 100
Case Else
A = A + 1
ReDim Preserve T(1 To A)
T(A) = VBComp.codemodule.Name
End Select
Next
'Exportation de chaque module
For Each Elt In T
Wk2.VBProject.VBComponents(Elt).Export Chemin & Elt & ".bas"
'Exporter le module standard vers le classeur Wk
Wk.VBProject.VBComponents.Import(Chemin & Elt & ".bas").Name = Elt
'Suppprime le fichier
Kill Chemin & Elt & ".bas"
Next
End With
End Sub --
Fredo P.
http://cdrm4f.jimdo.com
Avatar
Fredo P.
Le 01/09/2018 à 02:16, Michd a écrit :
En passant, la procédure traite aussi les "Formulaires" si tu en as dans
ton classeur.
MichD

Et modifier/supplémenté la fin:
For Each Elt In T
.VBProject.VBComponents(Elt).Export Chemin & Elt & ".bas"
'Exporter le module standard vers le classeur Wk
Wk.VBProject.VBComponents.Import(Chemin & Elt & ".bas").Name = Elt
'Suppprime le fichier
Kill Chemin & Elt & ".bas"
Next
Wk2.Saved = True
Application.Wk2.ChangeFileAccess xlReadOnly
Kill NomComplet
Application.ActiveWorkbook.Close False
End With
End Sub
--
Fredo P.
http://cdrm4f.jimdo.com
Avatar
Michd
| troisième classeur est nécessaire, Si coquille il y a, mets le pied dessus!
**** Absolument pas. Tu dois placer la procédure dans le module d'une des feuilles du classeur que
tu utilises pour mettre à jour l'autre classeur. Fais comme tu veux!
MichD
Avatar
Michd
Si tu veux enregistrer ton fichier dans la macro,
Remplace ceci par :
'----------------------------------------------
Wk2.Saved = True
Application.Wk2.ChangeFileAccess xlReadOnly
Kill NomComplet
Application.ActiveWorkbook.Close False
'----------------------------------------------
Par :
'----------------------------------------------
Wk2.ChangeFileAccess xlReadOnly
Wk2.Close True
'----------------------------------------------
MichD
Avatar
Fredo P.
Le 01/09/2018 à 13:50, Michd a écrit :
| troisième classeur est nécessaire, Si coquille il y a, mets le pied
dessus!
**** Absolument pas. Tu dois placer la procédure dans le module d'une
des feuilles du classeur que tu utilises pour mettre à jour l'autre
classeur. Fais comme tu veux!
MichD

Mais alors La procédure de mise à jour va aussi être placée dans l'autre
classeur, ce n'est pas un inconvénient ok juste pas utile ou me trompe-je?
--
Fredo P.
http://cdrm4f.jimdo.com
Avatar
Michd
|ce n'est pas un inconvénient ok juste pas utile ou me trompe-je?
À toi de choisir ce qui te convient!
MichD
Avatar
Michd
Correction : Le nom de la variable que j'avais utilisé est : Wk et non Wk2
Par :
'----------------------------------------------
Wk.ChangeFileAccess xlReadOnly
Wk.Close True
'----------------------------------------------
MichD