Problème chemin macro
Bonjour à tous,
j'ai un problème pour trouver le bon chemin macro, avec des fichiers qui se trouvent dans 3 dossiers différents.
le fichier COM est le dossier 1
le fichier mmg raport tbs - base est le dossier 2
le fichier mmg raport tbs - dg est le dossier 3
lorsque je change la date du fichier mmg raport tbs - dg (dossier3), la macro doit agir sur le fichier mmg raport tbs - base (dossier2), mais la macro indique que le chemin est incorect.
Merci pour votre aide
Bonjour,
Vous pensez que l'on va pouvoir trouver une erreur de "sous-répertoire" ? nous n'avons pas la configuration des enregistrements de vos fichiers.
Vous utilisez pour indiquer le chemin : Thisworkbook.path .... ( chemin actuel du fichier ouvert ) cela veut dire que si fichier dossier 3 ouvert et que vous indiquer ensuite un autre nom de répertoire alors :
dans votre exemple : le Dossier 2 ce trouve dans un sous répertoire du dossier 3
si les trois fichier utilisent des chemin différents alors indiquez le chemin intégrale : "C:\users\mesdocuments\ ............
Bonjour,
Voici une fonction afin de tester vos chemins et voir à partir d'où ils cafouillent :
'AVANT TOUT : ajouter la référence Microsoft Scripting Runtime !!!
Function TesterChaqueRepertoire(Chemin$) As Boolean
Dim fso As FileSystemObject
Dim Rep$
Dim Doss
Set fso = New FileSystemObject 'nouvel object file system
Rep = Chemin 'Rep vaut chemin
Doss = Split(Rep, "\") 'Dossier est un tableau de tous les dossiers
If Not LecteurExiste(Rep) Then 'si le lecteur n'existe pas
Message = Doss(0) & " est introuvable !!!"
Rep = "" 'permettra de renvoyer faux (voir étiquette Fin)
GoTo Fin 'sortie fonction
End If
i = UBound(Doss) 'on commence par le dernier sous-dossier
While i > 0 'tant que i >0
If Not DossierExiste(Rep) Then 'si le chemin n'existe pas
Message = Message & Rep & " n'existe pas !!!" & vbCrLf & vbCrLf 'stocke dans msg
Rep = Replace(Join(Doss, "\"), "\" & Doss(i), "") 'chemin tronque le dernier sous-dossier
Doss = Split(Rep, "\") 'tableau imputé du dernier sous-dossier
i = i - 1 'décrémentation
Else 'sinon
Message = Message & Rep & " est bien un chemin existant !" 'msg ok
GoTo Fin 'sortie
End If
Wend
Fin:
MsgBox Message 'permet de lister chaque inexistence de chemin jusqu'à réussite
If Rep = Chemin Then TesterChaqueRepertoire = True 'ssi rep = chemin, renvoie vrai
End Function
Function DossierExiste(Chemin$) As Boolean 'teste si dossier existe pour le chemin spécifié
Dim fso As FileSystemObject
Set fso = New FileSystemObject
If fso.FolderExists(Chemin) Then DossierExiste = True
End Function
Function LecteurExiste(Chemin$) As Boolean 'teste si lecteur existe pour le chemin spécifié
Dim fso As FileSystemObject
Set fso = New FileSystemObject
If fso.GetDriveName(Chemin) = Split(Chemin, "\")(0) Then LecteurExiste = True
End Function
Il faudra bien ajouter la librairie Microsoft Scripting Runtime via Outils/Références. En espérant que ça vous serve.
Mais comme l'a fait remarquer Xmenpl, le mieux serait de décrire l'arborescence de vos répertoires afin qu'on sache où doit se trouver quoi et qu'on puisse fixer un dénominateur commun et personnaliser le reste du chemin...
Cdlt,
Bonjour à tous,
voilà l'arborescence :
C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\a-mmg \MMG Raport TBS - BASE
C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\formulaire\com
C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\rapport\MMG Raport TBS - DG
merci pour votre aide
Bonjour,
Comme je n'ai pas votre code, je ne sais pas vraiment quoi répondre. Je ferais quelque chose comme ça :
Racine = "C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\"
Select case i
case 1: ssdoss = "a-mmg \MMG Raport TBS - BASE"
case 2: ssdoss = "formulaire\com"
case 3: ssdoss = "MMG Raport TBS - DG"
end select
repertoire = Racine & ssdoss 'éventuellement & "\"
Ici i serait à déterminer en fonction du cas.
Attention car j'ai l'impression que vous manquez de rigueur dans votre façon de nommer les dossiers et fichiers. Ce serait mieux si vous écriviez toujours Rapport avec 2 p, si le dossier "a-mmg " ne contenait pas d'espace, voire même si vous saisissiez chaque nom en majuscule.
Cdlt,
Bonjour,
voilà le code du fichier MMG Raport TBS - DG:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [AT3,AT4:AW4]) Is Nothing Then Exit Sub
Dim etat As Boolean
With Application
.ScreenUpdating = False
.DisplayAlerts = False
etat = .AskToUpdateLinks
.AskToUpdateLinks = False
Workbooks.Open(ThisWorkbook.Path & "\a-mmg\MMG Raport TBS - BASE.xlsm").Close True
.AskToUpdateLinks = etat
End With
ThisWorkbook.Save
End Sub
Bonjour,
N'hésitez pas à utiliser les balises de code pour que ce soit plus lisible
Private Sub Worksheet_Change(ByVal Target As Range)
Dim etat as Boolean
If Intersect(Target, [AT3,AT4:AW4]) Is Nothing Then Exit Sub
With Application
.ScreenUpdating = False
.DisplayAlerts = False
etat = .AskToUpdateLinks
.AskToUpdateLinks = False
Workbooks.Open(ThisWorkbook.Path & "\a-mmg\MMG Raport TBS - BASE.xlsm").Close True 'ici "a-mmg\" sans espace !
.AskToUpdateLinks = True
.DisplayAlerts = True
.ScreenUpdating = True
End With
ThisWorkbook.Save
End Sub
Alors désolé mais pour l'instant je ne comprends toujours pas. Je ne vois pas de condition. Et je me rends compte que je ne sais même pas ce que vous cherchez à faire. Est-ce que l'objectif est bien d'ouvrir un des fichiers sous une condition de valeur de cellule ? Si c'est bien le cas, il faut m'expliquer à partir de quelle feuille de quel classeur s'exécute le code et ce qu'il fait dans quel cas.
Par ailleurs, avez-vous essayé ma fonction TesterChaqueRepertoire au sein de votre code pour sonder votre chemin ?
Cdlt,
Rebonjour,
D'aprés ce que j'ai pu lire des posts et à la vue des noms de fichiers zippés ; j'utiliserai quelques chose comme ceci au début de vos macros
dans les différents fichiers.
' DELCARATION DES VARIABLES
Dim CHEMIN As String
Dim FICHIERbase As Workbook
Dim FICHIERcom As Workbook
Dim FICHIERdg As Workbook
CHEMIN = "C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\"
FICHIERbase = "a-mmg\mmg-raport-tbs-base.xlsm"
FICHIERcom = "formulaire\com.xlsm"
FICHIERdg = "rapport\mmg-raport-tbs-dg.xlsm"
'Ensuite vous pouvez utiliser ces variables pour ouvrir les fichiers exemple :
'ouverture du fichier com.xlsm
Workbooks.Open Filename:=CHEMIN & FICHIERcom
Edit : Bonjour Xmenpl
C'est sur que ça marche moins bien...
Bonjour à tous,
vous allez trop vite pour moi
le fichier COM, dossier 1 est la base de données
le fichier mmg raport tbs - base, dossier 2 est le fichier qui lorsque l'on change "la date du fichier mmg raport tbs - dg, va recalculer les données pour actualiser le fichier mmg raport tbs - dg
Le fichier mmg raport tbs - base, dossier 2, doit toujours fermé, c'est pour cela que la macro dit "ouvrir et fermer"
cette macro fonctionne parfaitement dans le cas ou le le fichier mmg raport tbs - base est dans un sous dossier et que les fichiers COM et mmg raport tbs - dg sont ensemble dans le dossier principal
ce que je cherche a faire, c'est que chaque fichier soit dans 1 sous dossier séparé et que cela fonctionne.
Merci pour votre aide
C'est pas encore tout à fait limpide mais je crois que la dernière proposition de Xmenpl est la bonne, à savoir :
' !!! Dans un module normal, en tête du module
Public racine$
Public FICHIERbase$
Public FICHIERcom$
Public FICHIERdg$
'dans le module thisworkbook
Private sub workbook_open()
racine = "C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\"
FICHIERbase = racine & "a-mmg\mmg-raport-tbs-base.xlsm"
FICHIERcom = racine & "formulaire\com.xlsm"
FICHIERdg = racine & "rapport\mmg-raport-tbs-dg.xlsm"
end sub
'Ensuite vous pouvez utiliser ces variables pour ouvrir les fichiers exemple :
'ouverture du fichier com.xlsm
'dans la procédure worksheet_change
Workbooks.Open(FICHIERcom)
Bonjour à tous,
cette macro fonctionne parfaitement dans le cas ou le le fichier mmg raport tbs - base est dans un sous dossier et que les fichiers COM et mmg raport tbs - dg sont ensemble dans le dossier principal
ce que je cherche a faire, c'est que chaque fichier soit dans 1 sous dossier séparé et que cela fonctionne.
Merci pour votre aide
Puisque votre macro fonctionne ainsi alors :
D'aprés le chemin commun aux fichiers et les 3 répertoires que vous avez écris plus haut : "a-mmg" "formulaire" "rapport"
Votre code + le mien
Private Sub Worksheet_Change(ByVal Target As Range)
'Mon code déclaratif des fichiers chemins de fichiers
Dim CHEMIN As String
Dim FICHIERbase As Workbook
Dim FICHIERcom As Workbook
Dim FICHIERdg As Workbook
CHEMIN = "C:\Users\chris\Desktop\TBS SYSTEM\TBS - TEST YUTR - Copie (2)\"
FICHIERbase = "a-mmg\mmg-raport-tbs-base.xlsm"
FICHIERcom = "formulaire\com.xlsm"
FICHIERdg = "rapport\mmg-raport-tbs-dg.xlsm"
' Votre code actualisé avec les variables
Dim etat As Boolean
If Intersect(Target, [AT3,AT4:AW4]) Is Nothing Then Exit Sub
With Application
.ScreenUpdating = False
.DisplayAlerts = False
etat = .AskToUpdateLinks
.AskToUpdateLinks = False
Workbooks.Open(CHEMIN & FICHIERbase).Close True
.AskToUpdateLinks = True
.DisplayAlerts = True
.ScreenUpdating = True
End With
ThisWorkbook.Save
End Sub
Sous réserve que ce code ne lance pas une autre macro (non modifiéé avec les mêmes variables) dans un autre fichier ?
la macro indique : erreur d'exécution '91'
en jaune : FICHIERbase = "a-mmg\MMG Raport TBS - BASE.xlsm"
Il faut remplacer as workbook par as string sur les 3 lignes...
Un grand merci pour votre aide, ça marche parfaitement. autre question : que faut il rajouter dans la macro si j'ai un mot de passe a l'ouverture des fichiers COM, mmg raport tbs - base et mmg raport tbs - dg?
Macro que j'utilise lorsque j'ai un mot de passe à l'ouverture du fichier MMG Raport TBS - BASE :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [AT3,AT4:AW4]) Is Nothing Then Exit Sub
Dim etat As Boolean
With Application
.ScreenUpdating = False
.DisplayAlerts = False
etat = .AskToUpdateLinks
.AskToUpdateLinks = False
Workbooks.Open(Filename:=ThisWorkbook.Path & "\a-mmg\MMG Raport TBS - BASE.xlsm",Password:="P2020").Close True
.AskToUpdateLinks = etat
End With
ThisWorkbook.Save
End Sub
Encore un grand merci pour votre aide
Bonjour,
Il faut rajouter une variable (si le mdp est commun) ou 3 variables (pour chaque mdp) à côté des noms de fichiers, l'affecter de la même manière et l'appeler dans workbooks.open :
Dim motdepasse$ 'à côté des Dim FichierBase ...
motdepasse = "P2020" 'à côté des FichierBase = "...xlsm"
'puis, appeler ainsi :
Workbooks.Open(Filename:=nomfichieràouvrir,Password:=motdepasse)
Cdlt,
Auriez la bonté de me donner le code Macro complet avec vos modifications, car j'ai du mal a comprendre, merci par avance.
En fait, je sais pas quel est votre code. Si vous me mettez votre code relatif à l'ouverture, je pourrais adapter car je ne sais pas quelle solution vous avez retenu finalement.
Mais c'est assez simple, la ou les variables mdp se déclarent au même endroit que les variables nom de fichier. Elles s'affectent à l'endroit où sont affectées les variables nom de fichier (lignes juste avant ou après ça ne change rien car il n'y a pas de lien) et les variables sont insérées en argument (password:=nomvariablemdp) de workbooks.open