IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème autour de la création de répertoire fonction Dir et mkdir [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Par défaut Problème autour de la création de répertoire fonction Dir et mkdir
    Bonjour,

    j'ai besoin de créer un répertoire avec un nom standard qui dépendra des valeurs rentrées dans ma feuille Excel.

    Pour ce faire j'appelle une fenêtre genre GetOpenFileName
    je stocke le résultat
    je le modifie pour rajouter le nom de du nouveau repertoire (fonction de valeurs de ma feuille vous suivez?)
    C'est là que les ennuis commencent :

    je voudrais faire en sorte que lorsque le répertoire existe déjà proposer d'autre choix à l'utilisateur.

    Pour faire ce test j'utilise la fonction Dir() et j'ai l'impression que quelque soit la valeur que je lui donne elle me renvoi une chaine vide

    voici le morceau de mon code incriminé:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
     
    Begin:
     
        Directory_Path = ""
     
        ' CHOIX D'UN DOSSIER PAR VBA
     
     
        Dim fd As FileDialog
        Set fd = Application.FileDialog(msoFileDialogFolderPicker)
        Dim vrtSelectedItem As Variant
     
        With fd
     
        MsgBox "Please select where do you want to create a - " & "PRF ACE7000 " & Feuil1.RBU_NAME_text_box.Text & " " & Feuil1.CUSTOMER_name_text_box.Text & "-new directory."
     
        If .Show = -1 Then 'ie if the user has clicked on open
     
                    For Each vrtSelectedItem In .SelectedItems
                        Directory_Path = vrtSelectedItem
                    Next vrtSelectedItem
     
        Else
     
            Directory_Path = "False"
     
        End If
     
        End With
        Set fd = Nothing
     
        If Directory_Path <> "False" Then
     
            '**************** creation of a new directory that contains the attached files
            test = Dir(Directory_Path)
            MsgBox test
     
            'initializing the automatic directory path name
            Directory_Path = Directory_Path & "\PRF ACE7000 " & Feuil1.RBU_NAME_text_box.Text & " " & Feuil1.CUSTOMER_name_text_box.Text
     
     
            If Dir(Directory_Path) = "" Then         'if the directory does not _ already exists
     
     
                MkDir Directory_Path
                Directory_Path = Directory_Path & "\"
     
            Else
     
                Dim Continue As Integer
     
                Continue = MsgBox("The selected directory contains already a " _
                                & "directory named " & "-PRF ACE7000 " & Feuil1.RBU_NAME_text_box.Text & " " _
                                & Feuil1.CUSTOMER_name_text_box.Text & "-" _
                                & " click on Retry to select an other path, on Ignore to continue with the old directory name or on Abort to stop the process" _
                                , vbAbortRetryIgnore)
     
                Select Case Continue
     
                Case 3 'abort
     
                    Exit Sub
     
                Case 4 'retry
     
                    GoTo Begin
     
                Case 5 'ignore
     
                    Directory_Path = Directory_Path & "\"
                    GoTo File_Copying
     
                Case Else
     
                End Select
     
            End If
     
    File_Copying:
    a l'exécution de ce code dans le cas d'un répertoire existant je tombe sur une erreur 75 : erreur chemin/fichier

    Donc je cherche à comprendre pourquoi l'instruction Dir() ne fonctionne pas : quelque soit le chemin choisit : pour avoir un nouveau repertoire ou dans le cas d'un repertoire existant.
    (dans mes test j'écris sur un lecteur réseau ça vient ptêt de là...)


    Par ailleur Krovax (loué soit son nom!) m'avait conseillé cf (http://www.developpez.net/forums/d78...fichier-excel/) une autre solution pour créer des repertoire, méthode que j'ai trouvé lourde. Je lui ai préféré mkdir. Que pensez vous de ce choix?

    si quelqu'un a une idée qui me permettrait de créer un répertoire et dans le cas où il existe déjà proposer à l'utilisateur l'utilisation de ce répertoire existant, l'écrasement de l'ancien ou la sortie pure et simple de la procédure

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Il est évident que tu confonds deux actions différentes :
    Sélectionner un répertoire existant (ce que ton code (simplifié) permettrait de faire)
    Vérifier l'existence d'un répertoire et éventuellement le créer (ce que ton code ne permet évidemment pas de faire)
    Mais il s'agit là de deux actions totalement indépendantes.
    Pour savoir si un répertoire existe et le créer s'il n'existe pas, le plus simple est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If dir(NomCompletDuCheminEtDuRépertoire) ="" then 
          if msgbox ("ton répertoire n'existe pas, le créer ?","",vbyesno) = vbyes then
                 chdrive "D" ' Le lecteur dans lequel doit se trouver le répertoire si différent du lecteur courant
                 MKdir NomCompletDuCheminEtDuRépertoire
                 chdir NomCompletDuCheminEtDuRépertoire ' facultatif, pour te placer dans le répertoire en question
     
          endif
    Endif

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Par défaut
    Je ne crois pas confondre les 2 actions dans mon code (compliqué c'est vrai) :

    cf le bout de code : 1er bloc, je récupère le chemin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Begin:
     
        Directory_Path = ""
     
        ' CHOIX D'UN DOSSIER PAR VBA
     
     
        Dim fd As FileDialog
        Set fd = Application.FileDialog(msoFileDialogFolderPicker)
        Dim vrtSelectedItem As Variant
     
        With fd
     
        MsgBox "Please select where do you want to create a - " & "PRF ACE7000 " & Feuil1.RBU_NAME_text_box.Text & " " & Feuil1.CUSTOMER_name_text_box.Text & "-new directory."
     
        If .Show = -1 Then 'ie if the user has clicked on open
     
                    For Each vrtSelectedItem In .SelectedItems
                        Directory_Path = vrtSelectedItem
                    Next vrtSelectedItem
     
        Else
     
            Directory_Path = "False"
     
        End If
     
        End With
        Set fd = Nothing

    puis je traite ce chemin pour rajouter le nom automatique de repertoire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    If Directory_Path <> "False" Then
     
     
            'initializing the automatic directory path name
            Directory_Path = Directory_Path & "\" & Feuil1.CUSTOMER_name_text_box.Text
    et enfin je crée (j'essaye de créer ) un nouveau répertoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
            If Dir(Directory_Path) = "" Then         'if the directory does not _ already exists
     
     
                MkDir Directory_Path
     
     
            Else
    ce dernier morceau de code est à 2 choses près la même chose que ce que tu m'a indiqué. J'avoue il était bien caché ...

    Mon problème est que quand je teste mon programme quel que soit la valeur de Directory_Path Dir(Directory_Path) est toujours la chaine vide.
    donc mon test ne sert à rien !

    finalement j'utilise la methode FSO décrite là : http://warin.developpez.com/access/fichiers/#LI-D-3-a mais je la trouve beaucoup plus lourde que le mkdir

    et puis y a pas de raison j'aimerais bien faire marcher dir() !!


    mettons que je veuille créer le repertoire monrep dans le repertoire D:\user\exemple

    J'ai essayé de lui donner qqc du genre dir(D:\user\exemple\monrep)

    que le repertoire \monrep existe déjà ou non dir() me rends toujours une chaine vide

    j'ai essayé en lui mettant un \ à la fin : dir(D:\user\exemple\monrep\) c'est pareil.

    Pensez vous que ça puisse venir du fait que D:\ est un lecteur réseau ou que \monrep si il existe déjà puisse être un lecture seule?

    (bizarerie : \exemple est en lecture seule mais j'arrive avec mkdir a écrire dedans... Qu'est ce qui se passe??)
    précision peut être importante je suis sous windows XP Professionel

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Command1_Click()
      MsgBox existe("d:\monoutil\")
    End Sub
    
    
    Private Function existe(ByVal R As String) As Boolean
      If Right(R, 1) <> "\" Then R = chemin & "\"
      existe = Dir(R, vbDirectory) <> ""
    End Function
    et on n'en parle plus ...

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Alors tu peux effectivement simplifier ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim fd As FileDialog
        Set fd = Application.FileDialog(msoFileDialogFolderPicker)
        With fd
            MsgBox "Please select where do you want to create a - " '& "PRF ACE7000 " & Feuil1.RBU_NAME_text_box.Text & " " & Feuil1.CUSTOMER_name_text_box.Text & "-new directory."
            .Show
            Directory_Path = .SelectedItems(1)
            'ton test
            MsgBox Directory_Path
        End With
    En utilisant cette méthode, qu'un répertoire soit ou non choisi, tu as nécessairement quelque chose dans Directory_Path.
    Le seul test utile que tu pourrais faire serait de vérifier si Directory_Path correspond bien à un répertoire désiré. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not Directory_Path <> RépertoireCourant then...
    Maintenant je te conseille de vérifier ce que tu abtiens dans ta ligne
    Directory_Path = Directory_Path & "\PRF ACE7000 " & Feuil1.RBU_NAME_text_box.Text & " " & Feuil1.CUSTOMER_name_text_box.Text
    Si tu as des choses que windows n'aime pas (":", "+", "?", etc) c'est windows qui plantera ta macro.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Par défaut
    Merci de vos réponses finalement je fais différemment je n'utilise pas dir() et mkdir, mais :

    ça génère une erreur si directory_path existe déjà et ensuite je gère l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    on error goto err
     
                Dim oFSO As Scripting.FileSystemObject
                Dim oFld As Folder
                Set oFSO = New Scripting.FileSystemObject
                Set oFld = oFSO.CreateFolder(Directory_Path)
     
    err:
        Select Case err.Number
            Case 52: MsgBox "An incompatible character has been entered to create a folder. Please remove \/ : | * ? < > " & """" & " from the RBU and Customer Name and retry"
            Case 53: MsgBox "Le fichier est introuvable"
            Case 58: GoTo Existing_folder 'dans ce label un morceau de code change directory path
            Case 75: MsgBox "Erreur chemin/fichier"
            Case Else: MsgBox "Erreur inconnue"
        End Select
    Merci Ouskel'n'or je n'avais pas pensé au problème des caractères interdits !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [sybase] Problème lors de la création d'une fonction
    Par khaledmoez dans le forum Sybase
    Réponses: 2
    Dernier message: 23/05/2013, 15h40
  2. Réponses: 2
    Dernier message: 16/02/2012, 11h03
  3. Réponses: 1
    Dernier message: 25/02/2009, 09h44
  4. Problème de création de répertoire
    Par lecra dans le forum MVC
    Réponses: 3
    Dernier message: 25/05/2007, 15h13
  5. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo