bonjour,
j'ai créé une macro qui va chercher une feuille xls sur un serveur et la copie dans ma feuille xls active. sa fonctionne très bien, sauf que des fois l'adresse du serveur change, sa n'arrive pas souvent mais sa arrive. quand c'est moi qui suis là je remet à jour la nouvelle adresse du serveur mais mes collègues ne savent pas comment faire.
je voudrais créé une macro qui va changer, quand je la solicite via un bouton par exemple, l'adresse du serveur dans la macro d'origine.
voilà un morçeau de mon code:
Workbooks.Open Filename:="\\Mrf67-tw\Externe_MF67\Resultat\" & gmao & ".slk"
j'aimerais que la macro, via un userform, change uniquement "\\Mrf67-tw\Externe_MF67\Resultat\".
merci d'avance
Sur la feuille 1 en A2 tu as ton adresse actuelle.
Click sur GO, un Userform s'ouvre avec 2 textbox. Le 1er rempli avec ton adresse en A2 et le deuxième où tu entres la nouvelle adresse. (attention l'adresse avec les " au début et à la fin)
Click sur le bouton Modifier, la nouvelle adresse remplacera l'ancienne dans la macro du module 1 "Ma_Macro", et se placera en A2.
Pour que cela fonctionne il faut activer la référence suivante :
"Microsoft Visual Basic For Application Extensibility 5.3" dans le menu VBA Outils/Références.
Ensuite tu adaptes cette ligne en remplaçant le nom du Module si nécessaire. (par le n° du Module où ce trouve ta macro, où par le nom du Module si tu l'as modifé)
Code:
Set VBComp = ActiveWorkbook.VBProject.VBComponents("[SIZE=3][COLOR=Blue]Module1[/COLOR][/SIZE]")
merci.
on m'a aidé à trouvé une solution. je remplace l'adresse du serveur par une variable que je rend public. ensuite j'ai crée une macro qui change cette variable par ma nouvelle adresse. j'execute cette macro via un bouton sur ma feuille active.
mais ta solution m'intrigue je vais la tester. merci
Le bouton GO se trouve sur la feuille 1 du fichier.
La ligne de code à adapter et non pas à créer se trouve dans le code du bouton "Modifier" sur l'userform. (ouvre VBA, affiche l'userform et double click sur le bouton "Modifier", tu auras le code)
Dans l'exemple du fichier, la macro qui est à modifier se nomme Ma_Macro et se trouve dans le Module1. Dans ton fichier la macro qui contient l'adresse du serveur à changer se trouve elle aussi dans un module. C'est le nom de ce module qui doit être inscrit dans la ligne de code à la place de Module1. (Si nécessaire bien sur) Ca peut-être Module2 ou 3 ou 4 .../... ou bien le nom que tu as donné à ce module si tu l'a modifié.
N'oublie pas d'activer la référence citée dans mon précédant message.
bonjour bqtr,
j'ai adapté ton programme sur mon fichier et sa fonctionne très bien.
malheureusement je n'arrive pas à comprendre ton code. si tu veu bien et quand tu auras le temps pourrais tu mettre un commentaire à côté de tes lignes de codes. merci d'avance
Quand tu as ouvert VBA, dans la fenêtre de Projet- VBAProject ( CTRL+R) en haut à gauche, tu as ton projet VBA (VBAProject(NomDeTonFichier)).
Il se compose de composants : Les Feuilles, Le Thisworkbook, Les Userforms si il y en a et les Modules de code standard ou de classe (qui comprennent les macros).
Tous ces composants (collection) sont renvoyés par la proprièté VBComponents.
Dans ton cas, tu dois modifier une macro qui se trouve dans un module de code standard. Il faut donc définir ce module (ou composant).
On déclare la variable VBComp comme composant: Dim VBComp As VBComponent (sans le "s" à la fin de VBComponents, car il s'agit d'un composant particulier et non de la collection des composants)
On définit le composant: ici le Module1 Set VBComp = ActiveWorkbook.VBProject.VBComponents("Module1")
Ensuite avec ce composant (Module1) on boucle sur toutes les lignes de code qu'il contient. With VBComp
For i = 1 To .CodeModule.CountOfLines
La variable "Recherche" prend la valeur de la ligne listée. Recherche = .CodeModule.Lines(i, 1)
On remplace dans cette ligne les anciennes valeurs par les nouvelles si nécessaire , et la valeur de "Recherche" change ou pas suivant le cas. Recherche = Replace(Recherche, Anciene_Adresse, Nouvelle_Adresse)
Ici on remplace physiquement la ligne de code dans la macro par la nouvelle en fonction de la valeur de "Recherche" .CodeModule.ReplaceLine i, Recherche
Fin de la boucle Next
End With
Voilà, je pense que le reste du code ne doit pas te poser de problème.
ah!!! je me torturais l'espris car je comprenais pas comment tu arrivais à chager juste la ligne va bien. mais avec ton exmplixation j'ai compris. enfin je pense. tout ce joue avec cette ligne:Recherche = Replace(Recherche, Anciene_Adresse, Nouvelle_Adresse)
donc, on va listé toute les lignes et lorsque la valeur de "recherche" est égale à "ancienne_adresse" on la remplace par "nouvelle_adresse". tu es tout à fait géniale.
ps: rectifi moi si je me trompe dans la compréhension. merci pour tout
La macro liste bien toutes les linges de code du Module1.
La variable Recherche va prendre successivement 2 valeurs:
Chaque ligne de code du Module1 va être ré-écrite
Valeur 1 : La ligne(i) de code
Valeur 2 : On applique un traitement à la variable Recherche. On utilise la fonction Replace. Cette fonction permet de remplacer une partie d'une chaine de caractères par une autre. Elle a 3 arguments dans le cas présent.
Argument 1 : la chaine de caractères à traiter, ici la valeur de Recherche.
Argument 2 : la valeur à remplacer, ici la variable Anciene_Adresse
Argument 3 : la valeur de remplacement, ici la variable Nouvelle_Adresse
Si l'argument 2 est présent dans la variable Recherche le remplacement se fait. Sinon la variable Recherche prend comme valeur sa valeur d'origine.
Donc dans notre cas, la variable Recherche n'est jamais égale à la variable Ancien_Adresse, cette dernière est au mieux une sous_chaine de la variable Recherche.
Enfin la ligne(i) est ré-écrite avec la dernière instruction.
C'est pas toujours évident d'expliquer le déroulement d'une macro, donc modifie la comme ceci, je pense que tu comprendras plus facilement le principe.
Code:
Set VBComp = ActiveWorkbook.VBProject.VBComponents("Module1")
With VBComp
For i = 1 To .CodeModule.CountOfLines
Recherche = .CodeModule.Lines(i, 1)
MsgBox "Valeur à modifier ligne " & i & " : " & Recherche
Recherche = Replace(Recherche, Anciene_Adresse, Nouvelle_Adresse)
MsgBox "Valeur après la modif ligne " & i & " : " & Recherche
.CodeModule.ReplaceLine i, Recherche
Next
End With
Si j'ai bien compris, pour moi ce n'est pas un problème de "référence" mais option au niveau de la sécurité. Dans la barre de menu Excel => Outils => Macro => sécurité => onglet "éditeurs approuvés, il faut cocher la case "faire confiance au projet visual basic".