Eric 888
XLDnaute Nouveau
Bonjour
J'ai développé une "mini-appli" Excel pour un suivi de facturation, rapprochements etc.
Le principe:
la macro manipule des fichiers, or l'utilisateur appelle le classeur depuis son disque dur local synchronisé via OneDrive
pour contourner les incohérences entre adresse SharePoint et adresse locale quand le fichier est stocké dans un dossier synchronisé OneDrive, j'ai trouvé une fonction qui marche très bien:
tout ça fonctionne très bien tant qu'on n'a qu'un seul utilisateur et des fichiers stockés en local quoique synchronisés
problème:
merci d'avance pour votre aide
Eric
pour info, le type de manipulation de dossiers / fichiers que j'utilise:
J'ai développé une "mini-appli" Excel pour un suivi de facturation, rapprochements etc.
Le principe:
- l'utilisateur exporte des données de plusieurs sources, au format Excel ou CSV selon le cas, puis colle les fichiers résultant de l'export dans des dossiers dédiés.
- une macro, dans le classeur Excel de suivi de la facturation, parcourt les dossiers dédiés, liste les fichiers exports, et en copie les données dans le tableur de suivi
- une fois les données récupérées et traitées, la macro archive les fichiers exports (je mets un exemple de code utilisé par cette macro en fin de msg)
la macro manipule des fichiers, or l'utilisateur appelle le classeur depuis son disque dur local synchronisé via OneDrive
pour contourner les incohérences entre adresse SharePoint et adresse locale quand le fichier est stocké dans un dossier synchronisé OneDrive, j'ai trouvé une fonction qui marche très bien:
VB:
Public Function GetLocalPath(Path As String, Optional OneDriveName As String) As String
Dim LocalRootOneDrive As String
Dim p As Integer
Dim old_Path As String, new_Path As String
If Len(OneDriveName) = 0 Then OneDriveName = "OneDrive"
If Left(Path, 6) = "https:" Then
LocalRootOneDrive = Environ(OneDriveName) & "\"
p = InStr(1, Path, "/Documents") + 10
old_Path = Left(Path, p)
new_Path = Replace(Replace(Path, old_Path, LocalRootOneDrive), "/", "\")
GetLocalPath = new_Path
Else
GetLocalPath = Path
End If
End Function
tout ça fonctionne très bien tant qu'on n'a qu'un seul utilisateur et des fichiers stockés en local quoique synchronisés
problème:
- il faudrait désormais que plusieurs utilisateurs puissent exploiter le classeur
- l'outil maison pour ce genre de choses est Teams
- j'ai créé une équipe et un canal Teams dédiés
- j'ai dupliqué dans les fichiers partagés du canal Teams les différents dossiers et fichiers de la mini-appli (même arborescence, of course)
- je tourne en rond sans réussir à adapter la fonction pour qu'Excel manipule des fichiers au sein de l'espace de partage du canal Teams
merci d'avance pour votre aide
Eric
pour info, le type de manipulation de dossiers / fichiers que j'utilise:
VB:
'/////////////////////////////////////////////////////////
'////////// BOUCLE POUR LE LISTING DES FICHIERS \\\\\\\\\\
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'Initialisation de la variable
i = 1
'Changement de feuille Excel
Sheets("liste adhesions").Activate
Sheets("liste adhesions").Range("A:A") = ""
'Choix du répertoire dont on veut lister les fichiers
chemin = GetLocalPath(ThisWorkbook.Path) & "\Yapla_adhesions\"
fichier = Dir(chemin)
If fichier = "" Then GoTo alerte Else
'Boucle sur les fichiers du répertoire
Do While Len(fichier) > 0
Range("A" & i).Value = chemin & fichier
i = i + 1
fichier = Dir()
Loop
'/////////////////////////////////////////////
'////////// traitement des fichiers \\\\\\\\\\
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
For j = 1 To (i - 1)
'Selection de la feuille
Sheets("liste adhesions").Activate
'recuperation du lien du fichier à compiler
fichier = Range("A" & j).Value
'Ouverture du fichier
Workbooks.Open Filename:=fichier
'Récupération du nom du fichier et de la dernière ligne avec des données
fichier_a_rajouter = ActiveWorkbook.Name
cell_max_source = ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count
'copie des données
Range("A2:AI" & cell_max_source).Select
Selection.Copy
'Changement de fichier
Windows(fichier_reporting).Activate
'Selection de la feuille
Sheets("données adhesions").Activate
'Recherche de la dernière cellule vide pour coller données ligne suivante
cell_max = Sheets("données adhesions").Range("A" & Rows.Count).End(xlUp).Row
Range("A" & (cell_max + 1)).Select
'Collage des données
ActiveSheet.Paste
'Retour sur le fichier
Workbooks(fichier_a_rajouter).Activate
'Fermeture du fichier
Application.CutCopyMode = False 'on vide le presse-papier pour éviter les messages d'alerte au moment de la fermeture du fichier
ActiveWorkbook.Close SaveChanges:=False 'on n'enregistre pas le fichier: évite de lancer une boucle de synchronisation SharePoint (réapparition du fichier qu'on vient de supprimer, en raison d'une exécution de la macro plus rapide que la synchro)
'Déplacement du fichier traité (on utilise copier supprimer pour pouvoir forcer les opérations)
FSO.CopyFile fichier, chemin & "Fichiers traités\", True
Kill (fichier)
Next j