Voilà, j'ai créé un petit fichier Xlam pour afficher la date de dernière sauvegarde, dont voici le simple code:
Function LastSaved() As Date
LastSaved = ActiveWorkbook.BuiltinDocumentProperties("Last Save Time")
End Function
J'ai coché l'activation de ce "Complément" dans l'onglet Développeur.
La réponse est bien correcte lorsque je tape, dans une cellule, la fonction suivante: =LastSaved().
Xlam parceque je ne désire pas sauver ce fichier "mode Macro" et donc conserver un format xlsx.
1) Le problème qui me gêne est qu'à la fermeture du fichier, Excel me demande si je veux sauver le fichier même si je n'y ai apporté aucune modification !
Je voudrais éviter cette question inutile (puisque pas de modification apportée) pour éviter de fausser la date réelle de dernière sauvegarde.. notamment si par mégarde je répondais Oui !
La désactivation des calculs automatiques ou des liaisons vers d'autres documents ne solutionne pas ce "problème".
2) Accessoirement, que faudrait-il ajouter à ce code pour formater directement la cellule en Format DATE ?
Si vous avez une solution... je suis preneur et je vous en remercie déjà
Fermez les classeurs (de macros et celui l'utilisant) en enregistrant les modifications puis rouvrez les. C'est à l'ouverture du classeur de macros qu'est initialisé l'objet XL permettant de prendre en charge les évènements de niveau global Excel.
Bon j'ai une solution; mettez ceci dans Perso.xlam :
VB:
Function LastDate() As String 'La cellule se formate automatiquement en Date/heure
Application.Volatile
Static n 'mémorise la variable
LastDate = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
n = n + 1
If n = 1 Then CreateObject("WScript.Shell").SendKeys "^s" 'envoi de touches qui enregistre le fichier
End Function
L'enregistrement du fichier se fait en différé par l'envoi des touches Ctrl+S.
Bon j'ai une solution; mettez ceci dans Perso.xlam :
VB:
Function LastDate() As String 'La cellule se formate automatiquement en Date/heure
Application.Volatile
Static n 'mémorise la variable
LastDate = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
n = n + 1
If n = 1 Then CreateObject("WScript.Shell").SendKeys "^s" 'envoi de touches qui enregistre le fichier
End Function
L'enregistrement du fichier se fait en différé par l'envoi des touches Ctrl+S.
?? Ben je voudrais en effet qu'au moins ca marche chez moi !
Et tous les classeurs du monde serait encore mieux
MAis bon... ca semble insoluble ce truc et je viens de m'arracher mes derniers cheveux
Quand je vois que c'est si facilement prévu dans Word !!!
Bon, ben je pense que je vais laisser tomber l'usage du xlam et me "contenter" de placer ma fonction dans le module du ou des fichiers que j'utilise...
Function LastDate() As String 'La cellule se formate automatiquement en Date/heure
Application.Volatile
Static n 'mémorise la variable
LastDate = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
n = n + 1
If n = 1 Then CreateObject("WScript.Shell").SendKeys "^m" 'exécute Macro en différé
End Function
Sub Macro()
'se lance par les touches Ctrl+M
ActiveWorkbook.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub
L'envoi des touches Ctrl+M (raccourci clavier) lance la macro Macro en différé.
Pour créer le raccourci clavier sur le fichier avant son enregistrement en .xlam :
- touches Alt+F8 qui affichent la boîte Macro => cic sur Options
Function LastDate() As String 'La cellule se formate automatiquement en Date/heure
Application.Volatile
Static n 'mémorise la variable
LastDate = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
n = n + 1
If n = 1 Then CreateObject("WScript.Shell").SendKeys "^m" 'exécute Macro en différé
End Function
Sub Macro()
'se lance par les touches Ctrl+M
ActiveWorkbook.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub
L'envoi des touches Ctrl+M (raccourci clavier) lance la macro Macro en différé.
Pour créer le raccourci clavier sur le fichier avant son enregistrement en .xlam :
- touches Alt+F8 qui affichent la boîte Macro => cic sur Options
Merci. Bon, verdict: Ctrl M ne règle pas le problème. Alt F8 ouvre bien la boîte de dialogue des macro où j'écris le nom de la macro. Et là ca marche.
Cependant, la fonction du Xlam ne pourrait-elle appeler cette macro pour que cette fonction soit "autonome" comme une fonction native de Excel qui ne demande aucune manipulation complémentaire pour l'utilisateur.
Ce qui était la question initiale de nos échanges ?
Cependant, la fonction du Xlam ne pourrait-elle appeler cette macro pour que cette fonction soit "autonome" comme une fonction native de Excel qui ne demande aucune manipulation complémentaire pour l'utilisateur.
??! "Je n'ai pas essayé" ?!!!! Mais bien sûr que j'ai essayé... et pas qu'une fois !!!!
Ca fait mille fois que je relis l'ensemble de ces posts.
Et il n'y a rien d'autre à comprendre que c'est la fonction de xlam qui devrait maintenant appeler la macro.
Je ne suis pas là pour vous perdre votre temps... et je recherche la solution à cette question qui me semblait élémentaire.
Vu l'heure, tu imagines que je m'y colle depuis longtemps, avec application, et attention. MAIS La demande d'enregistrement subsiste même si je n'ai pas fait de modification...
Et je ne demande pas à l'utilisateur de taper Ctrl M, puisque c'est censé se faire automatiquement pour rendre la fonction "autonome".
Mais ... la fonction n'appelle donc pas votre macro !!!
Bonjour.
Je vous signale quand même que dans Test_Job_02.xlsm du poste #84, contrairement à ce que vous disiez au poste #75, =DernSvg ne renvoie pas 0 mais 45642,58285, ce qui par format jj/mm/aaaa hh:mm:ss affiche 16/12/2024 13:59:18
Cela ressemble quand même furieusement au fruit du code proposé au poste #69 pour le ThisWorkbook du PERSO.xlam, qui l'aurait rectifié lors de l'ouverture du Test_Job_02.xlsm …
Personnellement je préfèrerais néanmoins la rectifier plutôt à sa sauvegarde :
VB:
Option Explicit
Private WithEvents XL As Application
Private Sub Workbook_Open()
Set XL = Application
End Sub
Private Sub XL_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Nam As Name
On Error Resume Next
Set Nam = Wb.Names("DernSvg")
On Error GoTo 0
If Nam Is Nothing Then Exit Sub
Nam.RefersTo = Now
End Sub
Remarque: chez moi, y laissant ce code, l'ouvrant d'abord, puis le Test_Job_02.xlsm, à la fermeture du Test_Job_02.xlsm sans rien avoir changé, il ne me demande pas si je veux enregistrer les modifications.
@job: Merci pour la suite de ces débats.
Suivant tes explications claires, j'ai donc téléchargé ton xlsm, que j'ai renommé Xlam, et replacé dans le répeertoire des addins.
Ce qui a écrasé mon Perso.xlam pour utiliser ta bonne version.
A l'ouverture d'Excel j'ai cependant le message suivant:
<!>Impossible d'ouvrir le fichier <PERSo.xlam" car son format ou son extension n'est pas valide. Vérifiez que le fichier n'est pas endommagé et que son extension correspond bien au format du fichier.
Peut-être un problème de version des Excel ? (Moi:Excel 2010)
Je vais tenter de recréer mon xlam avec la manipulation Ctrl+M AVANT de le sauvegarder en xlam...
@job: Merci pour la suite de ces débats.
Suivant tes explications claires, j'ai donc téléchargé ton xlsm, que j'ai renommé Xlam, et replacé dans le répeertoire des addins.
Ce qui a écrasé mon Perso.xlam pour utiliser ta bonne version.
A l'ouverture d'Excel j'ai cependant le message suivant:
<!>Impossible d'ouvrir le fichier <PERSo.xlam" car son format ou son extension n'est pas valide. Vérifiez que le fichier n'est pas endommagé et que son extension correspond bien au format du fichier.
Peut-être un problème de version des Excel ? (Moi:Excel 2010)
Je vais tenter de recréer mon xlam avec la manipulation Ctrl+M AVANT de le sauvegarder en xlam...
@job: J'ai donc recréé correctement mon Perso.xlam avec ma version Excel2010
Lorsque j'utilise la fonction LastDate(), j'ai un message relatif à "Arguments de la fonction".
-->Voir Print-Screen image attachée.
A la fermeture, il me demande évidemment de sauver puisqu'on vient de mettre nouvellement la fonction.
1) Si j'ouvre ensuite une Première fois le fichier sans rien modifier: OK, il ferme sans message.
2) MAIS...si j'ouvre une deuxième fois, de nouveau la foutue demande d'enregistrer réapparait !??
Bonjour.
Je vous signale quand même que dans Test_Job_02.xlsm du poste #84, contrairement à ce que vous disiez au poste #75, =DernSvg ne renvoie pas 0 mais 45642,58285, ce qui par format jj/mm/aaaa hh:mm:ss affiche 16/12/2024 13:59:18
Cela ressemble quand même furieusement au fruit du code proposé au poste #69 pour le ThisWorkbook du PERSO.xlam, qui l'aurait rectifié lors de l'ouverture du Test_Job_02.xlsm …
Personnellement je préfèrerais néanmoins la rectifier plutôt à sa sauvegarde :
VB:
Option Explicit
Private WithEvents XL As Application
Private Sub Workbook_Open()
Set XL = Application
End Sub
Private Sub XL_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Nam As Name
On Error Resume Next
Set Nam = Wb.Names("DernSvg")
On Error GoTo 0
If Nam Is Nothing Then Exit Sub
Nam.RefersTo = Now
End Sub
Remarque: chez moi, y laissant ce code, l'ouvrant d'abord, puis le Test_Job_02.xlsm, à la fermeture du Test_Job_02.xlsm sans rien avoir changé, il ne me demande pas si je veux enregistrer les modifications.
Merci aussi à toi de suivre ces Posts… palpitants )
A défaut de cheveux arrachés, j’en suis maintenant à la peau du crâne )
Prochaine étape... à éviter… l’os
Difficile de suivre simultanément tes posts et ceux de Job en modifiant chaque fois mon Perso.xlam..
Je vous remercie tous ici !
J’ai essayé tes deux fonctions.
Elles fonctionnent bien pour ce qui est de ne plus voir la demande d’enregistrement dans le cas où il n’y a pas eu de modif dans le fichier.
Cependant, si j’enregistre… la date reste figée et ne correspond plus à la date de dernier enregistrement !
Encore plus bizarre je crée deux fichiers avec la même fonction. (DanReb_01 et 02.xlsm)
Le premier fonctionne mais avec la fâcheuse restriction énoncée ci-avant.
Le deuxième me donne une erreur à la fonction (#NOM ?) !???
Pshittttttttttt