Comment récupérer en VBA la date et l'heure de modification d'un fichier ?
nf="Toto.Txt"
DateModifFichier = FileDateTime(nf)
DateModifFichier = FileDateTime(nf)
Jacques Boisgontier,
Ajouté ou modifié le 16/03/2008 (N°1981)
Ajouté ou modifié le 16/03/2008 (N°1981)
Y a-t-il un moyen de laisser une trace non modifiable de l'auteur d'un fichier Excel ?
Ce n'est pas simple et loin s'en faut, mais c'est faisable par exemple, en écrivant dans
le fichier un message codé à l'aide d'une clé basée sur un système de
hachage; clé que l'on peut écrire dans une propriété privée créée à l'aide
de CustomDocumentProperties. Cette clé peut être relue ultérieurement avec
la même fonction pour vérifier que ce ce fichier est bien le fichier
initial. Cela revient à avoir un fichier marqué de son sceau de manière
invisible et indélébile.
Une fonction de hachage peut être définie comme étant une fonction qui prend
une série binaire de donnée d'entrées de longueur arbitraire et qui produit
à la sortie une série de données binaire de longueur déterminée. La valeur
de sortie est ce que l'on nomme la valeur de hachage. Idéalement, pour
qu'une fonction de hachage produise une valeur de hachage équivalent à n
bits, la probabilité qu'une série de données choisie aléatoirement produise
une valeur de hachage de valeur n bits est de 2n. Il est mathématiquement
infaisable de trouver deux données d'entrée qui produisent la même valeur de
hachage et à partir d'une valeur de hachage donnée, il est mathématiquement
infaisable de trouver une valeur de donnée d'entrée qui produise la même
valeur de hachage. Les fonctions de hachage sont habituellement connues
publiquement et n'utilisent pas de Clé Secrète, elles sont utilisées pour
protéger l'intégrité des données et sont appellées Codes de Détection de
Modification (MDC). Un des Codes de Détection de Modification le plus
utilisé est le Secure Hash Algorithm (SHA) dont le plus connu est le
SHA-256 publié par l'Institut National des Standards Américain et de la
Technologie (NIST).
le fichier un message codé à l'aide d'une clé basée sur un système de
hachage; clé que l'on peut écrire dans une propriété privée créée à l'aide
de CustomDocumentProperties. Cette clé peut être relue ultérieurement avec
la même fonction pour vérifier que ce ce fichier est bien le fichier
initial. Cela revient à avoir un fichier marqué de son sceau de manière
invisible et indélébile.
Une fonction de hachage peut être définie comme étant une fonction qui prend
une série binaire de donnée d'entrées de longueur arbitraire et qui produit
à la sortie une série de données binaire de longueur déterminée. La valeur
de sortie est ce que l'on nomme la valeur de hachage. Idéalement, pour
qu'une fonction de hachage produise une valeur de hachage équivalent à n
bits, la probabilité qu'une série de données choisie aléatoirement produise
une valeur de hachage de valeur n bits est de 2n. Il est mathématiquement
infaisable de trouver deux données d'entrée qui produisent la même valeur de
hachage et à partir d'une valeur de hachage donnée, il est mathématiquement
infaisable de trouver une valeur de donnée d'entrée qui produise la même
valeur de hachage. Les fonctions de hachage sont habituellement connues
publiquement et n'utilisent pas de Clé Secrète, elles sont utilisées pour
protéger l'intégrité des données et sont appellées Codes de Détection de
Modification (MDC). Un des Codes de Détection de Modification le plus
utilisé est le Secure Hash Algorithm (SHA) dont le plus connu est le
SHA-256 publié par l'Institut National des Standards Américain et de la
Technologie (NIST).
Michel Pierron,
Ajouté ou modifié le 19/02/2006 (N°1735)
Ajouté ou modifié le 19/02/2006 (N°1735)
Comment extraire "zaza.xls" et "zaza" du chemin "F:\mondossier\monsousdossier\zaza.xls"
Pour récupérer "zaza.xls" :
Dim I As Integer
For I = Len(NomFic) To 1 Step -1
If Mid$(NomFic, I, 1) = "\" Then Exit For
Next
NomCourt = Mid$(NomFic, I + 1)
Pour récupérer "zaza" à partir de "zaza.xls"
SansExtension= Left(AvecExtension, Len(AvecExtension) - 4)
Dim I As Integer
For I = Len(NomFic) To 1 Step -1
If Mid$(NomFic, I, 1) = "\" Then Exit For
Next
NomCourt = Mid$(NomFic, I + 1)
Pour récupérer "zaza" à partir de "zaza.xls"
SansExtension= Left(AvecExtension, Len(AvecExtension) - 4)
Laurent Longre,
Ajouté ou modifié le 14/03/2005 (N°1543)
Ajouté ou modifié le 14/03/2005 (N°1543)
Comment connaître la taille (le poids) d'un classeur excel par VBA ?
Sub Taille()
Dim Fichier As String
Fichier = "c:\excel\à voir.xls"
With CreateObject("Scripting.FileSystemObject")
MsgBox .GetFile(Fichier).Size / 1024 & " Ko."
End With
End Sub
Dim Fichier As String
Fichier = "c:\excel\à voir.xls"
With CreateObject("Scripting.FileSystemObject")
MsgBox .GetFile(Fichier).Size / 1024 & " Ko."
End With
End Sub
Denis Michon,
Ajouté ou modifié le 30/05/2004 (N°1430)
Ajouté ou modifié le 30/05/2004 (N°1430)

Comment afficher dans un classeur le chemin du fichier, le nom de l'onglet...
Attention toutes les formules doivent être sur la même ligne !
1. Chemin d'accès complet :
=CELLULE("filename";A1)
C:\!DocFlo\disci3\xl\exemples\[fc-manipfichiers.xls]propriétés
2. Répertoire :
=GAUCHE(CELLULE("filename";A1);TROUVE("[";CELLULE("filename"
A1))-2)
C:\!DocFlo\excelabo\xl\exemples
3. Nom du classeur seul :
=STXT(CELLULE("filename";A1);TROUVE("[";CELLULE("filename";A
))+1;SOMME(TROUVE({"[";"]"};
CELLULE("filename";A1))*{-1;1})-1)
fc-manipfichiers.xls
4. Nom de la feuille
=STXT(CELLULE("filename";A1);TROUVE("]";CELLULE("filename";A
))+1;32)
propriétés
5. Répertoire + classeur :
=SUBSTITUE(GAUCHE(CELLULE("filename";A1);TROUVE("]";
CELLULE("filename";A1))-1);"[";"")
C:\!DocFlo\disci3\xl\exemples\fc-manipfichiers.xls
6. Nom du classeur et de la feuille :
=STXT(CELLULE("filename";A1);TROUVE("[";CELLULE("filename";A
));300)
[fc-manipfichiers.xls]propriétés
Cette astuce est illustrée dans ce classeur exemple :
fc-manipfichiers (téléchargé 10998 fois)
1. Chemin d'accès complet :
=CELLULE("filename";A1)
C:\!DocFlo\disci3\xl\exemples\[fc-manipfichiers.xls]propriétés
2. Répertoire :
=GAUCHE(CELLULE("filename";A1);TROUVE("[";CELLULE("filename"
A1))-2)
C:\!DocFlo\excelabo\xl\exemples
3. Nom du classeur seul :
=STXT(CELLULE("filename";A1);TROUVE("[";CELLULE("filename";A
))+1;SOMME(TROUVE({"[";"]"};
CELLULE("filename";A1))*{-1;1})-1)
fc-manipfichiers.xls
4. Nom de la feuille
=STXT(CELLULE("filename";A1);TROUVE("]";CELLULE("filename";A
))+1;32)
propriétés
5. Répertoire + classeur :
=SUBSTITUE(GAUCHE(CELLULE("filename";A1);TROUVE("]";
CELLULE("filename";A1))-1);"[";"")
C:\!DocFlo\disci3\xl\exemples\fc-manipfichiers.xls
6. Nom du classeur et de la feuille :
=STXT(CELLULE("filename";A1);TROUVE("[";CELLULE("filename";A
));300)
[fc-manipfichiers.xls]propriétés
fc-manipfichiers (téléchargé 10998 fois)
Laurent Longre, (N°717)
J'aimerais pouvoir numéroter les différentes versions de mes macros complémentaires.
Chaque document a 30 propriétés, définies ou non.
Tous ces propriétés sont accessibles à partir de l'explorateur :
un clic droit sur le fichier et item du menu "propriété".
Voici Une procédure pour faire une liste de ces procédures dans
ton classeur:
Sub ListeProprieteDuClasseur()
rw = 1
IndexPropriété = 1
Worksheets(1).Activate
For Each p In ActiveWorkbook.BuiltinDocumentProperties
Cells(rw, 1).Offset(0, 1).Value = p.Name
Cells(rw, 1).Value = IndexPropriété
rw = rw + 1
IndexPropriété = IndexPropriété + 1
Next
End Sub
ceci te donnera l'index et l'intitulé de chacune des propriétés
le chiffre 8 représente "Revision number" du document. Tu peux donc l'utiliser
en te créant une fonction personnalisée :
Public Function PDerVersion()
PDerVersion = ActiveWorkbook.BuiltinDocumentProperties(8).Value
End Function
Dans ta feuille : saisis la formule : =PDerVersion().
Classeur de démo : fc-manipfichiers
Cette astuce est illustrée dans ce classeur exemple :
fc-manipfichiers (téléchargé 10998 fois)
Tous ces propriétés sont accessibles à partir de l'explorateur :
un clic droit sur le fichier et item du menu "propriété".
Voici Une procédure pour faire une liste de ces procédures dans
ton classeur:
Sub ListeProprieteDuClasseur()
rw = 1
IndexPropriété = 1
Worksheets(1).Activate
For Each p In ActiveWorkbook.BuiltinDocumentProperties
Cells(rw, 1).Offset(0, 1).Value = p.Name
Cells(rw, 1).Value = IndexPropriété
rw = rw + 1
IndexPropriété = IndexPropriété + 1
Next
End Sub
ceci te donnera l'index et l'intitulé de chacune des propriétés
le chiffre 8 représente "Revision number" du document. Tu peux donc l'utiliser
en te créant une fonction personnalisée :
Public Function PDerVersion()
PDerVersion = ActiveWorkbook.BuiltinDocumentProperties(8).Value
End Function
Dans ta feuille : saisis la formule : =PDerVersion().
Classeur de démo : fc-manipfichiers
fc-manipfichiers (téléchargé 10998 fois)
Denis Michon, (N°716)

Je souhaiterais modifier les mots clés enregistrés dans les propriétés d'un classeur via un
routine VBA pour permettre une recherche ultérieure par mots clés.
ThisWorkbook.BuiltinDocumentProperties(4) = MesMostCles
MesMotsCles étant une chaîne de caractères.
MesMotsCles étant une chaîne de caractères.
Pierre Fauconnier, (N°715)
Comment peut-on savoir par VBA si le classeur est ouvert sur un mac ou sur un PC ?
Tu peux savoir si tu es sur PC ou sur Mac en utilisant la propriété
OperatingSystem de l'objet Application. Selon l'aide :
"Cette propriété renvoie le nom et le numéro de version du système
d'exploitation en cours, par exemple « Windows (32 bits) 4.00 » ou « Macintosh
7.00 ». Type de données String en lecture seule."
OperatingSystem de l'objet Application. Selon l'aide :
"Cette propriété renvoie le nom et le numéro de version du système
d'exploitation en cours, par exemple « Windows (32 bits) 4.00 » ou « Macintosh
7.00 ». Type de données String en lecture seule."
Frédéric Sigonneau, (N°714)
Comment indiquer les dates de création et de modification d'un classeur
Il y a plusieurs possibilités. Certaines sont peu fiables (comme GetDateModif ).
Ce qui fonctionne :
A mettre dans le module thisworkbook :
Private Sub Workbook_Open()
Sheets(1).[A1] = "Date de création : le " _
& Format(ActiveWorkbook.BuiltinDocumentProperties(11), _
"dd/mm/yyyy")
Sheets(1).[A2] = "Dernier enregistrement : le " _
& Format(ActiveWorkbook.BuiltinDocumentProperties(12), _
"dd/mm/yyyy hh:mm")
End Sub
Pour afficher de façon encore plus sure la date de modif :
Toujours dans le module this workbook :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets(1).Range("A22").Value = "Date de dernière modification : " & Now
End Sub
et un classeur de démo à télécharger pour voir le résultat.
Cette astuce est illustrée dans ce classeur exemple :
fc-manipfichiers (téléchargé 10998 fois)
Ce qui fonctionne :
A mettre dans le module thisworkbook :
Private Sub Workbook_Open()
Sheets(1).[A1] = "Date de création : le " _
& Format(ActiveWorkbook.BuiltinDocumentProperties(11), _
"dd/mm/yyyy")
Sheets(1).[A2] = "Dernier enregistrement : le " _
& Format(ActiveWorkbook.BuiltinDocumentProperties(12), _
"dd/mm/yyyy hh:mm")
End Sub
Pour afficher de façon encore plus sure la date de modif :
Toujours dans le module this workbook :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets(1).Range("A22").Value = "Date de dernière modification : " & Now
End Sub
et un classeur de démo à télécharger pour voir le résultat.
fc-manipfichiers (téléchargé 10998 fois)
ChrisV, Frédéric Sigonneau, Denis Michon, (N°713)
Je voudrais afficher dans un classeur la date de la dernière modification effectuée dans un
classeur mais que la simple ouverture/fermeture de celui-ci ne modifie pas cette information.
A mettre dans le module thisworkbook:
Dim modif As Boolean
**********
Private Sub Workbook_Open()
modif = False
End Sub
**********
Private Sub
Workbook_BeforeClose(Cancel As Boolean)
If modif = True Then
Sheets("trucchouette").Range("D1").Value = "Dernière modif le " & Format(Date, _
"dd/mm/yyyy") & " " & Format(Time, "hh:mm") 'c'est là que la date de modif s'affiche
End If
End Sub
**********
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
modif = True
End Sub
**********
Dim modif As Boolean
**********
Private Sub Workbook_Open()
modif = False
End Sub
**********
Private Sub
Workbook_BeforeClose(Cancel As Boolean)
If modif = True Then
Sheets("trucchouette").Range("D1").Value = "Dernière modif le " & Format(Date, _
"dd/mm/yyyy") & " " & Format(Time, "hh:mm") 'c'est là que la date de modif s'affiche
End If
End Sub
**********
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
modif = True
End Sub
**********
Jean-Paul Sabatier, Popi, Flo Cabon, (N°712)
J'ai des classeurs liés et je voudrais savoir la date de mise à jour des sources à la mise à
jour des liaisons j'afficherai un petit msg "Dernière maj le 31/8/2001"
Sub RechercheLiaisons()
Liaisons = ActiveWorkbook.LinkSources(xlExcelLinks)
If Not IsEmpty(Liaisons) Then
For n = 1 To UBound(Liaisons)
msg = msg & " La liaison " & Liaisons(n) & " à été mise à jour le : " &
FileDateTime(Liaisons(n)) & vbCr
Next n
MsgBox msg, vbOKOnly, "Etat des liaisons du classeur"
End If
End Sub
Liaisons = ActiveWorkbook.LinkSources(xlExcelLinks)
If Not IsEmpty(Liaisons) Then
For n = 1 To UBound(Liaisons)
msg = msg & " La liaison " & Liaisons(n) & " à été mise à jour le : " &
FileDateTime(Liaisons(n)) & vbCr
Next n
MsgBox msg, vbOKOnly, "Etat des liaisons du classeur"
End If
End Sub
Benead, (N°711)