Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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.
 

Zorgloub

XLDnaute Junior
Je viens de tester ceci qui a l'air de fonctionner :
VB:
Function LastSaved() As Date
    LastSaved = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm")
End Function
Ca ressemble à ce que j'avais essayé et j'obtiens le même résultat :
Si je n'ai pas formaté préalablement et manuellement ma cellule, j'obtiens la valeur chiffrée, non formatée suivante: 45632 6375
 

TooFatBoy

XLDnaute Barbatruc
Ah oui, au temps pour moi.

Format retourne une chaîne de caractères, donc tu peux inscrire une chaîne dans ta cellule.
Mais il faudra bien que tu gardes à l'esprit que c'est du texte et non une date.

VB:
Function LastSaved() As String
    LastSaved = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm")
End Function
 

Zorgloub

XLDnaute Junior
A oui, là ca apparaît correctement.
Mais dernier Bémol : la cellule ne se remet pas à jour si on fait un enregistrement ultérieurement, contrairement, par exemple, à une fonction comme "=maintenant()" .
 

TooFatBoy

XLDnaute Barbatruc
la cellule ne se remet pas à jour si on fait un enregistrement ultérieurement, contrairement, par exemple, à une fonction comme "=maintenant()" .
Avec Applicaion.Volatile, ça devrait se remettre à jour quand il y aura un recalcul d'une cellule.

VB:
Function LastSaved() As String
    Application.Volatile
    LastSaved = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm")
End Function

Sinon, je ne sais pas faire mieux.
 

Zorgloub

XLDnaute Junior
Merciiiiiiii. Et bien c'est PARFAIT, on bouge plus ) Ca fonctionne correctely comme attendu !
Pour le Fun, je regarderai ensuite comment créer une fonction perso, dans un fichier xlam, qui copierait ta belle macro dans le ThisWorkbook d'un autre fichier ouvert...
 

Zorgloub

XLDnaute Junior
TooFatBoy: Et pour info complémentaire, ta fonction:

Function LastSaved() As String
Application.Volatile
LastSaved = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm")
End Function

fonctionne aussi correctement si elle est placée dans un fichier PERSO.xlam pour pouvoir être utilisée dans n'importe quel fichier ultérieurement créé.
Notons cependant que la Macro dans ThisWorkbook reste indispensable pour éviter les demandes d'enregistrement intempestives même s'il n'y a pas eu de modif.
Ce qui était bien la question initiale.

Finalement, l'idéal serait que ces routines placées dans ThisWorkbook fassent partie de la fonction LastSaved du fichier PERSO.xlam et "viennent se copier" dans le ThisWorkbook du fichier utilisé lors de l'appel de la fonction...

Bon WE à toutes et tous.
 
Dernière édition:

Zorgloub

XLDnaute Junior
En complément de cet échange, je viens d'essayer cette petite macro minimaliste qui fait le boulot en utilisant la commande NOW.

La date de dernier enregistrement ne change que si on donne l'ordre d'enregistrer.
Ainsi, si on n'a fait que consulter le document sans y apporter de modification, Excel fermera sans demander d'enregistrer. On conservera ainsi la date de finalisation (dernière version validée) de ce document.

VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Sheets(1).[A1] = "LastSaved : "

    Range("A1").Select

    Selection.HorizontalAlignment = xlRight


Sheets("Feuil1").[B1] = Now

Range("B1").Select

    Selection.NumberFormat = "dd/mm/yyyy hh:mm:ss"


 Sheets("Feuil1").Columns(2).AutoFit


End Sub

Les premières lignes écrivant "LastSaved:" en A1 sont optionnelles si on écrit soi-même une fois pour toutes ce titre invariable en A1.
De même pour l'AutoFit de la colonne B qui reste optionnel.

ENJOY !
 

Zorgloub

XLDnaute Junior
Fonction dans PERSO.xlam pour écrire un code dans ThisWorkbook ?
Je ne sais si je dois créer un nouveau Post ou continuer ici … ?

Sur base de ce que nous avons échangé ici, je fais des essais avec un petit fichier PERSO Xlam pour créer une fonction qui donne la date du dernier enregistrement du fichier en utilisant les BuiltinDocumentProperties :

Deux fonctions possibles à placer dans mon PERSO.xlam :

VB:
Function SavDate() As Date    ‘Il faudra formater manuellement la cellule en Date/Heure
 SavDate = ActiveWorkbook.BuiltinDocumentProperties("Last Save Time")
End Function

ou

Function LastDate() As String    ‘La cellule se formate automatiquement en Date/heure
  Application.Volatile
  LastDate = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
End Function

L’une et l’autre fonctionnent bien mais lorsque je consulte ultérieurement ce fichier sans y apporter de modification, Excel demande intempestivement si on veut enregistrer.
Ce qui modifierait ma date de dernière version finalisée si je répondais OUI par inadvertance.

comme vu ci-avant, on peut donc pallier cet inconvénient en ajoutant la petite macro suivante dans le ThisWorkbook du fichier en cours de consultation :

Code:
Private Sub Workbook_Open()
 ThisWorkbook.Saved = True
End Sub

_Ma question est simple :

Est-il possible que l’utilisation de ma fonction (PERSO.xlam) =SavDate() aille aussi écrire le code précité dans le ThisWorkbook du fichier ouvert ?

Et si oui… par quel code complémentaire dans cette fonction SavDate() du module xlam ?

Merci pour votre aide précieuse.
 

job75

XLDnaute Barbatruc
Bonsoir,
Est-il possible que l’utilisation de ma fonction (PERSO.xlam) =SavDate() aille aussi écrire le code précité dans le ThisWorkbook du fichier ouvert ?
Une fonction n'écrit rien du tout mais mettez simplement dans le fichier .xlsm ouvert :

- dans une cellule quelconque la formule =LastDate()

- ce code dans ThisWorkbook :
VB:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub
La formule est volatile et crée donc l'évènement Calculate.

A+
 

Zorgloub

XLDnaute Junior
Hi Job75,
Si une Fonction ne sait rien écrire, peut-être peut-elle alors faire appel à une Macro se trouvant aussi dans mon PERSO.xlam et qui se chargerait d'effectuer cette écriture dans le ThisWorkbook du fichier utilisé ?

Le but est ici d'obtenir une fonction "autonome" qui ne demande pas à l'utilisateur d'aller écrire dans l'objet ThisWorksheet de son fichier.
 

job75

XLDnaute Barbatruc
Mais pourquoi vouloir écrire dans ThisWorkbook ?

Complétez plutôt la fonction :
VB:
Function LastDate() As String    'La cellule se formate automatiquement en Date/heure
    Application.Volatile
    LastDate = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
    ActiveWorkbook.Saved = True 'évite l'invite à la fermeture si aucune modification
End Function
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…