Excel VBA vérifier si le répertoire existe erreur

j'ai une feuille de calcul qui, en cliquant sur un bouton se dupliquera en copiant/collant tout sur un nouveau classeur et enregistrer le fichier avec un nom qui dépend de certaines valeurs variables (prises à partir des cellules sur la feuille de calcul). Mon objectif actuel est de l'obtenir pour sauvegarder la feuille dans différents dossiers en fonction du nom du client (valeur de la cellule détenue dans la variable), alors que cela fonctionne sur la première course, je reçois une erreur après.

Le code vérifie si le répertoire existe et crée si elle n'est pas. Cela fonctionne, mais après qu'il est créé, le lancer une deuxième fois jette l'erreur:

erreur D'exécution 75-chemin / erreur d'accès au fichier.

mon code:

Sub Pastefile()

Dim client As String
Dim site As String
Dim screeningdate As Date
screeningdate = Range("b7").Value
Dim screeningdate_text As String
screeningdate_text = Format$(screeningdate, "yyyy-mm-dd")
client = Range("B3").Value
site = Range("B23").Value


Dim SrceFile
Dim DestFile

If Dir("C:13 Recieved Schedules" & "" & client) = Empty Then
    MkDir "C:13 Recieved Schedules" & "" & client
End If

SrceFile = "C:13 Recieved Schedulesschedule template.xlsx"
DestFile = "C:13 Recieved Schedules" & client & "" & client & " " & site & " " & screeningdate_text & ".xlsx"


FileCopy SrceFile, DestFile

Range("A1:I37").Select
Selection.Copy
Workbooks.Open Filename:= _
    "C:13 Recieved Schedules" & client & "" & client & " " & site & " " & screeningdate_text & ".xlsx", UpdateLinks:= _
    0
Range("A1:I37").PasteSpecial Paste:=xlPasteValues
Range("C6").Select
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close

End Sub

veuillez excuser mon manque de connaissances dans ce domaine, je suis encore en apprentissage. J'ai le sentiment très fort que cela a quelque chose à voir avec la logique de vérification des répertoires, comme quand l'erreur est lancée le MkDir la ligne est surlignée.

32
demandé sur ZygD 2013-03-18 19:21:52

6 réponses

pour vérifier l'existence d'un répertoire en utilisant Dir, vous devez spécifier

If Dir("C:13 Recieved Schedules" & "\" & client, vbDirectory) = "" Then

Notez que, avec vbDirectory, Dir renvoie une chaîne non vide si le chemin spécifié existe déjà sous forme de répertoire ou dans un fichier (pourvu que le fichier n'ait aucun des attributs read-only, hidden, ou system). Vous pouvez utiliser GetAttr pour être sûr que c'est un répertoire et pas un fichier.

84
répondu Brian Camire 2013-03-18 16:35:24

Utilisez la méthode FolderExists de l'objet scripting.

Public Function dirExists(s_directory As String) As Boolean

Set OFSO = CreateObject("Scripting.FileSystemObject")
dirExists = OFSO.FolderExists(s_directory)

End Function
14
répondu ozmike 2017-01-02 23:34:12
If Len(Dir(ThisWorkbook.Path & "\YOUR_DIRECTORY", vbDirectory)) = 0 Then
   MkDir ThisWorkbook.Path & "\YOUR_DIRECTORY"
End If
5
répondu EGOBLIN 2014-02-19 17:53:51

Pour être certain qu'un dossier existe (et pas un le fichier) j'utilise cette fonction:

Public Function FolderExists(strFolderPath As String) As Boolean
    On Error Resume Next
    FolderExists = ((GetAttr(strFolderPath) And vbDirectory) = vbDirectory)
    On Error GoTo 0
End Function

il fonctionne les deux, avec \ à la fin et sans.

4
répondu ZygD 2017-11-03 08:20:34

j'ai utilisé:

Function DirectoryExists(Directory As String) As Boolean
 DirectoryExists = False
 If Not Dir(Directory, vbDirectory) = "" Then
    If GetAttr(Directory) And vbDirectory = vbDirectory Then
        DirectoryExists = True
    End If
 End If
End Function

qui est un mélange de réponses @Brian et @ ZygD. là où je pense que la réponse de @Brian n'est pas suffisante et n'aime pas le "On Error Resume Next" de la réponse de @ZygD

1
répondu TGN12 2017-08-25 11:48:34

Vous pouvez remplacer WB_parentfolder par quelque chose comme "C:\". Pour moi, WB_parentfolder saisit l'emplacement du classeur actuel. file_des_folder est le nouveau dossier que je veux. Cela va à travers et crée autant de dossiers que vous avez besoin.

        folder1 = Left(file_des_folder, InStr(Len(WB_parentfolder) + 1, file_loc, "\"))
        Do While folder1 <> file_des_folder
            folder1 = Left(file_des_folder, InStr(Len(folder1) + 1, file_loc, "\"))
            If Dir(file_des_folder, vbDirectory) = "" Then      'create folder if there is not one
                MkDir folder1
            End If
        Loop
0
répondu Alex Johnson 2017-08-24 22:08:18