Vérifier l'existence d'un fichier sous MAC & NAS
Sur MAC & en réseau
- OS X Yosemite v10.10.5
- Excel pour Mac 2011
- Nas SYNOLOGY DS416
Mon objectif : Vérifier si un fichier existe avant de générer un PDF, afin d’éviter les écrasements de fichier.
Bonjour,
Après avoir trainé sur les forums, je me suis rendu compte que les solutions pour MAC n’étaient pas évidentes.
La fonction dir() ne semble pas fonctionner correctement.
Il existe la fonction GetFilesOnMacWithOrWithoutSubfolders, mais je n’arrive pas à l’adapter pour
- faire une simple vérification
- éviter la sélection du dossier (qui prend un temps fou dans mon cas. Je vais plus vite avec la méthode manuelle en créant un PDF, le mettre sur bureau, renommer avec un copier/coller et faire glisser depuis le bureau dans mon dossier)
J’ai donc essayé de contourner le pb en passant par une vérification d’erreur (voir ma macro ci-dessous)
mais passer par cette solution me rends pas très confiante : une erreur peut venir d’un tas de raisons et pas forcément du fait que le fichier n’existe pas ! C’est l’impression que ça donne.
Et puis en mettant mon code dans mon fichier de travail, j’ai rencontré d’autres problèmes :
1e PB : je me suis aperçu que la macro réagissait différemment en fonction de l’emplacement du fichier : ainsi dès que je suis dans un dossier sur le NAS avec un point (c’est le plus courant dans notre arborescence), la macro ne marche plus : la StatusBar bloque sur “Vérification”, mais pas de MsgBox ni de PDF généré (bizarre!), ni de bug.
2e PB : dans un dossier “simple”, mon fichier test fonctionne, mais dès que je remets la macro dans mon fichier de travail, il ne fait que générer des PDF, écrasant systématiquement le précédent. Je me suis rendu compte qu’il s’agissait du Nom qui semble poser pb, Nom généré avec =CONCATENER() du type : “_cat_CLIENT_PROJET_LOT N° OS N°_ENT_ # 000,00 € HT”. J’ai testé en mettant le Nom comme simple chaine de caractères dans mon fichier test, même comportement, la macro génère systématiquement des PDF écrasant le précédent (la vérification ne reconnaît plus le fichier existant).
Je n’ai plus de piste de recherche, alors je m’en remets à une âme charitable.
Pensez-vous que l’on peut adapter cette macro à mon cas?
Merci à tous,
earmeek
Sub A_SavePDF() 'dans module 1
Dim MonFichier As String
MonFichier = ActiveWorkbook.Path & Application.PathSeparator & ActiveSheet.Range(ActiveSheet.Name & "NOM").Value & ".pdf"
'MsgBox "Chemin complet : " & MonFichier
'Sauvegarder la barre d'état en place
Barre_Actuelle = Application.DisplayStatusBar
Application.DisplayStatusBar = True
'affichage de la barre avec le message
Application.StatusBar = "Vérification"
On Error GoTo SUITE
If Len(Dir(MonFichier)) > 0 Then
MsgBox "ATTENTION Le fichier existe..."
'restauration de l'état de départ
Application.StatusBar = False
Application.DisplayStatusBar = Barre_Actuelle
End If
Exit Sub
SUITE:
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=MonFichier, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
'message
Application.StatusBar = "PDF généré"
'x secondes d 'attente
Application.Wait Now + TimeValue("00:00:02")
'restauration de l'état de départ
Application.StatusBar = False
Application.DisplayStatusBar = Barre_Actuelle
End Sub
Bonjour earmeek,
il y a un exemple pour GetFilesOnMacWithOrWithoutSubfolders
que tu peut télécharger sur le site suivant:
http://www.rondebruin.nl/mac/mac013.htm
n'ayant pas MAC je ne peut le tester.
exemple:
monfichier = GetFilesOnMacWithOrWithoutSubfolders(Level:=1, ExtChoice:=0, FileFilterOption:=3, FileNameFilterStr:=nom, dossier:=chemin)
Salut sabV,
C'est celui que j'ai effectivement téléchargé.
Mais je n'arrive pas à modifier le code pour non pas faire un listing, mais une simple vérif.
Malheureusement, le simple fait de devoir choisir le dossier est à l'opposé du gain de temps que je cherche avec cette macro de génération automatique de pdf.
Et comme tout le monde peut être étourdi.e, une vérif serait préférable.
Mais merci,
eArmeek
re.,
si tu connais le nom à l'avance,
tu l'inscris dans la variable nom et ainsi ce n'est pas une liste mais un seul fichier
[code]
chemin= ActiveWorkbook.Path & Application.PathSeparator
nom:= ActiveSheet.Range(ActiveSheet.Name & "NOM").Value & ".pdf"
monfichier = GetFilesOnMacWithOrWithoutSubfolders(Level:=2, ExtChoice:=7, FileFilterOption:=0, FileNameFilterStr:=nom, dossier:=chemin)
If monfichier = nom then MsgBox "ok"
[code]
Bonjour sabv,
Merci pour ton retour.
Alors j'ai fait un test.
(j'avais d'ailleurs vu des fonctions écrites sous cette forme, mais ça marchaient pas)
Donc j'ai des erreurs...
Peut-être pourras-tu m'aider sans tester.
1° - J'ai d'abord testé en enlevant les deux points après "nom" à ta 2e ligne.
(J'ai pensé que c'était une faute de frappe)
En exécutant la macro, j’ai une fenêtre : Erreur de compilation : Argument nommé introuvable. (pour “dossier:=“ en ligne 4)
2° - Alors j'ai remis les deux points après "nom" (pour faire tel quel), mais là, la ligne devient rouge et si j'exécute j'ai la fenêtre suivante : Erreur de compilation: Erreur de syntaxe
Alors, Je ne vois pas où doit être définit l'argument "dossier"
Ici, tout le contenu du module :
Option Explicit
'Important: this Dim line must be at the top of your module
Dim MyFiles As String
'*******Function that do all the work that will be called by the macro*********
Function GetFilesOnMacWithOrWithoutSubfolders(Level As Long, ExtChoice As Long, _
FileFilterOption As Long, FileNameFilterStr As String)
'Ron de Bruin,Version 4.0: 27 Sept 2015
'http://www.rondebruin.nl/mac.htm
'Thanks to DJ Bazzie Wazzie and Nigel Garvey(posters on MacScripter)
Dim ScriptToRun As String
Dim folderPath As String
Dim FileNameFilter As String
Dim Extensions As String
On Error Resume Next
folderPath = MacScript("choose folder as string")
If folderPath = "" Then Exit Function
On Error GoTo 0
Select Case ExtChoice
Case 0: Extensions = "(xls|xlsx|xlsm|xlsb)" 'xls, xlsx , xlsm, xlsb
Case 1: Extensions = "xls" 'Only xls
Case 2: Extensions = "xlsx" 'Only xlsx
Case 3: Extensions = "xlsm" 'Only xlsm
Case 4: Extensions = "xlsb" 'Only xlsb
Case 5: Extensions = "csv" 'Only csv
Case 6: Extensions = "txt" 'Only txt
Case 7: Extensions = ".*" 'All files with extension, use *.* for everything
Case 8: Extensions = "(xlsx|xlsm|xlsb)" 'xlsx, xlsm , xlsb
Case 9: Extensions = "(csv|txt)" 'csv and txt files
Case 10: Extensions = "pdf"
'You can add more filter options if you want,
End Select
Select Case FileFilterOption
Case 0: FileNameFilter = "'.*/[^~][^/]*\\." & Extensions & "$' " 'No Filter
Case 1: FileNameFilter = "'.*/" & FileNameFilterStr & "[^~][^/]*\\." & Extensions & "$' " 'Begins with
Case 2: FileNameFilter = "'.*/[^~][^/]*" & FileNameFilterStr & "\\." & Extensions & "$' " ' Ends With
Case 3: FileNameFilter = "'.*/([^~][^/]*" & FileNameFilterStr & "[^/]*|" & FileNameFilterStr & "[^/]*)\\." & Extensions & "$' " 'Contains
End Select
folderPath = MacScript("tell text 1 thru -2 of " & Chr(34) & folderPath & _
Chr(34) & " to return quoted form of it's POSIX Path")
folderPath = Replace(folderPath, "'\''", "'\\''")
If Val(Application.Version) < 15 Then
ScriptToRun = ScriptToRun & "set foundPaths to paragraphs of (do shell script """ & "find -E " & _
folderPath & " -iregex " & FileNameFilter & "-maxdepth " & _
Level & """)" & Chr(13)
ScriptToRun = ScriptToRun & "repeat with thisPath in foundPaths" & Chr(13)
ScriptToRun = ScriptToRun & "set thisPath's contents to (POSIX file thisPath) as text" & Chr(13)
ScriptToRun = ScriptToRun & "end repeat" & Chr(13)
ScriptToRun = ScriptToRun & "set astid to AppleScript's text item delimiters" & Chr(13)
ScriptToRun = ScriptToRun & "set AppleScript's text item delimiters to return" & Chr(13)
ScriptToRun = ScriptToRun & "set foundPaths to foundPaths as text" & Chr(13)
ScriptToRun = ScriptToRun & "set AppleScript's text item delimiters to astid" & Chr(13)
ScriptToRun = ScriptToRun & "foundPaths"
Else
ScriptToRun = ScriptToRun & "do shell script """ & "find -E " & _
folderPath & " -iregex " & FileNameFilter & "-maxdepth " & _
Level & """ "
End If
On Error Resume Next
MyFiles = MacScript(ScriptToRun)
On Error GoTo 0
End Function
'*******************************MA FONCTION*******************************
Sub A_SAVEPDF()
Dim chemin As String
Dim nom As String
Dim MonFichier As String
chemin = ActiveWorkbook.Path & Application.PathSeparator
nom = ActiveSheet.Range(ActiveSheet.Name & "NOM").Value & ".pdf"
MonFichier = GetFilesOnMacWithOrWithoutSubfolders(Level:=1, ExtChoice:=10, FileFilterOption:=0, FileNameFilterStr:=nom, dossier:=chemin)
'Level : 1= Only the files in the folder, 2 = to ? levels of subfolders
'ExtChoice : 0=(xls|xlsx|xlsm|xlsb), 1=xls , 2=xlsx, 3=xlsm, 4=xlsb, 5=csv, 6=txt, 7=all files, 8=(xlsx|xlsm|xlsb), 9=(csv|txt)
'FileFilterOption : 0=No Filter, 1=Begins, 2=Ends, 3=Contains
'FileNameFilterStr : Search string used when FileFilterOption = 1, 2 or 3
If MonFichier = nom Then MsgBox "ok"
End Sub
Re,
J'ai pensé à définir cette erreur d'"Argument nommé introuvable" dans la fonction initiale comme ce-ci :
Function GetFilesOnMacWithOrWithoutSubfolders(Level As Long, ExtChoice As Long, _
FileFilterOption As Long, FileNameFilterStr As String, dossier As String)
Mais malheureusement, il me demande de toujours de sélectionner le dossier !!
eArmeek
Re,
Je voulais voir si le test de vérification marchait, même si j'ai pas résolu la question d'éviter de devoir sélection le dossier, et la macro m'indique toujours le MsgBox "ok", que le fichier existe ou pas.
J'ai testé en écrivant directement le nom = "TEST1", idem toujours le MsgBox "ok", que le fichier existe ou pas.
Sub A_VERIF()
Dim chemin As String
Dim nom As String
Dim MonFichier As String
chemin = ActiveWorkbook.Path & Application.PathSeparator
nom = ActiveSheet.Range(ActiveSheet.Name & "NOM").Value & ".pdf"
MonFichier = GetFilesOnMacWithOrWithoutSubfolders(Level:=1, ExtChoice:=10, FileFilterOption:=0, FileNameFilterStr:=nom, dossier:=chemin)
'Level : 1= Only the files in the folder, 2 = to ? levels of subfolders
'ExtChoice : 0=(xls|xlsx|xlsm|xlsb), 1=xls , 2=xlsx, 3=xlsm, 4=xlsb, 5=csv, 6=txt, 7=all files, 8=(xlsx|xlsm|xlsb), 9=(csv|txt)
'FileFilterOption : 0=No Filter, 1=Begins, 2=Ends, 3=Contains
'FileNameFilterStr : Search string used when FileFilterOption = 1, 2 or 3
If MonFichier = nom Then
MsgBox "LE FICHIER EXISTE"
Else
MsgBox "ok"
End If
End Sub
re.,
quel sont les valeurs des variables chemin et nom ?
debug.print ActiveWorkbook.Path & Application.PathSeparator
debug.print ActiveSheet.Range(ActiveSheet.Name & "NOM").Value & ".pdf"
Pour tous ceux qui lisent ce fil, une remarque :
Dans la fonction
GetFilesOnMacWithOrWithoutSubfolders(Level As Long, ExtChoice As Long, FileFilterOption As Long, FileNameFilterStr As String) avec comme
- paramètres 1 (le nom le fichier commence par) ou 2 (le nom le fichier finit par) de FileFilterOption
- le nom entier dans FileNameFilterStr
Il ne marche qu'avec l'option 3 (le nom du fichier contient) de FileFilterOption
Test réalisé avec
- le fichier sources MacGetFiles téléchargeable sur http://www.rondebruin.nl/mac/mac013.htm
- FileNameFilterStr:="TEST1"
- un fichier existant TEST1.pdf
sabV,
Admettons que mon fichier est sur le bureau :
chemin = ActiveWorkbook.Path & Application.PathSeparator
nom = ActiveSheet.Range(ActiveSheet.Name & "NOM").Value & ".pdf"
chemin = Macintoch HD:Users:XXXX:Desktop:
nom = TEST1.pdf (c'est-à-dire la valeur de cellule A1 nommé F1NOM (cellule que j'ai nommé de manière stratégique pour que ma macro fonctionne dans toutes mes feuilles, soit = ActiveSheet.Name & "NOM", comme ça je nomme la cellule qui m'intéresse dans chacune de mes feuilles avec la même logique))
re.,
peut tu, à l'aide de l'enregistreur de macro, ouvrir ton fichier
et vérifier la syntaxe par rapport à tes variables chemin et non.