Diffusion de module dans des classeurs différents
Bonjour à tous,
Je cherche à diffuser des modules dans des fichiers excel, je précise :
- j'ai un fichier de base que je maintiens à jour et sur lequel je modifie des macros pour corriger certaines évolutions,
- j'ai plusieurs fichier que je diffuse sur les autres centres de ma société qui sont alimentés par mes collaborateurs.
Ce que je voudrais : un code VBA qui prendrai le module complet de mon fichier de base pour aller le dupliquer dans tous les fichiers des autres centres.
Etant donné que je peux le faire sur des fichiers différences (prévisions, personnel, stats paie,...) j'ai créé un tableau afin de renseigner les fichiers visés.
j'ai essayé de fouiler partout sur les forums mais sans succés. la seul commande que j'ai trouvé mais qui plante c'est : ActiveWorkbook.VBProject.VBComponents.export ("c:\tintin.bas")
Je m'en remets à vous les experts...
Par avance merci de votre aide
Benoit
voici le début de code que j'ai écrit
Sub mAjour()
Set NOMfichier = ActiveSheet
fichierREF = Range("A2")
cheminREF = Range("B2")
modulerE = Range("C2")
SauvegarD = Range("C5")
FermetuR = Range("D5")
ChDir cheminREF
Workbooks.Open Filename:=cheminREF & "\" & fichierREF
'exportation du module de base
For Each FichierCIBLE In Range("A5:A22")
NOMfichier.Activate
If FichierCIBLE = "" Then
Else
FichierCIBLE.Select
CheminCIBLE = ActiveCell.Offset(, 1)
ChDir CheminCIBLE
Workbooks.Open Filename:=CheminCIBLE & "\" & FichierCIBLE
'importation du module du fichier référence
End If
Next
End Sub
Bonjour,
Perso, je n'ai jamais tenté la chose ...
Mais est-e que tu as lu ce site ? http://www.cpearson.com/excel/vbe.aspx
ric
Bonjour,
J'ai un petit peu perdu de vue ce genre de sport, aussi je vais peut-être en faire pleurer certains mais... mais ils se feront un plaisir de rectifier mes âneries ! Tu as probablement une possibilité beaucoup plus simple :
Séparer le classeur "utilisateur" de son programme qui deviendra en quelque sorte le "perso.xlam" de ce classeur.
La seule macro du classeur "utilisateur" sera de lancer l'activation du programme à l'ouverture et de créer un lien avec ce dernier.
Ainsi tu pourras modifier ton programme simplement en lançant un batch la nuit qui remplacera l'ancien programme , ou au petit matin avant que les utilisateurs ne lancent leur machine... et le classeur de données lui n'est jamais touché.
Hum... Enfin ce que je dis n'est pas tout à fait vrai car il me semble que la xlam ne peut gérer les macros évènementiels des feuilles du classeur appelant. Donc si une évènementielle doit être modifiée il faudra faire appel à l'éditeur VBA depuis la xlam pour modifier ces évènementielles. Bon c'est sportif, avec un peu de soin, si on n'est pas manchot... c'est faisable.
A+
Bonjour,
Ne serait-il pas plus simple de remplacer les fichiers cibles ?
Et de récupérer les données, voire déplacer (pas copier) toutes les anciennes feuilles vers le nouveau fichier
Ne serait-il pas plus simple de remplacer les fichiers cibles ?
Et de récupérer les données, voire déplacer (pas copier) toutes les anciennes feuilles vers le nouveau fichier
Je n'ai pas envisagé la situation avec ce point de vue !
Très intéressant je pense avoir un début de solution (alternative) !
merci
Perso, je n'ai jamais tenté la chose ...
Mais est-e que tu as lu ce site ? http://www.cpearson.com/excel/vbe.aspx
Pas mal ça donne des idées mais il y a du taf
merci pour ton lien
bonjour à tous
ou encore de mettre une image de tous les fichiers dans un fichier d'exploitation des données ?
avec le menu Données /obtenir de fichiers/de classeur
amitiés
Bonjour,
MERCI pour vos réponse.
En effet en arrivant à la manipulation de module je ne rends compte qu'il est temps d'avoir une réflexion sur un SGBD.
Pour le cours terme je suis vais faire comme suit :
- j'ai un fichier de base que je modifie
- J'ouvre un fichier d'un centre (que je sauvegarde) où je prends les feuilles dont j'ai besoin vers le fichier de base
- j'enregistre le fichier de base à la place du fichier du centre
Merci encore à bientôt
ou encore de mettre une image de tous les fichiers dans un fichier d'exploitation des données ?
avec le menu Données /obtenir de fichiers/de classeur
amitiés
aie j'ai vu ta réponse trop tard... en effet ça aurait pu coller mais pas tout à fait :
un gros fichier de base ou je supprime ce dont je n'ai pas besoin et que j'enregistre pour chaque centre.
Le problème est que chaque utilisateur modifie quasiment en temps réel son fichier... donc il faut que je récupère les données (utilisateurs) avant de les mettre à jour (code vba).
merci pour ton aide je pense qu'elle peut m'aider pour d'autres applications.
A+
Bonjour,
J'ai solutionné mon problème :
une barrière était que le ActiveWorkbook.VBProject.VBComponents(modulerE).Export Chemin était bloqué à cause des paramètres de sécurité d'Excel...
j'ai retrouvé un ancien post qui m'a sauvé et j'ai finalement abouti avec le code suivant qui fonctionne très bien :
Set NOMfichier = ActiveSheet
If Range("A2") = "" Or Range("B2") = "" Or Range("C2") = "" Or Range("C5") = "" Or Range("D5") = "" Then
MsgBox ("il manque des données !")
Exit Sub
End If
fichierREF = Range("A2") ' fichier qui sert de référence
cheminREF = Range("B2") ' son emplacement
modulerE = Range("C2")' le nom du module à diffuser
SauvegarD = Range("D5") ' est ce que je sauvegarde avant à la fin du transfert
FermetuR = Range("C5") 'est ce que je ferme le fichier que je viens de mettre à jour
ChDir cheminREF
Workbooks.Open Filename:=cheminREF & "\" & fichierREF
'exportation du module de base
Chemin = "C:\Documents\Archives\" & modulerE & ".bas"
ActiveWorkbook.VBProject.VBComponents(modulerE).Export Chemin
' Application.DisplayAlerts = False
NOMfichier.Activate
For Each FichierCIBLE In Range("A5:A22")
NOMfichier.Activate
If FichierCIBLE = "" Then
Else
FichierCIBLE.Select
CheminCIBLE = ActiveCell.Offset(, 1)
ChDir CheminCIBLE
Workbooks.Open Filename:=CheminCIBLE & "\" & FichierCIBLE
'importation du module du fichier référence
Set Wbk = ActiveWorkbook
'teste si le module est déjà présent dans le classeur ou si un module porte déjà ce nom
On Error Resume Next
Set TestMod = Wbk.VBProject.VBComponents(modulerE)
'si pas d'erreur, le module existe demande alors si on veux le remplacer
'dans la négative, il sera renommé en "MonModule1" ou "MonModule2" etc...
'sinon, le module existant sera supprimé et remplacé par le nouveau
If Err.Number = 0 Then
If MsgBox("Le module '" & modulerE & "' existe déjà dans le classeur '" & Wbk.Name & "' !" _
& vbCrLf _
& vbCrLf _
& "Voulez-vous le remplacer ?", _
vbQuestion + vbYesNo) = vbYes Then
Wbk.VBProject.VBComponents.Remove TestMod
End If
Err.Clear
End If
Wbk.VBProject.VBComponents.Import Chemin 'importe
If SauvegarD = "OUI" Then
If FermetuR = "OUI" Then
Wbk.Close True 'enregistre et ferme
Else
Wbk.Save
End If
End If
End If
Next
Set MonficgierSuppr = CreateObject("Scripting.filesystemobject")
' MonficgierSuppr.deletefile (ThisWorkbook.Path & "\" & "*.bas")
Application.DisplayAlerts = True
End Sub