Désactiver/réactiver un module en VBA

Bonjour à tous

j'ai un fichier que j'utilise au boulot afin que les utilisateurs effectuent leur demande de création de produit. Dans ce fichier il y a un bouton qui sert a d'une part sauvegarder sous et d'autre part ouvrir un email et préremplir certains champs.

mon probleme est que les utilisateurs s'obstinent à utiliser le raccourci ctrl "s" ou fichier sauvegarder etc..

J'ai donc bloqué la possibilité de sauvegarder manuellement avec les macros ci dessous dans un module "no_save"

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True 'Annule les demandes d'enregistrement
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ThisWorkbook.Saved = True 'Informe Excel que le fichier a déjà été enregistré (cela évite d'avoir une demande d'enregistrement à la fermeture)
End Sub

Maintenant automatiquement, mon bouton ne fonctionne plus ce qui est logique.

Y a t il une possibilité d'ajouter dans la macro de mon bouton une action qui désactiverait le module "no_save", le temps que la macro effectue ses actions puis la réactivation du module "no_save"?

je vous remercie !

Pierre

bonjour,

si vous créez une sorte de handshake, un drapeau qui signale que c'est la macro qui prend l'initiatif. Donc dans un module normal 2 macros et dans Thisworkbook le reste

Module normal

Public bSave, bClose

Sub Save_Avec_Macro()
     bSave = True     'drapeau haut
     ThisWorkbook.Save
End Sub

Sub Close_Avec_Macro()
     bClose = True
     ThisWorkbook.Close 0
End Sub

ThisWorkbook

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     If Not bSave Then Cancel = True: MsgBox "sauvegardez avec macro"     'Annule les demandes d'enregistrement
     bSave = False     'après sauvegarder ,RAZ le variable
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
     If Not bClose Then Cancel = True: MsgBox "Close avec macro"     'Annule les demandes d'enregistrement
     bClose = False
     'Application.ThisWorkbook.Saved = True 'Informe Excel que le fichier a déjà été enregistré (cela évite d'avoir une demande d'enregistrement à la fermeture)
End Sub

bonjour et merci pour votre réponse !

par contre, je ne suis pas certain de comprendre comment l'insérer dans mon fichier (je suis aprenti chimiste en VBA.. je n'y connais pas grand chose) ..

j'ai attaché une copie écran de "thisworkbook" afin que vous puissiez voir si j'ei correctement intégré votre code

ci dessous la macro qui me sert a sauvegarder, ou et comment dois je intégrer le BSave et BClose ?

encore merci pour votre aide !

thisworkbook

Sub Savefinal()
On Error GoTo Err_Savefinal

'Save in \Desktop\Pricing\
ActiveSheet.Unprotect Password:="126"
Cells.Find(What:="Created on:", after:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "=NOW()"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Cells.Find(What:="First and last Name", after:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Offset(0, 1).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Cells.Find(What:="UGDN", after:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Offset(0, 1).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Protect Password:="126."
Application.Dialogs(xlDialogSaveAs).Show Sheet1.Range("G2")

'Error Subs
Exit_Savefinal:
Exit Sub

Err_Savefinal:
MsgBox Err.Description
Resume Exit_Savefinal

petite chose que j ai oublié de dire, le popup "sauvegardez avec macro" n'arrete pas d'apparaitre, je le ferme toutes les 10 secondes :) es ce normal ?

bonjour, les 2 variables sont en top d'un module normal

Public bSave, bClose

puis, bSave=true, vous l'insertez par exemple avant la ligne du sauvegarde, par exemple la ligne "Application.Dialogs(xlDialogSaveAs).Show Sheet1.Range("G2")"

Mais c'est difficile à prédire, parce que je ne vous pas toutes les macros. Vous pouvez nous joindre le fichier ?

Bonsoir Guismo30,

Ce serait plus simple dans tes deux Private sub Workbook Save voire Close de faire référence à une cellule particulière d'une feuille. Plutôt que d'utiliser True.

Exemple: en AA1 ou une cellule assez éloignée de celles habituellement utilisées. Inscrire la valeur 1. Et ton Cancel = Sheets("choix"). Range("AA1")

Lorsque la cellule vaut 1 cela équivaut à VRAI. Et cela bloque la sauvegarde manuelle. Si elle vaut 0 la sauvegarde peut s'effectuer car Cancel = FAUX.

Il suffit dans le code de ton bouton initialement de mettre AA1 à 0 puis la sauvegarde effectuée, en fin de macro de basculer AA1 à 1. Et empêcher toute sauvegarde manuelle.

bonjour Guismo30, X Cellus, le fil,

à mon avis, il n'y a pas un advantage d'utiliser une cellule au lieu d'un variable public. On doit faire les mêmes manipulations pour changer les valeurs True/False ou 1/0 avant et après le sauvegarde-VBA ou la clôture-VBA..

Bonjour,

L'avantage est dans la simplicité.

Et même on peut faire encore plus simple.

Passer par le menu Formules d'Excel. Donner le nom MA (Marche/Arrêt) pour la cellule choisie comme "interrupteur".

Puis au sein de la macro activée par le bouton. Initialement faire [MA] = 0 pour que le Cancel du Workbook_Close passe à FALSE et au final [MA] = 1 pour TRUE.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = [MA]
End Sub

Bonjour,

A mon avis, il n'y a pas un avantage d'utiliser une cellule au lieu d'un variable public. On doit faire les mêmes manipulations pour changer les valeurs True/False ou 1/0 avant et après le sauvegarde-VBA ou la clôture-VBA..

A mon avis, le gros avantage (surtout pour les débutants ou pour ceux qui comme moi programment avec le pied) c'est que l'écriture en cellule n'est pas volatile : En cas d'erreur d'exécution la valeur n'est pas perdue !

A+

bonjour,

moi, je veux que ce valeur est temporaire pendant 0.01 seconde. Quand il y a un erreur, la cellule ne change pas et 5 minutes plus tard on est capable à sauvegarder le fichier. Mon variable public n'a pas ce problème.

Mais pour le moment, le vrai problème de Guismo est la place où il/elle doit modifier la cellule ou ce variable et je ne vois pas l'image complet.

bonjour à tous,

un super merci pour toutes vos réponses, je suis en congé la semaine prochaine donc pas acces, mais quand je reviens la semaine d apres je loaderai mon fichier afin que vous ayez une idée de la bete ;)

merci encore ! et bon congés à tous

cordialement

Guismo30

Bonjour Guismo30,

Bonne vacances et à la semaine prochaine.

je loaderai mon fichier afin que vous ayez une idée de la bete

Bon "teasing"

D'ici là, on patienteras.

Rechercher des sujets similaires à "desactiver reactiver module vba"