Discussion:
[Excel 2013] - Interception beforeSave
(trop ancien pour répondre)
ThierryP
2017-02-03 10:42:26 UTC
Permalink
Raw Message
Bonjour,

Avec mon bon vieil Excel XP, il était simple d'intercepter l'enregistrement d'un fichier, ce qui me permettait d'imposer un chemin, un nom etc...

Aujourd'hui, avec Excel 2013, avant que je puisse intercepter l'évènement, il se passe plein de choses déagréables que je souhaite éviter !
- L'utilisateur clique sur la disquette,
- L'écran "Enregistrer sous" apparaît (j'utilise un fichier modèle)
- L'utilisateur doit cliquer sur "Parcourir" et là seulement je peux intercepter le clic et exécuter ma macro.

Y a-t-il un moyen d'éviter çà ?

Merci d'avance à tous ceux qui vont se pencher sur mon souci !

ThierryP
ThierryP
2017-02-03 13:39:01 UTC
Permalink
Raw Message
Je m'auto-réponds !!

- Je peux créer un bouton sur ma feuille qui fera le job, SAUF que l'icône Enregistrer reste active.

- Avec Excel 2013 je ne sais pas supprimer ou désactiver par macro cette icône(l'enregistreur reste désespérément vide....).

Une autre idée ??

ThierryP
JièL
2017-02-03 13:46:05 UTC
Permalink
Raw Message
Hello,

pas testé, mais de mémoire, si on donnait à une macro le même nom que
"enregistrer" on remplaçait celle ci...

Désolé, c'est très approximatif comme aide, mais ça te donneras
peut-être une piste pour t'auto répondre à nouveau :-)
--
JièL toto ré pond
Post by ThierryP
Je m'auto-réponds !!
- Je peux créer un bouton sur ma feuille qui fera le job, SAUF que l'icône Enregistrer reste active.
- Avec Excel 2013 je ne sais pas supprimer ou désactiver par macro cette icône(l'enregistreur reste désespérément vide....).
Une autre idée ??
ThierryP
ThierryP
2017-02-03 16:01:08 UTC
Permalink
Raw Message
Merci du retour !

J'ai fait le test, et j'ai juste reçu un message d'insulte d'Excel.....

Dommage, je commençais à m'habituer à cette nouvelle version d'Excel, après mon bon vieux XP ! Mais la gestion des barres d'outils, menus et autres est nettement moins pratique maintenant (ou alors mes connaissances sont loin d'être suffisantes, ce qui est une certitude !!)

Allez, à qui le tour ?

Bon week-end,

ThierryP
MichD
2017-02-04 11:27:05 UTC
Permalink
Raw Message
Bonjour,

Ta demande n'est pas très claire pour moi...

Tu peux utiliser ce bout de code que tu places dans le ThisWorkbook de ton classeur :
Chaque fois que l'usager appelle la commande "enregistrer" ou "enregistrer sous"
la procédure appelle ta macro.

'---------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Cancel = True
Call NomDeLaMacro 'La macro, je suppose, est dans un module standard.

End Sub
'---------------------------------------------

MichD
ThierryP
2017-02-05 18:43:32 UTC
Permalink
Raw Message
Bonsoir Denis,

Désolé de ne pas avoir été plus clair ! Avant Excel 2007, dès qu'un utilisateur cliquait sur l'icône disquette, l'évènement était intercepté immédiatement.

Aujourd'hui, avec Excel 2013, l'utilisateur clique sur la disquette, l'écran "Enregistrer sous" apparaît, puis l'utilisateur clique "Enregistrer" ou "Enregistrer sous", puis clique sur un dossier récent ou sur le bouton "Parcourir" et c'est seulement à ce moment-là que l'évènement est intercepté.
Et moi, j'aurais voulu éviter tout çà !
Et comme il semble qu'il faut passer par un éditeur xml pour modifier les menus d'Excel..... ça ne simplifie pas la tâche !

ThierryP
MichD
2017-02-05 20:18:03 UTC
Permalink
Raw Message
Ton problème, c'est tes yeux et non Excel

Observe ce qui suit, avec les versions récentes d'Excel, il y a des nouvelles macros
événementielles

'Permet d'intercepter l'enregistrement AVANT (BEFORE)
'-------------------------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'C'est celle-ci que tu dois utiliser

Cancel = true
Call NomDeLaProcédure

End Sub
'-------------------------------------------------------------

'Elle permet d'intercepter immédiatement après l'enregistrement APRÈS (AFTER)
'-------------------------------------------------------------
Private Sub Workbook_AfterSave(ByVal Success As Boolean)

End Sub
'-------------------------------------------------------------

MichD
ThierryP
2017-02-06 15:03:15 UTC
Permalink
Raw Message
Denis,

Mes yeux ne vont pas si mal que çà !! Ma mémoire aussi : sauf erreur ou omission de ma part, le BeforeSave existait déjà avec Excel 2002 (ma première rencontre avec le VBA, !!!) et sûrement dans les premières versions de VBA.

Par contre, je n'avais effectivement pas remarqué le AfterSave dans Excel, mais qui dans ce cas précis ne m'avance guère !

ThierryP
ThierryP
2017-02-06 15:33:04 UTC
Permalink
Raw Message
J'ai également omis de préciser que je travaille sur un modèle, et que donc il n'y a pas de chemin défini avant le premier enregistrement.

Le but de ma question est donc d'éviter qu'un utilisateur peu habitué à Excel n'enregistre le classeur n'importe où.

ThierryP
MichD
2017-02-06 16:46:55 UTC
Permalink
Raw Message
J'ai compris, tu veux que j'écrive la macro ?

Débute par exécuter cette macro une fois pour être certain que les procédures événementielles
sont activées.
'---------------------------------
Sub Avant()
Application.EnableEvents = True
End Sub
'---------------------------------

Dans un classeur tout neuf qui n'a jamais été sauvegardé, copie dans le thisworkbook de ce
dernier ce qui suit et il se passera ceci :
A ) la première fenêtre qui s'ouvrira, l'usager pourra choisir le répertoire où il veut
enregistrer le fichier.
B ) la deuxième fenêtre lui permettra de choisir le nom du classeur puisque la fenêtre ouvrante
affichera déjà le répertoire qu'il a choisi.
C ) Si le fichier est déjà enregistré, il ne se passera rien sinon la sauvegarde du document.

'---------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Chemin As String

If SaveAsUI = True Then
Chemin = ChoixDossier()
CurDir Left(Chemin, 1)
ChDir Chemin
End If
End Sub
'---------------------------------------
Function ChoixDossier()
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ""
.Show
If .SelectedItems.Count > 0 Then
ChoixDossier = .SelectedItems(1)
Else
ChoixDossier = ""
End If
End With
End Function
'---------------------------------------

MichD
ThierryP
2017-02-07 10:06:22 UTC
Permalink
Raw Message
Bonjour Denis,

Depuis le nombre d'années que je fréquente le MPFE, je n'ai jamais demandé à ce qu'on m'écrive mes macros ! J'essaie d'être un grand garçon ;o))

Ce que tu me proposes est justement ce que je ne veux pas :
- je ne veux pas que l'écran "Enregistrer sous" apparaisse
- je ne veux pas que l'utilisateur puisse choisir un répertoire d'enregistrement
- je ne veux pas que l'utilisateur puisse choisir le nom du document.

Tout ceci se fait par macro.

Mon souhait, afin d'éviter toute fausse manip de l'utilisateur, serait justement d'inhiber l'apparition de l'écran "Enregistrer sous", qui apparaît dès que l'on clique sur la disquette.
Et je maintiens que l'interception ne se produit que lorsque l'utilisateur choisit un répertoire de destination (en tout cas sur mon PC !!).

Et avec cette version 2013, je ne sais plus griser ou inhiber un bouton dans un menu. J'ai fait quelques recherches, mais je n'ai rien trouvé de satisfaisant..

ThierryP
ThierryP
2017-02-07 10:38:23 UTC
Permalink
Raw Message
Bonjour Denis,

Non tu n'as pas compris ! Depuis plus de 10 ans que je fréquente le MPFE pour essayer de progresser, je n'ai jamais demandé à ce qu'on m'écrive mes macros ! J'essaie d'être un grand garçon :-))

Finalement, en utilisant "Custom UI Editor for Office" et en modifiant le code xml j'ai pu m'en sortir : l'icône reste visible mais inactive et du coup le clic est intercepté immédiatement.

ThierryP
MichD
2017-02-07 10:46:44 UTC
Permalink
Raw Message
Pour inhiber l'action du bouton "enregistrer" ou les commandes du menu "enregistrer"

'---------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = true '<<<<<<<==========
'Et tu peux ajouter un message si tu le désires.
Msgbox "Utiliser le bouton dans la feuille de calcul pour enregistrer le fichier".
End Sub
'---------------------------------------

MichD
ThierryP
2017-02-07 12:46:23 UTC
Permalink
Raw Message
Oui, c'est bien ce que j'utilisais avant !

Mais l'avantage d'inhiber l'icône, c'est que l'utilisateur ne peut même pas accéder à la page "Enregistrer" ou "Enregistrer sous" et la macro BeforeSave se lance dès le clic sur l'icône, sans qu'aucun écran intermédiaire n'apparaisse.

Du coup, je suis absolument sûr que les fichiers iront bien s'enregistrer à l'emplacement et sous le nom définis dans mes macros !

Merci pour le retour,

ThierryP
Jacquouille
2017-02-07 13:00:04 UTC
Permalink
Raw Message
Bonjour Thierry,
Je ne suis pas sur (c'est même certain) d'avoir bien compris ton problème.
Mais, si tu parvenais à garder l'icône "enregistrer", mais lui attribuer une
autre macro, cela ne conviendrait-il pas?
cette gymnastique pourrait se faire auto à l'ouverture du fichier, puis,à la
fermeture, la macro remettrait la bonne destination à l'icône.
Facile à dire. ....
Bonne m****

Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"ThierryP" a écrit dans le message de groupe de discussion :
9bcd2731-1829-4e59-840c-***@googlegroups.com...

Oui, c'est bien ce que j'utilisais avant !

Mais l'avantage d'inhiber l'icône, c'est que l'utilisateur ne peut même pas
accéder à la page "Enregistrer" ou "Enregistrer sous" et la macro BeforeSave
se lance dès le clic sur l'icône, sans qu'aucun écran intermédiaire
n'apparaisse.

Du coup, je suis absolument sûr que les fichiers iront bien s'enregistrer à
l'emplacement et sous le nom définis dans mes macros !

Merci pour le retour,

ThierryP


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
ThierryP
2017-02-07 13:14:47 UTC
Permalink
Raw Message
Bonjour Jacques,

Le truc pénible que j'expliquais à Denis, c'est que l'évènement est capturé "plus tardivement" qu'avec Excel XP, et comme mes utilisateurs ne sont pas tous des pros du PC, je souhaite éviter toute fausse manip.... et pour ça, il vaut mieux que ce soit Excel qui s'en charge !

Et par rapport à ce que je connaissais, il semble qu'on ne puisse plus modifier directement par macro les menus d'Excel, mais je peux (sûrement !) me tromper.

ThierryP
isabelle
2017-02-07 13:09:49 UTC
Permalink
Raw Message
bonjour ThierryP,

SaveAsUI: Vrai si la boîte de dialogue Enregistrer sous s'affiche en raison des
modifications apportées qui doivent être enregistrées dans le classeur.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUI = False
Cancel = True
MsgBox "ok"
End Sub

https://msdn.microsoft.com/en-us/library/office/ff840057.aspx

isabelle
Post by ThierryP
Oui, c'est bien ce que j'utilisais avant !
Mais l'avantage d'inhiber l'icône, c'est que l'utilisateur ne peut même pas accéder à la page "Enregistrer" ou "Enregistrer sous" et la macro BeforeSave se lance dès le clic sur l'icône, sans qu'aucun écran intermédiaire n'apparaisse.
Du coup, je suis absolument sûr que les fichiers iront bien s'enregistrer à l'emplacement et sous le nom définis dans mes macros !
Merci pour le retour,
ThierryP
MichD
2017-02-07 13:46:36 UTC
Permalink
Raw Message
Bonjour,

Tu étais parti dans le sud? ;-)

Concernant la procédure, seulement ceci est suffisant.
Cela inhibe totalement la commande "Enregistrer sous" ou "Enregistrer"
que ce soit avec la commande du ruban ou du menu.

Qu'est-ce que tu fais quand le monsieur refuse de comprendre?
;-))

'--------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
End Sub
'--------------------------------

Au besoin, on peut ajouter après la ligne "Cancel", une ligne de code pour
appeler la procédure qui enregistrera le fichier
'--------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
Call MySaveSub(SaveAsUI)
End Sub
'--------------------------------
Sub MySaveSub(First As Boolean)
'Au début de la macro d'enregistrement
If First = True Then
'52 Macro avec macro
ThisWorkbook.SaveAs Filename:="C:\Excel\NomDufichier", FileFormat:=52
Else
ThisWorkbook.Save
End If
End Sub
'--------------------------------

MichD
ThierryP
2017-02-07 14:53:54 UTC
Permalink
Raw Message
Denis,

Depuis plus de 10 ans que je fréquente le MPFE, tu m'as apporté quantité de solutions, de pistes etc.... et j'ai appris des tonnes de trucs.

Mais là, c'est toi qui ne veux pas comprendre !
Ce que tu as écrit dans ton dernier post, cela fait des années que je l'utilise (avec Excel XP), et je suis même arrivé à comprendre comment ça marche !

Quand l'utilisateur double clique sur mon modèle, il crée un nouveau fichier qui n'a jamais été enregistré, nous sommes d'accord ?
Tout ce que je souhaite, c'est avoir l'équivalent de ceci pour Excel 2003:
'----------------
With Application.CommandBars("Standard")
.Controls("Enre&gistrer").Enabled = False
End With
'-----------------------
A moins que j'ai une version spéciale d'Office (j'ai la version 2013), avant que la macro BeforeSave se déclenche, voilà ce qu'il se passe quand je clique sur la disquette :
- L'écran "Enregistrer sous" apparaît (mais je n'en veux pas)
- Je clique sur un dossier récent ou sur le bouton "Parcourir" et là seulement la macro BeforeSave se déclenche et empêche l'enregistrement.
- Je dois cliquer sur la flèche "Retour" en haut à gauche de l'écran pour retourner sur ma feuille de calcul.
Tout ceci n'est pas très ergonomique, surtout pour un utilisateur novice en bureautique.

Je souhaitais juste savoir si une solution aussi simple qu'avec Excel XP pouvait s'appliquer ......
PS : Le test que j'ai fait en modifiant le XML de mon modèle fonctionne ... mais si je crée un nouveau fichier depuis mon modèle, ça ne fonctionne plus.. Je crois que je vais pleurer ;o)

Ne voulant pas passer pour un troll et abuser, je crois que nous allons clore cette discussion.

ThierryP
MichD
2017-02-07 15:41:07 UTC
Permalink
Raw Message
Sur ce site Web (en anglais), tu as toute l'information nécessaire
pour transformer le ruban avec même des fichiers exemples.

http://www.rondebruin.nl/win/section2.htm

J'avais très bien compris ce que tu voulais faire, moi, je ne réponds
pas (n'écris pas de fichier xml) pour modifier les menus, et ce par
choix personnel.) directement à ce type de question.

Cependant, au lieu de modifier le fichier xml pour modifier la commande,
comme tu ne fais pas disparaître le bouton du ruban ni les commandes
sous le menu fichier, l'approche que je propose est plus simple et elle
est facile à mettre en application même dans un modèle!

Ceci dit, tu fais comme bon te semble! En espérant que tu gardes le
sourire quant à mes commentaires.

MichD
ThierryP
2017-02-07 16:36:37 UTC
Permalink
Raw Message
Denis,

Depuis le temps, je connais bien ta manière :-))))

Tes procédures marchent nickel, mais je connais mes utilisateurs et moins ils peuvent cliquer n'importe où, meilleur c'est !

Tous les fichiers générés depuis mon modèle sont ensuite analysés par un classeur que j'ai créé, mais il faut que la structure du nom et le chemin soient toujours basés sur la même logique..... et il n'y a qu'une machine qui ne change jamais de logique ;o))

Je vais creuser un peu plus chez l'ami Ron !

Merci pour ton temps

ThierryP

Loading...