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

VBA Word Discussion :

[VBA-W] : Fonction Dir et attributs


Sujet :

VBA Word

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut [VBA-W] : Fonction Dir et attributs
    Bonsoir.

    La documentation de Word 2002 sur la fonctio Dir et son second argument ne me semble pas claire.

    Le second argument est, disons, un champ de bits.

    Voici ce que dit la documentation pour commencer :

    " Dir, fonction

    Renvoie une valeur de type String représentant le nom d'un fichier, d'un répertoire ou d'un dossier correspondant à une chaîne de recherche, à un attribut de fichier ou au nom de volume d'un lecteur.

    Syntaxe

    Dir[(pathname[, attributes])] "

    Que faut-il entendre exactement par " correspondant à un attribut de fichiers " ?

    Avant de donner un exemple de code et son résultat, je copie ce que la documentation indique sur la façon de désigner les attributs :

    Constante Valeur Description
    vbNormal 0 (Par défaut) Spécifie les fichiers sans attributs.
    vbReadOnly 1 Spécifie les fichiers accessibles en lecture seule ainsi que les fichiers sans attributs.
    vbHidden 2 Spécifie les fichiers cachés ainsi que les fichiers sans attributs.
    vbSystem 4 Spécifie les fichiers système ainsi que les fichiers sans attributs. Non disponible sur le Macintosh.
    vbVolume 8 Spécifie un nom de volume ; si un autre attribut est spécifié, la constante vbVolume est ignorée. Non disponible sur Macintosh.
    vbDirectory 16 Spécifie les dossiers ainsi que les fichiers sans attributs.
    vbAlias 64 Le nom du fichier spécifié est un alias. Disponible uniquement sur le Macintosh.

    Voici maintenant un code que j'ai écrit pour tester cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Dir("C:\FichierPourTesterAttributs.txt", vbNormal) <> "" Then 
      MsgBox "Le fichier existe déjà." 
    Else 
      MsgBox "Le fichier n'existe pas." 
    End If
    Le fichier en question existe.
    S'il a les attributs "Lecture seule" et "Archive" mais pas l'attribut "Fichier caché", le MsgBox dit qu'il existe.
    S'il a les trois attributs "Lecture seule", "Fichier caché" et "Archive", le MsgBox dit qu'il n'existe pas.

    Je ne vois pas quelle est la règle qui peut faire attendre ce résultat.

    Quelqu'un peut-il me l'expliquer ? Merci d'avance.

  2. #2
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ben !...
    si tu limites aux fichiers "normaux", il arrête ainsi sa sélection...
    Si tu relis ce qu'il convient de mettre en arguments pour attributes, tu te rendras compte de ce que les opérateurs y sont permis.
    Dans le cas qui t'intéresse, il me semble que l'opérateur OR est celui que tu dois utiliser... pour l'argument attributes.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Merci, mais je ne comprends pas.

    Dans mes deux essais, je me suis "limité aux fichiers normaux" (je reprends ton expression), et pourtant la macro a trouvé un fichier en lecture seule.

    Comment se fait-il qu'elle trouve un fichier en lecture seule et qu'elle ne trouve pas un fichier caché ?

    Aucun de ces fichiers n'est "sans attributs", me semble-t-il ?

    Désolé si je suis lourd, mais s'il fallait attendre de comprendre avant de demander...

    Mersenne.

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Voila les arguments possibles :
    vbNormal 0 Normal
    vbHidden 2 Hidden
    vbSystem 4 System file
    vbVolume 8 Volume label; if specified, all other attributes are ignored
    vbDirectory 16 Directory or folder
    1) il n'y a pas de possibilité d'invoquer un ReadOnly
    2) ne pas confondre le recensement d'un fichier avec les interventions éventuelles sur le fichier.

    Si le fichier n'est ni caché, ni un fichier système, ni un répertoire ou sous-répertoire, ni la racine d'un disque, il sera recensable par vbnormal.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Merci, mais si tu relis la documentation du Word 2002 telle que je l'ai copiée, tu verras qu'il y a bien une valeur vbReadOnly (elle est égale à 1).

    Cette documentation est-elle fautive ?

    Puis-je te demander la source où tu as trouvé qu'il n'y a pas de valeur pour la lecture seule ?

    Merci d'avance.

    Mersenne.

  6. #6
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Je n'ai pas Word VBA. J'ai donc regardé directement dans VB...
    Ils ont peut-être fait une faute en traduisant ou en faisant un copier-coller d'autres constantes utilisées à d'autres fins que celles du Dir.
    As-tu bien compris qu'un fichier ReadOnly devait pouvoir être recensé, même si on ne pouvait pas le modifier ?... C'est tout simple.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Merci.

    Tu as peut-être raison, mais c'est un peu bizarre que VB n'utilise pas la valeur 1, il me semble.

    Pour qu'un fichier soit trouvé par Dir(NomCompletDeFichier, vbValeurDAttribut), faut-il que la valeur des attributs de ce fichier soit identique à vbValeurDAttribut, ou suffit-il que le fichier possède tous les attributs impliqués par vbValeurDAttribut, et éventuellement d'autres attributs en plus ?

    Je n'ai pas trouvé de réponse claire à cette question.

    Comme ma macro trouvait les ReadOnly avec le paramètre vbNormal, je croyais que la seconde hypothèse était la bonne.

    Si tu peux m'indiquer une source non ambiguë, merci d'avance.

    Mersenne.

    P.S. Pourquoi ne pourrait-on jamais avoir besoin d'une recherche qui ne s'intéresse pas aux fichiers ReadOnly ?

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Je ne vois pas d'autres sources que ce que je t'ai déjà dit.
    Maintenant, si tu veux pouvoir recenser tous les fichiers, quel que soit leur attribut, utilise donc l'opérateur OR (Or attmachin or attchouette, etc...)

    J'ai par contre également VBA EXCEL et, là aussi, j'y vois comme arguments pour Dir :
    vbNormal 0 Normal.
    vbHidden 2 Caché.
    vbSystem 4 Systèmenon disponible sur Macintosh.
    vbVolume 8 Etiquette de volume; si elle est spécifiée, tous les Attributs ne sont pas pris en comptenon disponible sur Macintosh.
    vbDirectory 16 Répertoire ou dossier.
    Pas de Readonly non plus, et c'est bien normal...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Merci pour la référence.

    (Edit : j'avais demandé s'il y avait de la documentation sur Internet.)

    En tout cas, on dirait qu'il y a un bug ou une erreur dans la documentation du Word 2002.

    Mersenne.

  10. #10
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ah ça oui, alors : je connais un excellent site, tout prés de toi et tout prêt à te servir, sans passer par internet.
    Son nom ? AIDE EN LIGNE
    Vois sur ta barre : "Aide" ou "Help" ou "?" selon ta version .... clique dessus... frappe Dir dans la boite qui va s'ouvrir... et lis...

    Tu peux également frapper Dir où tu veux, dans ton code, sélectionner ce mot .... et frapper la touche F1....!


    EDIT: on s'est croisés.
    Je réponds à ta nouvelle question : un recensement n'est pas un inventaire précis. le Dir va faire exactement ce que ferait ton explorateur...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par jmfmarques
    Ah ça oui, alors : je connais un excellent site, tout prés de toi et tout prêt à te servir, sans passer par internet.
    Son nom ? AIDE EN LIGNE
    Vois sur ta barre : "Aide" ou "Help" ou "?" selon ta version .... clique dessus... frappe Dir dans la boite qui va s'ouvrir... et lis...

    Tu peux également frapper Dir où tu veux, dans ton code, sélectionner ce mot .... et frapper la touche F1....!
    C'est cette méthode que j'ai utilisée pour obtenir la documentation que tu considères comme fautive...

    Mersenne.

  12. #12
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ne possédant pas ta version, je ne peux ni vérifier, ni confirmer, ni infirmer...
    D'autres le feront sans doute à ma place...

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par jmfmarques
    Voila les arguments possibles :
    vbNormal 0 Normal
    vbHidden 2 Hidden
    vbSystem 4 System file
    vbVolume 8 Volume label; if specified, all other attributes are ignored
    vbDirectory 16 Directory or folder
    1) il n'y a pas de possibilité d'invoquer un ReadOnly
    Sous Office 2000, les attributs sont bien ceux donnés par Mersenne.

    De plus, la logique de sa question est tout à fait correcte.

    Je n'ai pas d'explication.

  14. #14
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Nous parlons bien tous des attributs invocables en VBA en argument de DIR, - car c'est DIR qui est concerné - (et qui chez moi n'incluent pas le readonly et sont ceux que j'ai indiqués) n'est-ce-pas ?
    et pas des constantes prévues, de façon générale par VB et notamment pour l'utlisation de GetAttr et SetAttr,et qui sont :
    vbNormal 0 Normal (default for Dir and SetAttr)
    vbReadOnly 1 Read-only
    vbHidden 2 Hidden
    vbSystem 4 System file
    vbVolume 8 Volume label
    vbDirectory 16 Directory or folder
    vbArchive 32 File has changed since last backup
    :
    Je vais essayer de trouver un voisin avec VB 2000

  15. #15
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Bon. Inutile de déranger le voisin... M. Google a fait l'affaire.
    Voilà ce que l'on y trouve à propos de l'utilisation de DIR sous VBA :
    The second, optional parameter of the Dir$ function is used to provide additional conditions (beyond the specified path) with which to select files. For example, using the constant "vbDirectory" returns only the subdirectories (or folders) in the specified path. The constant "vbVolume" causes Dir$ to return the specified drive's volume label. The available constants are
    summarized below :

    Constant Value Purpose
    vbNormal 0 (Default Value)
    vbHidden 2 Include Hidden Files
    vbSystem 4 Include System Files
    vbVolume 8 Return Drive Volume Label
    vbDirectory 16 Display SubDirectories
    vbReadOnly 1 Include read-only files

    Note : Constants can be added together if you want to use more than one. For example, the following code finds the system, hidden and read only file IO.SYS on a machine :
    L'explorateur de Windows lui-même fonctionne selon cette philosophie (aucune option d'affichage n'y est disponible en ce qui concerne les fichiers en lecture seule - ReadOnly - ou avec l'attribut archive. On ne peut décider d'afficher ou de ne pas afficher que les fichiers cachés ou système.

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    les différentes valeurs possibles font une checksum de valeur 51
    sous windows

    l'argument est optionnel il suffit de ne rien mettre pour tout avoir

    si vous tenez à avoir un truc il faut utiliser la comparaison byte à byte
    (c'est pas la mienne est plus grosse etc )
    donc
    vbnormal or 51

  17. #17
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par jmfmarques
    The second, optional parameter of the Dir$ function is used to provide additional conditions (beyond the specified path) with which to select files. For example, using the constant "vbDirectory" returns only the subdirectories (or folders) in the specified path. The constant "vbVolume" causes Dir$ to return the specified drive's volume label. The available constants are
    summarized below :

    Constant Value Purpose
    vbNormal 0 (Default Value)
    vbHidden 2 Include Hidden Files
    vbSystem 4 Include System Files
    vbVolume 8 Return Drive Volume Label
    vbDirectory 16 Display SubDirectories
    vbReadOnly 1 Include read-only files

    Note : Constants can be added together if you want to use more than one. For example, the following code finds the system, hidden and read only file IO.SYS on a machine :
    L'explorateur de Windows lui-même fonctionne selon cette philosophie aucune option d'affichage n'y est disponible en ce qui concerne les fichiers en lecture seule - ReadOnly - ou avec l'attribut archive. On ne peut décider d'afficher ou de ne pas afficher que les fichiers cachés ou système.
    Heu...???

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Merci jmfmarques, mais je ne suis pas sûr de comprendre.

    Avez-vous remarqué que vbReadOnly figure bel et bien dans la liste que vous venez de poster(à la fin de la liste) ?

    (Edit : je n'avais pas lu le post d'Alain Tech, qui fait la même remarque.)

    Mersenne.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par random
    les différentes valeurs possibles font une checksum de valeur 51
    sous windows

    l'argument est optionnel il suffit de ne rien mettre pour tout avoir

    si vous tenez à avoir un truc il faut utiliser la comparaison byte à byte
    (c'est pas la mienne est plus grosse etc )
    donc
    vbnormal or 51
    Merci Random.

    J'ai tout de même l'impression que la pratique ne correspond pas à la théorie.

    Comment se fait-il qu'avec l'argument vbNormal (valeur 0), un fichier en lecture seule (non caché) est trouvé et un fichier caché n'est pas trouvé ?

    Mersenne.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par ouskel'n'or
    Tout ça ne répond pas à ta question. Quand tu fais ça
    If Dir("C:\FichierPourTesterAttributs.txt", vbNormal) <> "" Then
    MsgBox "Le fichier existe déjà."
    Else
    MsgBox "Le fichier n'existe pas."
    End If
    Le dir concerne le premier fichier enregistré dans le répertoire. Si ce premier fichier n'est pas "FichierPourTesterAttributs.txt" bien sûr qu'il n'est pas trouvé.
    Mets la même chose dans une boucle en testant le nom de tous les fichiers. Si le tiens s'y trouve... etc
    Merci Ouskelnor, mais je ne suis pas convaincu.

    Remarquez que la chaîne qui forme le premier argument ne se termine pas par le caractère \
    Tous mes essais m'ont convaincu que, dans ce cas, l'objet cherché est l'objet (fichier ou répertoire) désigné par la chaîne et non un de ses éléments.

    D'ailleurs, je rappelle que si le fichier indiqué dans ma macro ne comporte pas (dans la réalité) l'attribut "caché", il est bel et bien trouvé par la macro.

    Mersenne.

Discussions similaires

  1. [VBA EXCEL] Fonction Instr
    Par thulvar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/01/2006, 15h43
  2. [VBA-E] Fonction "FIND"
    Par cinc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/09/2005, 12h16
  3. [VBA-E] lien en VBA et fonction generatrice
    Par Smoke666 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/07/2004, 12h47
  4. [VBA-E] Fonction sum() dans une cellule
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2002, 11h18
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 14h39

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