Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2006, 20h32   #1
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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 :
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 20h40   #2
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
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.
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 20h48   #3
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 20h58   #4
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
Voila les arguments possibles :
Citation:
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.
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h12   #5
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h15   #6
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
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.
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h26   #7
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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 ?
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h30   #8
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
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 :
Citation:
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...
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h42   #9
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h48   #10
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
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...
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h52   #11
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 21h55   #12
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
Ne possédant pas ta version, je ne peux ni vérifier, ni confirmer, ni infirmer...
D'autres le feront sans doute à ma place...
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2006, 23h38   #13
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 671
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 671
Points : 7 687
Points : 7 687
Citation:
Envoyé par jmfmarques
Voila les arguments possibles :
Citation:
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.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 07h34   #14
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
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 :
Citation:
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
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 08h30   #15
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
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 :
Citation:
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.
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 09h25   #16
Expert Confirmé
 
Inscription : mai 2005
Messages : 3 419
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 3 419
Points : 3 768
Points : 3 768
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
random est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 09h29   #17
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 671
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 671
Points : 7 687
Points : 7 687
Citation:
Envoyé par jmfmarques
Citation:
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...???
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 09h30   #18
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 09h38   #19
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2006, 09h45   #20
Nouveau Membre du Club
 
Inscription : février 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 106
Points : 25
Points : 25
Citation:
Envoyé par ouskel'n'or
Tout ça ne répond pas à ta question. Quand tu fais ça
Citation:
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.
Mersenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h59.


 
 
 
 
Partenaires

Hébergement Web