Avis sur macro création dossier

Résolu
Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   -  
Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai écris cette macro qui créer des dossier sous D:, s'il nexiste pas, a partir d'un formulaire excel. Pour le moment elle marche bien, mais je souhaiterai anticiper de futur probleme. Donc pouvez-vous me donnez votre avis sur cette macro. Merci d'avance.

sub createfolder
adress = "D:\"
foldername = "Q " & Range("D11") & "_" & Range("D12") & "_" & Range("B22")

If Dir(adress & foldername, 16) = "" Then
MkDir adress & foldername
Else: MsgBox foldername & Chr(13) & "Dossier déja existant"
End If
end sub

3 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    pourquoi "foldername" ?
    0
    1. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Elle est utilisé par des anglophones donc je mets le plus de chose en anglais.
      J'ai changé des truc en francais pour ce forum mais j'ai oublié cela.
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      si j'ai posé la question est que mot "foldername" est un mot réservé par VBA ; propriété de l'objet
      SharedWorkspaceFolder concernant les espaces de dossiers partagés

      donc ça m'a paru bizarre que ça marche (ca marche: j'ai testé) mais il serait peut-^tre plus prudent de le nommer autrement

      bonjour Frank: je n'avais pas rafraichi.
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut michel,
      je n'avais pas rafraichi. Moi non plus. Désolé...
      Bonne journée.

      ps : Merci pour les précisions sur FolderName, il me semblait bien l'avoir déjà utilisé...
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      re,

      ci dessous une fonction qui vérifie la syntaxe d'un fichier (auteur; ???)
      il serait facile de la transformer(partie en italique) pour un dossier :; si tu peux regarder car je dois partir
      Function detecter_car_interdit(nom_fichier) As Boolean 
       Dim interdit 
       Dim cptr As Long 
          'teste si 2 points dans le nom de fichier 
          If Len(nom_fichier) - Len(Replace(nom_fichier, ".", "")) > 1 Then GoTo erreur 
          'teste si nom de fichier comporte une extension 
          If InStr(nom_fichier, ".") = 0 Then 
              MsgBox " nom de fichier sans extension", vbCritical 
              GoTo erreur 
          End If 
          ' travaille suir la partie gauche avant l'extension 
          nom_fichier = Left(nom_fichier, InStr(nom_fichier, ".") - 1) 
           interdit = Array("""", "/", "?", ":", "|", "*", "<", ">", "[", "]", ".") 
           For cptr = LBound(interdit) To UBound(interdit) 
               If InStr(nom_fichier, interdit(cptr)) Then GoTo erreur 
           Next cptr 
            
      detecter_car_interdit = False 
      Exit Function 
      erreur: 
      detecter_car_interdit = True 
       End Function 
      
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    Ta macro semble très bien construite et convenir.
    Néanmoins, il y a des limitations dont tu n'as pas tenu compte. Supposons que ta macro tombe dans les mains d'un utilisateur néophyte. Il veut créer un répertoire nommé : "/\*?<>|:"
    Ta macro, rique de planter sévère...

    Quelques règles à intégrer à ta macro (je ne sais pas si elles sont encore d'actualité, mais de toutes façons ça peux pas faire de mal) :
    * longueur maximale du nom du répertoire de 255 caractères
    * longueur maximale du chemin d'accès à un fichier : 260 caractères
    * le caractère backslash (\) est le séparateur de chemins
    * les caractères suivants sont prohibés :
    ", /, \, *, ?, <, >, |, :

    Si tu empêches l'utilisateur lambda de contourner ces quelques règles, ta macro sera bien bonne...

    J'ajouterais également :
    - Déclare tes variables
    - utilises d'autres noms (foldername est peut être déjà du langage VBA)
    Cordialement,
    Franck P
    0
    1. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Désolé pour la déclaration des variables, elle est en faite deja faite, mais en faite ceci n'est qu'une partie d'une macro plus grande. Et en recopiant j'ai oublier de mettre la déclaration des variables.

      Ok je vais changer foldername.

      Merci pour les régles je vais tacher de mettre des sécurité pour eviter un plantage.

      Merci pour tes conseils.
      0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Re-

    Suite à la suggestion de Michel plus haut, voici un code de création avec la fonction qui va bien... :

    Sub createfolder()
    Dim LettreRacine As String, NomDossier As String
    
    LettreRacine = "D:\"
    NomDossier = "Q " & Range("D11") & "_" & Range("D12") & "_" & Range("B22") 
    
    If detecter_car_interdit(NomDossier) = False Then
        If Dir(LettreRacine & NomDossier, 16) = "" Then
            MkDir LettreRacine & NomDossier
        Else: MsgBox NomDossier & Chr(13) & "Dossier déja existant"
        End If
    Else
        MsgBox NomDossier & Chr(13) & _
    "- Comporte des caractères interdits (pour mémoire : """", /, \, *, ?, <, >, |, :)" _
    & Chr(13) & "ou" & Chr(13) & _
    "- Ce nom de répertoire est trop long (>255 caractères)"
    End If
    End Sub
    
    Function detecter_car_interdit(Nom) As Boolean
     Dim interdit
     Dim cptr As Long
     '---- TESTS RESERVES AU NOMS DE FICHIERS ------
        ''--teste si 2 points dans le nom de fichier
        'If Len(nom_fichier) - Len(Replace(nom_fichier, ".", "")) > 1 Then GoTo erreur
        ''--teste si nom de fichier comporte une extension
        'If InStr(nom_fichier, ".") = 0 Then
        '    MsgBox " nom de fichier sans extension", vbCritical
        '    GoTo erreur
        'End If
    '----- TESTS POUR TOUS LES NOMS (Fichiers & Répertoires)
        ''--vérifie les caractères interdits
        'la ligne suivante concerne les noms de fichiers
    'interdit = Array("""", "/", "?", ":", "|", "*", "<", ">", "[", "]", ".")
        'la ligne suivante concerne les répertoires
    interdit = Array("""", "/", "\", "*", "?", "<", ">", "|", ":")
    For cptr = LBound(interdit) To UBound(interdit)
        If InStr(Nom, interdit(cptr)) Then GoTo erreur
    Next cptr
        ''--vérifie le nombre de caractères du nom de répertoire
    If Len(Nom) > 255 Then GoTo erreur
    detecter_car_interdit = False
    Exit Function
    erreur:
    detecter_car_interdit = True
    End Function

    0
    1. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Merci beaucoup je n'ai pas encore eu le temps de la regardé mais des aue j'ai un moment je mis met.

      Merci encore
      0
    2. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Bonjour,
      J'ai eu enfin le temps d'y jetter un oeil du coup je me tourne vers vous pour vous posez une question.
      Y a t'il un interet a passer par une function? On ne peut pas directement l'intégrer a la macro?
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,

      L'avantage de créer une fonction est que tu n'as pas besoin de te prendre la tête à chaque problème identique: tu as la solution sous le coude. Tu te crées ainsi une bibliothèque de solutions "prêtes à cuire"
      De plus, une fonction peut-être utilisée (sous certaines conditions) comme fonction personnalisée sous Excel à la suite des fonctions-formules d'Excel

      Maintenant, tu fais ce que tu veux: rien ne t'oblige à passer par une fonction
      0
    4. Mrfrize Messages postés 197 Date d'inscription   Statut Membre Dernière intervention   6
       
      Merci a tous pour vos conseil.
      Je viens de mettre a jour ma amcro avec ceux-ci.
      0