XL 2010 Empêcher la demande de sauvegarde pour un fichier non modifié utilisant un Complément Xlam

Zorgloub

XLDnaute Junior
Bonjour à la Communauté,

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à ;)

Merci.
 

Dranreb

XLDnaute Barbatruc
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.
 

job75

XLDnaute Barbatruc
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.

Fonctionne bien chez moi.
 

Zorgloub

XLDnaute Junior
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.

Fonctionne bien chez moi.
CTRL S provoque l'enregistrement du fichier ... et change donc la date de dernière sauvegarde ! Ce qui n'est pas le but recherché :(
 

Zorgloub

XLDnaute Junior
Juste pour savoir : tu veux que ton truc fonctionne avec tous les classeurs du monde ou seulement les tiens ?
?? 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...
 

job75

XLDnaute Barbatruc
CTRL S provoque l'enregistrement du fichier ... et change donc la date de dernière sauvegarde ! Ce qui n'est pas le but recherché :(
D'accord alors mettez ce code 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 "^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

- entrer la touche de raccourci m
 

Zorgloub

XLDnaute Junior
D'accord alors mettez ce code 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 "^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

- entrer la touche de raccourci m
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 ?
 

job75

XLDnaute Barbatruc
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.
Mais c'est ce qui se passe, vous n'avez donc pas compris ni essayé !

L'envoi des touches Ctrl+M c'est la fonction elle-même qui le fait.

L'utilisateur ne fait rien à part ouvrir le fichier, la fonction est autonome.
 

Zorgloub

XLDnaute Junior
Mais c'est ce qui se passe, vous n'avez donc pas compris ni essayé !

L'envoi des touches Ctrl+M c'est la fonction elle-même qui le fait.

L'utilisateur ne fait rien à part ouvrir le fichier, la fonction est autonome.
??! "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 !!!
 

Pièces jointes

  • PERSO.xlam
    16 KB · Affichages: 2
  • Test_Job_02.xlsm
    11.3 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjout Zorgloub, le forum,

Sur votre fichier PERSO.xlam les touches de raccourci Ctrl+M ne fonctionnent pas.

Vous ne les avez donc pas créées comme j'ai indiqué (avant d'enregistrer en .xlam).

Dans le fichier .xlsm joint j'ai créé ces touches de raccourci.

Téléchargez-le et enregistrez-le en .xlam.

A+
 

Pièces jointes

  • PERSO.xlsm
    14 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
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.
 

Zorgloub

XLDnaute Junior
Bonjout Zorgloub, le forum,

Sur votre fichier PERSO.xlam les touches de raccourci Ctrl+M ne fonctionnent pas.

Vous ne les avez donc pas créées comme j'ai indiqué (avant d'enregistrer en .xlam).

Dans le fichier .xlsm joint j'ai créé ces touches de raccourci.

Téléchargez-le et enregistrez-le en .xlam.

A+
@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...
 

Zorgloub

XLDnaute Junior
@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 !??
 

Pièces jointes

  • Argument Fonction.jpg
    Argument Fonction.jpg
    32.3 KB · Affichages: 4

Zorgloub

XLDnaute Junior
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.
Bonjour DranReb.

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
 

Pièces jointes

  • DranReb_02.xlsm
    11.5 KB · Affichages: 2
  • DranReb_01.xlsm
    13.3 KB · Affichages: 1
  • PERSO.xlam
    12.6 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
315 058
Messages
2 115 809
Membres
112 549
dernier inscrit
Kokliko