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
le filtre ne marche pas.

Il ne marche qu'avec l'option 3 (le nom du fichier contient) de FileFilterOption

Test réalisé avec

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.

Rechercher des sujets similaires à "verifier existence fichier mac nas"