VBA chemin d'accès à un fichier partagé Mac Windows

Maryloo547

Membre enregistré
21 Novembre 2016
4
0
41
Bonjour,

Nous avons un fichier excel qui contient une macro pour mettre des informations à jour à partir d'un autre fichier Excel stocké sur une Google Drive.
Nous sommes plusieurs utilisateurs avec différentes plateformes (Mac et Windows) à l'utiliser.

La macro sait déjà faire le distinguo entre un Mac et un PC par contre, pour le mac, le chemin d'accès avait été créé que pour le premier utilisateur et donc avec son nom de répertoire de démarrage.
Je cherche vainement à rendre le chemin d'accès pour mac universel en fonction du nom des utilisateurs.

Voici la macro actuelle :

Sub test()
Dim chemin As String
Dim cc As String
cc = ActiveWorkbook.Name

If Application.PathSeparator = ":" Then
Workbooks(cc).Worksheets("base de donnee").Cells.ClearContents
Workbooks.Open Filename:="Macintosh HD:Users:Noel:Google Drive:04_Projets" & Application.PathSeparator & "01_Base de donnee" & Application.PathSeparator & "Base.xlsx"
Workbooks("Base.xlsx").Worksheets("base").Cells.Copy _
Workbooks(cc).Worksheets("base de donnee").Range("A1")
Workbooks(cc).Worksheets("Listes").Cells.ClearContents
Workbooks("Base.xlsx").Worksheets("Liste").Cells.Copy
Workbooks(cc).Worksheets("Listes").Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Workbooks("Base.xlsx").Close False
Workbooks(cc).Worksheets("Pge garde").Activate



Else

chemin = Environ("USERPROFILE")

Workbooks(cc).Worksheets("base de donnee").Cells.ClearContents
Workbooks.Open Filename:=chemin & Application.PathSeparator & "Google Drive\04_Projets\01_Base de donnee" & Application.PathSeparator & "Base.xlsx"
Workbooks("Base.xlsx").Worksheets("base").Cells.Copy _
Workbooks(cc).Worksheets("base de donnee").Range("A1")

Workbooks(cc).Worksheets("Listes").Cells.ClearContents
Workbooks("Base.xlsx").Worksheets("Liste").Cells.Copy
Workbooks(cc).Worksheets("Listes").Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

Workbooks("Base.xlsx").Close False

Workbooks(cc).Worksheets("Pge garde").Activate
End If

End Sub


Merci d'avance pour votre aide
 
Essaie de remplacer Macintosh HD:Users:Noel par juste le signe tilde ~ qui désigne le dossier Home de l'utilisateur.
 
Essaie de remplacer Macintosh HD:Users:Noel par juste le signe tilde ~ qui désigne le dossier Home de l'utilisateur.
Non. Lorsqu'on utilise le séparateur ":", on ne peut pas utiliser la tilde. Mais dans Excel 2016, on peut utiliser les chemins en POSIX (et donc utiliser la tilde). Si ça doit rester compatible avec une version 2011, il vaut mieux mettre une petite boucle AppleScript pour récupérer le nom du compte utilisateur.

Ceci dit, si les chemins sont écrits en partie "en dur", je ne vois pas l'intérêt d'intercaler la constante Application.PathSeparator en plein milieu. Tant qu'à faire, autant tout mettre en dur. Et il ne semble pas utile d'avoir autant de code en double (sauf erreur, il n'y a que le chemin d'accès qui diffère). Si j'ai un peu de temps ce soir, je regarde pour optimiser ça (avec un peu de compilation conditionnelle, pour faire chic).
 
  • J’aime
Réactions: Maryloo547
Alors, voilà une version revue (et en principe fonctionnelle) de ta macro :

Bloc de code:
Sub test()
Application.ScreenUpdating = False       ' pour éviter les effets visuels
Dim chemin As String
Dim cc As String
Dim sep As String
cc = ActiveWorkbook.Name
sep = Application.PathSeparator

    #If Mac Then        '  le signe dièse indique qu'on demande une compilation conditionnelle
        If Val(Application.Version) >= 15 Then    ' petit test juste pour préparer l'avenir...
            MsgBox "Excel 2016 : il revoir la macro"
            Exit Sub
        End If
    chemin = MacScript("tell application ""Finder"" to  get home as Unicode text") & "Google Drive:04_Projets:01_Base de donnee" & sep

    #Else
        chemin = Environ("USERPROFILE") & "\Google Drive\04_Projets\01_Base de donnee" & sep
       
    #End If
   
        Workbooks(cc).Worksheets("base de donnee").Cells.ClearContents
        Workbooks.Open Filename:=chemin & "Base.xlsx"
        Workbooks("Base.xlsx").Worksheets("base").Cells.Copy _
        Workbooks(cc).Worksheets("base de donnee").Range("A1")
        Workbooks(cc).Worksheets("Listes").Cells.ClearContents
        Workbooks("Base.xlsx").Worksheets("Liste").Cells.Copy
        Workbooks(cc).Worksheets("Listes").Range("A1").PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        Workbooks("Base.xlsx").Close False
        Workbooks(cc).Worksheets("Pge garde").Activate

Application.ScreenUpdating = True
End Sub

A priori, chez moi ça fonctionne avec Excel 2011 et Excel 2016 sous Windows...
 
Merci beaucoup pour ta réponse si rapide.

J'ai testé, et j'ai ce message d'erreur : "Erreur d'exécution 438 - Propriété ou méthode non géré par cet objet" (voir photo jointe)

Dans le débugger, il bloque sur la ligne :
Workbooks(cc).Worksheets("base de donnee").Range ("A1")

Une idée ?
 

Fichiers joints

  • Capture d’écran 2016-11-21 à 19.31.07.png
    Capture d’écran 2016-11-21 à 19.31.07.png
    21,4 KB · Affichages: 216
C'est une ligne à laquelle je n'ai pas touché. Est-ce que tu as bien une feuille nommée "base de donnee" (au singulier, bizarrement) dans le classeur référencé "cc" ?

Sinon, ça peut aussi être un artefact lié à la copie depuis la page internet : la ligne précédente se termine par un undescore, ce qui signifie qu'elle est directement enchaînée avec la ligne suivante. En gros, ces deux lignes n'en font qu'une. Mais lorsque ça passe par des serveurs internet, il arrive assez souvent que ce soit quand même interprété comme deux lignes. Tu peux donc remplacer les deux lignes par :
Workbooks("Base.xlsx").Worksheets("base").Cells.Copy Workbooks(cc).Worksheets("base de donnee").Range("A1")
Logiquement, ça devrait corriger le problème...
 
Super Merci beaucoup !

J'ai en effet repris le programme d'origine et j'ai juste modifié le chemin d'accès au fichier et épuré le programme comme tu l'as fait et ça marche ! Dans le copier / coller du code écrit dans ton 2ème message, il y a eu quelques bugs qui ont fait que ça n'a pas marché du 1er coup.

J'ai testé sur 2 mac et un PC, ça fonctionne sans problème.

Encore Merci pour ta dispo, tes tests et tes conseils !
Bonne journée !