Getopenfilename sur MAC - Fichiers Excel grisés

Bonsoir,

J'ai enregistré la macro suivante directement issue du site de microsoft pour adapter la fonction getopenfilename pour MAC:

Sub Select_File_Or_Files_Mac()
            Dim MyPath As String
            Dim MyScript As String
            Dim MyFiles As String
            Dim MySplit As Variant
            Dim N As Long
            Dim Fname As String
            Dim mybook As Workbook

            On Error Resume Next
            MyPath = MacScript("return (path to documents folder) as String")
            'Or use MyPath = "Macintosh HD:Users:Ron:Desktop:TestFolder:"

            ' In the following statement, change true to false in the line "multiple 
            ' selections allowed true" if you do not want to be able to select more 
            ' than one file. Additionally, if you want to filter for multiple files, change 
            ' {""com.microsoft.Excel.xls""} to 
            ' {""com.microsoft.excel.xls"",""public.comma-separated-values-text""}
            ' if you want to filter on xls and csv files, for example.
            MyScript = _
            "set applescript's text item delimiters to "","" " & vbNewLine & _
                       "set theFiles to (choose file of type " & _
                     " {""com.microsoft.Excel.xls""} " & _
                       "with prompt ""Please select a file or files"" default location alias """ & _
                       MyPath & """ multiple selections allowed true) as string" & vbNewLine & _
                       "set applescript's text item delimiters to """" " & vbNewLine & _
                       "return theFiles"

            MyFiles = MacScript(MyScript)
            On Error GoTo 0

            If MyFiles <> "" Then
                With Application
                    .ScreenUpdating = False
                    .EnableEvents = False
                End With

                MySplit = Split(MyFiles, ",")
                For N = LBound(MySplit) To UBound(MySplit)

                    ' Get the file name only and test to see if it is open.
                    Fname = Right(MySplit(N), Len(MySplit(N)) - InStrRev(MySplit(N), Application.PathSeparator, , 1))
                    If bIsBookOpen(Fname) = False Then

                        Set mybook = Nothing
                        On Error Resume Next
                        Set mybook = Workbooks.Open(MySplit(N))
                        On Error GoTo 0

                        If Not mybook Is Nothing Then
                            MsgBox "You open this file : " & MySplit(N) & vbNewLine & _
                                   "And after you press OK it will be closed" & vbNewLine & _
                                   "without saving, replace this line with your own code."
                            mybook.Close SaveChanges:=False
                        End If
                    Else
                        MsgBox "We skipped this file : " & MySplit(N) & " because it Is already open."
                    End If
                Next N
                With Application
                    .ScreenUpdating = True
                    .EnableEvents = True
                End With
            End If
        End Sub

        Function bIsBookOpen(ByRef szBookName As String) As Boolean
        ' Contributed by Rob Bovey
            On Error Resume Next
            bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
        End Function

La fenêtre pour insérer les fichiers fonctionne très bien, en revanche, tous les fichiers excel ou non sont grisés. Impossible d'en insérer un seul, peu importe l'emplacement ou se trouve le fichier (bureau, documents, one drive...).

Quelqu'un pourrait-il m'indiquer la raison pour laquelle les fichiers apparaissent grisés?

Merci d'avance pour votre aide & Bonne soirée à vous.

Bonjour,

Je ne suis pas sûr mais j'avais lu que Macscript n'était plus compatible avec les nouveaux mac. Il faudrait désormais appeler le fichier contenant le code applescript : https://docs.microsoft.com/fr-fr/office/vba/office-mac/applescripttask

Mais vous avez essayé :

sub test()
path = application.getopenfilename()
end sub

quand même ?

Cdlt,

Bonjour,

Merci pour votre réponse.

Le code que vous proposez affiche bien les documents non grisés, mais une fois sélectionnés, ils ne sont ni ouverts ni copiés dans mon fichier excel comme nouvel onglet.

Je vais essayer de creuser avec l'article que vous m'avez partagé, et voir si je peux updater/corriger le code de microsoft avec les nouvelles évolutions de langage.

Mais j'ai peu d'espoir... Cette compatibilité Mac/PC est vraiment un casse tête

Merci encore & très bonne journée à vous.

Bonjour,

Le lien que j'ai posté explique que sur les nouvelles versions, il faut coder les commandes Mac en créant des fichiers grâce à l'éditeur applescript (en langage applescript) et les exécuter via la fonction AppleScriptTask, au lieu d'exécuter le script, saisi directement sur VBA, à l'aide de la fonction MacScript, si j'ai bien compris...

Et c'est normal qu'il ne se passe rien puisque la méthode getopenfilename renvoie une chaine de caractères. Le réel problème sur mac, c'est que la sélection multiple n'est pas possible a priori.

Voici un essai avec un seul fichier sélectionné :

sub test()
path = application.getopenfilename()
if path = false then exit sub
with workbooks.open(path)
    msgbox .sheets(1).name
    '.close false
end with
end sub

Il faudra peut-être utiliser la fonction GrantAccessToMultipleFiles également. https://docs.microsoft.com/fr-fr/office/vba/office-mac/grantaccesstomultiplefiles

Mais sinon, si les fichiers à ouvrir se trouvent dans le même dossier et s'ils contiennent un mot-clé commun, il est possible de se passer de la boite de dialogue en utilisant la fonction Dir.

Cdlt,

Bonjour

je pense que votre code vient de ce lien --> https://www.macexcel.com/examples/filesandfolders/selectfiles/

Dans ce lien toutefois le code est plus complet que celui que vous postez. Peut être essayer en prenant le code complet car dans la partie 'This is mac excel 2016 and Higher" il me semble qu'il vous manque la partie :

MyScript = _
"set theFiles to (choose file ....

Cordialement

Re,

Au cas où, j'ai testé ce code sur AppleScript et il fonctionne :

*** code applescript (testé fonctionnel)

set AppleScript's text item delimiters to ","
set myprompt to "Sélectionnez un ou plusieurs fichiers"
set mypath to "Macintosh HD:Users:XXXXX:Downloads:"
set theFiles to (choose file with prompt myprompt default location alias mypath with multiple selections allowed) as string
return theFiles

Il ne fonctionne pas avec le filtre cependant donc je l'ai enlevé car les fichiers sont grisés... (ancien code)

set AppleScript's text item delimiters to ","
set myfilter to "com.microsoft.Excel.xls"
set myprompt to "Sélectionnez un ou plusieurs fichiers"
set mypath to "Macintosh HD:Users:XXXXX:Downloads:"
set theFiles to (choose file of type {myfilter} with prompt myprompt default location alias mypath with multiple selections allowed) as string
set AppleScript's text item delimiters to ""
return theFiles

Je n'ai pas la fonction applescripttask sur ma version donc je ne peux pas voir le résultat renvoyé ensuite sur VBA mais j'ai enlevé l'avant dernière ligne (du second code) pour obtenir une chaine de caractères avec un "," comme séparateur...

Il faut adapter les séparateurs système qui sont peut-être "/" et non ":" sur votre mac et bien sûr le chemin par défaut souhaité.

Il faut donc chercher l'éditeur Applescript, copier le code dedans, enregistrer le fichier puis l'exécuter depuis VBA en suivant les instructions du lien posté précédemment sur Applescripttask.

Cdlt,

@3GB

Il faut adapter les séparateurs système qui sont peut-être "/" et non ":" sur votre mac et bien sûr le chemin par défaut souhaité.

Effectivement à coup sûr si son OS est au moins HIGH SIERRA et sans MACINSTOSH HD :

Merci à tous les deux pour vos inputs.

Je viens juste de voir vos réponses. Génial

J'essaie tout ça dès demain matin et vous tiens au courant.

Merci encore vraiment pour vos éclairages, ça me retire une épine du pied d'échanger sur un thème que je ne maîtrise pas. Super enrichissant en plus.

Bonne soirée à vous.

De rien !

Je me suis inspiré du lien de Dan pour personnaliser la fonction de Ron de Bruin. Elle marche sur Mac 2011 mais peut-être pas sur 2016 en multiselect...

En tout cas, le blocage (fichiers grisés) résidait dans le type de format défini qui correspondait aux fichiers "xls" et non "xlsx".

Je poste ici en attendant d'éventuelles améliorations :

Function MacFilePicker(Optional FileFilter As String, _
                       Optional Title As String = "Sélectionnez un ou plusieurs fichiers", _
                       Optional DefautPath as String = "Macintosh HD:Users:", _
                       Optional Multiselect As Boolean = True)

TypeFormat = FileFormat(FileFilter)
If Not TypeFormat = "" Then TypeFormat = """" & TypeFormat & """"
Title = """" & IIf(Multiselect, Title, Replace(Title, "ou plusieurs fichiers", "fichier")) & IIf(FileFilter = "", "", " ." & FileFilter) & """"
DefautPath = """" & DefautPath & """"
ligne1 = "set applescript's text item delimiters to "","" "
ligne2 = IIf(TypeFormat = "", "", "set myfilter to " & TypeFormat)
ligne3 = "set theFiles to (choose file " & IIf(TypeFormat = "", "", "of type {" & TypeFormat & "}") & " with prompt " & Title & _
" default location alias " & DefautPath$ & " multiple selections allowed " & Multiselect & ") as string"
ligne4 = "return theFiles"
MyScript = Join(Array(ligne1, ligne2, ligne3, ligne4), vbNewLine)
On Error Resume Next
tfiles = Split(MacScript(MyScript), ",")
If Err > 0 Then Exit Function
MacFilePicker = tfiles
End Function

Function MacFolderPicker(Optional Title As String = "Sélectionnez un ou plusieurs dossiers", _
                         Optional DefautPath as String = "Macintosh HD:Users:", _
                         Optional Multiselect As Boolean = True)
Title = """" & IIf(Multiselect, Title, Replace(Title, "ou plusieurs dossiers", "dossier")) & """"
DefautPath = """" & DefautPath & """"
ligne1 = "set applescript's text item delimiters to "","" "
ligne2 = "set theFolders to (choose folder with prompt " & Title & " default location alias " & DefautPath$ & " multiple selections allowed " & Multiselect & ") as string"
ligne3 = "return theFolders"
MyScript = Join(Array(ligne1, ligne2, ligne3), vbNewLine)
On Error Resume Next
tfolders = Split(MacScript(MyScript), ",")
If Err > 0 Then Exit Function
MacFolderPicker = tfolders
End Function

Function FileFormat(FileFilter$) As String
tExt = Split("xls, xlsx, xlsm, xlsb, csv, doc, docx, docm, ppt, pptx, pptm, txt, pdf, jpg, png, QIF, htm", ", ")
tformats = Split("com.microsoft.Excel.xls, org.openxmlformats.spreadsheetml.sheet, " & _
"org.openxmlformats.spreadsheetml.sheet.macroenabled, com.microsoft.Excel.sheet.binary.macroenabled, " & _
"public.comma-separated-values-text, com.microsoft.word.doc, org.openxmlformats.wordprocessingml.document, " & _
"org.openxmlformats.wordprocessingml.document.macroenabled, com.microsoft.powerpoint.ppt, " & _
"org.openxmlformats.presentationml.presentation, org.openxmlformats.presentationml.presentation.macroenabled, " & _
"public.plain-text, com.adobe.pdf, public.jpeg, public.png, com.apple.traditional-mac-plain-text, public.html", ", ")
For i = LBound(tExt) To UBound(tExt)
    If tExt(i) = FileFilter Then FileFormat = tformats(i)
Next i
End Function

Il faut adapter la valeur de l'argument DefautPath pour qu'il coïncide à ta version.

Il y a une fonction de sélection de dossiers et une fonction de sélection de fichiers qui (pour l'utilisation simplifiée de filtres) appelle une fonction de conversion de mots clés (extension) en filtres reconnus par Applescript. A noter qu'il ne peut y avoir qu'un filtre...

Exemple : "xlsx" saisi en 1er argument (FileFilter) renvoie

"org.openxmlformats.spreadsheetml.sheet"

qui aurait peut être fonctionné à la place de

"com.microsoft.Excel.xls" '<<< xls

Par défaut, la fonction est en multiselect.

Elle renvoie vide s'il y a une erreur ou une annulation, une chaine avec le chemin du fichier en cas de monosélection, un tableau avec les chemins en cas de multisélection.

Elle est à utiliser ainsi :

Sub test()
dim path as variant
path = MacFilePicker(FileFilter:="xlsx") 'pour filtrer par exemple
if isempty(path) then msgbox "aucune sélection": exit sub
for each elem in path
    with workbooks.open(elem)
        msgbox .sheets(1).name 'remplacer par vrai code
        .close false
    end with
next elem
end sub

Le fonctionnement est similaire mais plus simple pour la sélection de dossiers.

Cdlt,

Bonjour,

Désolée, je n'ai finalement pas eu le temps cette semaine de me pencher de nouveau sur le sujet.

Je le fais ce week-end et vous tiens au courant du bon fonctionnement de vos codes. Il faut aussi que je digère tout ce vocabulaire d'experts

Merci encore!

Bon week-end.

Rechercher des sujets similaires à "getopenfilename mac fichiers grises"