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
Hi Dranreb. Si tu revois les posts antérieurs, je pouvais éviter ce problème en mettant ce simple code dans le ThisWorkbook du fichier ouvert pour consultation :

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

Je reprécise: Mon but est d'avoir une fonction autonome placée dans perso.xlam qui fait qu'il n'est pas demandé si on veut enregistrer si on n'a fait aucune modification dans le fichier simplement consulté.
Par fonction autonome, je veux dire que l'utilisateur ne doit rien écrire dans les modules ou dans Thisworkbook du fichier qu'il consulte.
Il utilise la fonction LastDate du Xlma comme une simple fonction native de Excel.
Jusqu'ici, je n'y arrive qu'en mettant le code de ci-dessus dans le Thisworkbook du fichier consulté.
Raison pour laquelle je voulais savoir comment faire pour que la fonction du xlam aille écrire ce code dans le Thisworkbook du fichier consulté... Puisque jusqu'ici, il n'y a que ca qui fonctionne.
 

Zorgloub

XLDnaute Junior
Il faut qu'il n'y ait qu'une seule fonction volatile dans le fichier.

Donc =LastDate() mais pas =MAINTENANT() ni =AUJOURDHUI()
Hi Job, ca s'embrouille, je perds tout doucement pied...
Dans ta fonction:
Code:
Function LastSave() As String    'La cellule se formate automatiquement en Date/heure
    Application.Volatile
    Static n 'mémorise la variable
    LastSave = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
    n = n + 1
    If n = 1 Then ActiveWorkbook.Saved = True 'évite l'invite à la fermeture si aucune modification
    'AjouterMacro
End Function

Il n'y a pas de Now ou de Today !?
Il n'y a donc bien qu'une seule fonction volatile.
 

Dranreb

XLDnaute Barbatruc
Il faut faire une recherche pour voir à quel moment la propriété Saved du Workbook passe à False. Pour moi ce n'est pas l'évaluation de la fonction LastDate qui fait ça, surtout si elle renvoie bien la date de dernière sauvegarde du classeur portant la formule et non pas du quelconque classeur actif.
 

Zorgloub

XLDnaute Junior
Je viens d'essayer cette piste dans mon perso.xlam sur base d'une recherche sur ce forum indiquant comment écrire dans ThisWorkbook avec une macro.


PERSO.xlam

VB:
Function LastSave() As String    'La cellule se formate automatiquement en Date/heure
    Application.Volatile
    Static n 'mémorise la variable
    LastSave = Format(ActiveWorkbook.BuiltinDocumentProperties("Last Save Time"), "dd/mm/yyyy hh:mm:ss")
    n = n + 1
    If n = 1 Then ActiveWorkbook.Saved = True 'évite l'invite à la fermeture si aucune modification (???)
    Call AjouterMacro
End Function

Sub AjouterMacro()
' Cocher Outils/Références/Microsoft Visual Basic for Applications Extensibility 5.3
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
ligne = .CountOfLines
.InsertLines ligne + 1, "Private Sub Workbook_Open()"
.InsertLines ligne + 2, "ThisWorkbook.Saved = True"
.InsertLines ligne + 3, "End Sub"
End With
End Sub

C'est une piste MAIS ... Le problème est que la macro "AjouterMacro" écrit bien le code dans ThisWorkbook mais elle ne s'arrête pas de l'écrire plusieurs fois, l'une en dessous de l'autre... sans jamais s'arrêter ! :(
 

Dranreb

XLDnaute Barbatruc
Notez que personnellement je ne ferais pas comme ça si je voulais avoir la date et l'heure de dernière sauvegarde dans une cellule. Je prévoirais plutôt une cellule nommée, par exemple DernSVG dans tous les classeurs où je la veux, et je la rectifierait avant chaque sauvegarde.
Ça peut se programmer dans le ThisWorkbook du .xlam. comme ça :
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 Cel As Range
   On Error Resume Next
   Set Cel = Wb.Names("DernSVG").RefersToRange
   On Error GoTo 0
   If Cel Is Nothing Then Exit Sub
   Cel.Value = Now
   Cel.NumberFormat = "dd/mm/yyyy hh:mm:ss"
   End Sub
 

Dranreb

XLDnaute Barbatruc
Et puis tenez mettez donc aussi ces procédures derrière pour tenter de découvrir quelque chose :
VB:
Private Sub XL_WorkbookOpen(ByVal Wb As Workbook)
   If Wb.Saved Then Exit Sub
   MsgBox Wb.Name & " réputé modifié dès son ouverture.", vbExclamation, Me.Name
   End Sub
Private Sub XL_SheetCalculate(ByVal Sh As Object)
   Dim Wb As Workbook
   Set Wb = Sh.Parent
   If Wb.Saved Then Exit Sub
   MsgBox Wb.Name & " réputé modifié après un calcul.", vbExclamation, Me.Name
   End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le forum,
Hi Job, ca s'embrouille, je perds tout doucement pied...
En fait je n'avais pas testé, on peut mettre autant de formules volatiles que l'o, veut.

1) J'ai créé le fichier Perso.xlam avec dans Module1 la macro du post #56.

2) J'ai créé un fichier Classeur1.xlsx :

- dans les Compléments Excel j'ai coché "Perso"

- en A1 j'ai mis =LastDate()

- en A2 j'ai mis =MAINTENANT()

- en A3 j'ai mis =AUJOURDHUI()

- j'ai enregistré et fermé le fichier.

3) Après réouverture le fichier se ferme sans message d'invite.

4) Si l'on entre un texte en A4 il y a un message à la fermeture.

A+
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
En tout cas pour traiter l'ouverture d'un classeur il n'est pas nécessaire d'avoir du code dans son module ThisWorkbook. Ça peut aussi se prendre en charge au niveau global application dans un classeur de macros.
Autre exemple à tester dans le module ThisWorkbook de votre .xlam :
VB:
Option Explicit
Private WithEvents XL As Application
Private Sub Workbook_Open()
   Set XL = Application
   End Sub
Private Sub XL_WorkbookOpen(ByVal Wb As Workbook)
   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 = Wb.BuiltinDocumentProperties("Last Save Time")
   Wb.Saved = True
   End Sub
 

Zorgloub

XLDnaute Junior
Bonjour le forum,

En fait je n'avais pas testé, on peut mettre autant de formules volatiles que l'o, veut.

1) J'ai créé le fichier Perso.xlam avec dans Module1 la macro du post #56.

2) J'ai créé un fichier Classeur1.xlsx :

- dans les Compléments Excel j'ai coché "Perso"

- en A1 j'ai mis =LastDate()

- en A2 j'ai mis =MAINTENANT()

- en A3 j'ai mis =AUJOURDHUI()

- j'ai enregistré et fermé le fichier.

3) Après réouverture le fichier se ferme sans message d'invite.

4) Si l'on entre un texte en A4 il y a un message à la fermeture.

A+
Hi Job. Merci pour ta disponibilité. Bon, j'ai refait les mêmes opérations que celles que tu décris ici ... MAIS j'ai toujours le message de demande d'enregistrement même si je n'ai pas fait de modification !??? (Je suis en Excel 2010). Peut-être y a t-il une option particulière à activer quelque part ??
Dans les paramètres de sécurité des macros j'ai coché: 1)Activer toutes les macros... 2) Accès approuvé au modèle d'objet du projet VBA.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Si ça n'arrive plus après suppression de votre formule je vous engage à suivre une autre voie.
Il se pourrait après tout que l'instruction Application.Volatile mette toujours modifié le statut du classeur du fait qu'elle oblige votre version Excel à réévaluer la formule même si ce n'était pas nécessaire, vu qu'il est impossible de le savoir.
 

Zorgloub

XLDnaute Junior
Bonjour.
En tout cas pour traiter l'ouverture d'un classeur il n'est pas nécessaire d'avoir du code dans son module ThisWorkbook. Ça peut aussi se prendre en charge au niveau global application dans un classeur de macros.
Autre exemple à tester dans le module ThisWorkbook de votre .xlam :
VB:
Option Explicit
Private WithEvents XL As Application
Private Sub Workbook_Open()
   Set XL = Application
   End Sub
Private Sub XL_WorkbookOpen(ByVal Wb As Workbook)
   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 = Wb.BuiltinDocumentProperties("Last Save Time")
   Wb.Saved = True
   End Sub
Hi DranReb. J'ai testé mais idem :( Rien ne vient se mettre dans la cellule nommée DernSvg et toujours la demande d'enregistrement même si pas de modification au fichier.
 

Discussions similaires

Statistiques des forums

Discussions
315 058
Messages
2 115 812
Membres
112 550
dernier inscrit
tomate02