Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Propriétés d'un fichier

6 réponses
Avatar
Patrick
Bonjour,

En VBA, j'aimerais pouvoir lire les propriétés d'un fichier Excel (Titre,
Sujet, Auteur, Catégories, Mots clés, ...) que je ne veux pas ouvrir. Est-ce
que c'est possible ?
Y a-t-il, par exemple, des API qui permettent de le faire ?

Merci beaucoup pour votre aide.

--
Patrick

6 réponses

Avatar
michdenis
Bonjour,

Essaie ceci :

Attention aux coupures de certaines lignes de code par
le service de messagerie.
'--------------------------------------------
Sub Attribut_Fichier()
Dim objShell As Object, objFolder As Object
Dim objFolderItem As Object, A As Integer
Dim Folder As Variant, Fichier As String

'***********Variables*************
Folder = "C:UsersDMDocuments"
Fichier = "Classeur1.xls"
'**********************************

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Folder)

If Not objFolder Is Nothing Then
Set objFolderItem = objFolder.ParseName(Fichier)
If Not objFolderItem Is Nothing Then
With Worksheets("Feuil1")
.Range("A1") = "Nom du fichier"
.Range("B1") = Fichier
For A = 1 To 14
.Range("A" & A + 1) = objFolder.GetDetailsOf(objFolder.items, A)
.Range("B" & A + 1) = objFolder.GetDetailsOf(objFolderItem, A)
Next
.Range("A:B").EntireColumn.AutoFit
End With
End If
Set objFolderItem = Nothing
End If

Set objFolder = Nothing
Set objShell = Nothing
End Sub
'--------------------------------------------




"Patrick" a écrit dans le message de groupe de discussion :

Bonjour,

En VBA, j'aimerais pouvoir lire les propriétés d'un fichier Excel (Titre,
Sujet, Auteur, Catégories, Mots clés, ...) que je ne veux pas ouvrir. Est-ce
que c'est possible ?
Y a-t-il, par exemple, des API qui permettent de le faire ?

Merci beaucoup pour votre aide.

--
Patrick
Avatar
eneric
> Bonjour,



j'ai testé ton code il fonctionne
mais il y a des champs qui restent vides
comme auteur, titre, categorie
alors que dans mes proprietés tout est ok
merci michdenis

--
eneric
Avatar
michdenis
Le code traite les propriétés d'un fichier "FERMÉ".
On ne peut obtenir plus que ce que la méthode peut donner !
Tu peux consulter cette adresse :
http://support.microsoft.com/kb/224351

Si le fichier est ouvert, tu peux employer ceci :
"CustomDocumentProperties" voir l'aide Excel-VBA.
Tu vas alors obtenir les propriétés que tu désires.



"eneric" a écrit dans le message de groupe de discussion :

Bonjour,



j'ai testé ton code il fonctionne
mais il y a des champs qui restent vides
comme auteur, titre, categorie
alors que dans mes proprietés tout est ok
merci michdenis

--
eneric
Avatar
Patrick
Merci.

--
Patrick


"michdenis" wrote:

Bonjour,

Essaie ceci :

Attention aux coupures de certaines lignes de code par
le service de messagerie.
'--------------------------------------------
Sub Attribut_Fichier()
Dim objShell As Object, objFolder As Object
Dim objFolderItem As Object, A As Integer
Dim Folder As Variant, Fichier As String

'***********Variables*************
Folder = "C:UsersDMDocuments"
Fichier = "Classeur1.xls"
'**********************************

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Folder)

If Not objFolder Is Nothing Then
Set objFolderItem = objFolder.ParseName(Fichier)
If Not objFolderItem Is Nothing Then
With Worksheets("Feuil1")
.Range("A1") = "Nom du fichier"
.Range("B1") = Fichier
For A = 1 To 14
.Range("A" & A + 1) = objFolder.GetDetailsOf(objFolder.items, A)
.Range("B" & A + 1) = objFolder.GetDetailsOf(objFolderItem, A)
Next
.Range("A:B").EntireColumn.AutoFit
End With
End If
Set objFolderItem = Nothing
End If

Set objFolder = Nothing
Set objShell = Nothing
End Sub
'--------------------------------------------




"Patrick" a écrit dans le message de groupe de discussion :

Bonjour,

En VBA, j'aimerais pouvoir lire les propriétés d'un fichier Excel (Titre,
Sujet, Auteur, Catégories, Mots clés, ...) que je ne veux pas ouvrir. Est-ce
que c'est possible ?
Y a-t-il, par exemple, des API qui permettent de le faire ?

Merci beaucoup pour votre aide.

--
Patrick



Avatar
FS
Bonjour,

Peut-être avec une autre approche (qui n'est pas parfaite non plus) ?

Dans un module de code ordinaire de n'importe quel classeur :

'======================================= 'L'objet OleDocumentProperties permet de récupérer des informations
'sur les propriétés d'un classeur *fermé* dont certaines ne sont pas
'accessibles par la collection BuiltinDocumentProperties.
'
'Pour utiliser cet objet, il faut ajouter au classeur (par
OutilsRéférences)
'une référence à la bibliothèque
' "DSO OLE Document Properties Reader 2.1" (version actuelle au 6/2/2010)
'
'ou, ce qui est le cas ici, utiliser le "late binding" (liaison OLE tardive)
'qui ne nécessite pas de référence, mais malgré tout la présence du
'fichier dsofile.dll sur la machine.
'
'Cette bibliothèque (dll) n'est pas fournie avec toutes les versions
d'office.
'Si elle n'est pas installée sur ta machine, elle est en téléchargement
'gratuit à cette adresse :
' http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q224351
'
'Le code ci-dessous permet de récupérer un tableau de 21 des propriétés
'd'un fichier ou la valeur d'une des propriétés accessibles.
'A noter enfin que ce code fonctionne avec d'autres applications (Word
par ex).

Sub test()
Dim Fich$, S$, Arr
Fich = "D:fsdatas0Mes Docs ExcelTestDataToRead.xls"
Arr = ReadProperties(Fich)
Sheets.Add
For i = LBound(Arr) To UBound(Arr)
Cells(i + 1, "a").Value = NomsDesPropriétés(i)
Cells(i + 1, "b").Value = Arr(i)
Next
End Sub

'renvoie dans un tableau 21 des propriétés d'un fichier
Function ReadProperties(CheminAcces$)
Dim DSO As Object
Dim ArrProps

Set DSO = CreateObject("DSOFile.OleDocumentProperties")
With DSO
.Open (CheminAcces): NomDoc = .Name
LectureSeule = .IsReadOnly: Chemin = .Path
On Error Resume Next
IDProgramme = .progID
On Error GoTo 0
End With

With DSO.SummaryProperties
'ceci peut être modifié pour lire plus de propriétés
ArrProps = _
Array(.ApplicationName, .Author, .Category, .CharacterCount, _
.Comments, .Company, .DateCreated, .DateLastPrinted, _
.DateLastSaved, .LastSavedBy, NomDoc, .PageCount, _
LectureSeule, Chemin, IDProgramme, .SharedDocument, _
.Subject, .Template, .Title, .Version, .WordCount)
End With

DSO.Close
ReadProperties = ArrProps

End Function

Function NomsDesPropriétés()

NomsDesPropriétés = _
Array("Application", "Auteur", "Catégorie", _
"Nombre de caractères", "Commentaires", "Entreprise", _
"Date de création", "Date dernière impression", _
"Date dernier enregistrement", "Dernier enregistrement par", _
"Nom", "Nombre de pages", "Lecture seule", "Chemin", _
"Référence de la classe", "Document partagé", _
"Sujet", "Modèle", "Titre", "Version", "Nombre de mots")
End Function
'=======================================
(testé avec Excel 2003 et 2007)

Par ailleurs, pour récupérer avec le code de Denis le titre ou la
catégorie il faut augmenter un peu le nombre de champs renvoyés en
modifiant la ligne :

For A = 1 To 14

Remplace par exemple 14 par 19, ou par 35 si des propriétés "multimedia"
t'intéressent.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

eneric a écrit :
Bonjour,



j'ai testé ton code il fonctionne
mais il y a des champs qui restent vides
comme auteur, titre, categorie
alors que dans mes proprietés tout est ok
merci michdenis



Avatar
eneric
Bonjour fs
je viens de tester ton code (modifié pour le nom du fichier et des
colonnes)
j'ai une erreur 429 "un composant activeX ne peut pas creer d'objet"
au debogage :
Set DSO = CreateObject("DSOFile.OleDocumentProperties")
une piste? peut etre une reference manquante?
andre
Bonjour,

Peut-être avec une autre approche (qui n'est pas parfaite non plus) ?

Dans un module de code ordinaire de n'importe quel classeur :

'======================================= > 'L'objet OleDocumentProperties permet de récupérer des informations
'sur les propriétés d'un classeur *fermé* dont certaines ne sont pas
'accessibles par la collection BuiltinDocumentProperties.
'
'Pour utiliser cet objet, il faut ajouter au classeur (par OutilsRéférences)
'une référence à la bibliothèque
' "DSO OLE Document Properties Reader 2.1" (version actuelle au 6/2/2010)
'
'ou, ce qui est le cas ici, utiliser le "late binding" (liaison OLE tardive)
'qui ne nécessite pas de référence, mais malgré tout la présence du
'fichier dsofile.dll sur la machine.
'
'Cette bibliothèque (dll) n'est pas fournie avec toutes les versions
d'office.
'Si elle n'est pas installée sur ta machine, elle est en téléchargement
'gratuit à cette adresse :
' http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q224351
'
'Le code ci-dessous permet de récupérer un tableau de 21 des propriétés
'd'un fichier ou la valeur d'une des propriétés accessibles.
'A noter enfin que ce code fonctionne avec d'autres applications (Word par
ex).

Sub test()
Dim Fich$, S$, Arr
Fich = "D:fsdatas0Mes Docs ExcelTestDataToRead.xls"
Arr = ReadProperties(Fich)
Sheets.Add
For i = LBound(Arr) To UBound(Arr)
Cells(i + 1, "a").Value = NomsDesPropriétés(i)
Cells(i + 1, "b").Value = Arr(i)
Next
End Sub

'renvoie dans un tableau 21 des propriétés d'un fichier
Function ReadProperties(CheminAcces$)
Dim DSO As Object
Dim ArrProps

Set DSO = CreateObject("DSOFile.OleDocumentProperties")
With DSO
.Open (CheminAcces): NomDoc = .Name
LectureSeule = .IsReadOnly: Chemin = .Path
On Error Resume Next
IDProgramme = .progID
On Error GoTo 0
End With

With DSO.SummaryProperties
'ceci peut être modifié pour lire plus de propriétés
ArrProps = _
Array(.ApplicationName, .Author, .Category, .CharacterCount, _
.Comments, .Company, .DateCreated, .DateLastPrinted, _
.DateLastSaved, .LastSavedBy, NomDoc, .PageCount, _
LectureSeule, Chemin, IDProgramme, .SharedDocument, _
.Subject, .Template, .Title, .Version, .WordCount)
End With

DSO.Close
ReadProperties = ArrProps

End Function

Function NomsDesPropriétés()

NomsDesPropriétés = _
Array("Application", "Auteur", "Catégorie", _
"Nombre de caractères", "Commentaires", "Entreprise", _
"Date de création", "Date dernière impression", _
"Date dernier enregistrement", "Dernier enregistrement par", _
"Nom", "Nombre de pages", "Lecture seule", "Chemin", _
"Référence de la classe", "Document partagé", _
"Sujet", "Modèle", "Titre", "Version", "Nombre de mots")
End Function
'======================================= >
(testé avec Excel 2003 et 2007)

Par ailleurs, pour récupérer avec le code de Denis le titre ou la catégorie
il faut augmenter un peu le nombre de champs renvoyés en modifiant la ligne :

For A = 1 To 14

Remplace par exemple 14 par 19, ou par 35 si des propriétés "multimedia"
t'intéressent.

FS



--
eneric