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 FunctionLa 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 subquand 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 subIl 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 theFilesIl 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 theFilesJe 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 FunctionIl 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" '<<< xlsPar 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 subLe 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.