OVH Cloud OVH Cloud

Brider une commande par défaut

5 réponses
Avatar
Nadège
Je souhaiterai, en vba, brider la commande Fichier=20
Enregistrer.
Mon objectif est d'emp=EAcher l'utilisateur d'enregistrer un=20
bon de commande si certaines infos sont manquantes.
J'ai cr=E9=E9 une proc=E9dure Workbook_BeforeSave qui teste la=20
validit=E9 des cellules en question (dans l'exemple ci-
dessous la cellule 20 puis 22)mais malgr=E9 la pr=E9sence=20
d"Exit sub, la bo=EEte de dialogue Enregistrer ne se referme=20
pas !

reponse =3D Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N=B0 de devis invalide !", vbCritical
Exit Sub
End Select
End Select

Merci de votre aide

5 réponses

Avatar
michdenis
Bonjour Nadège,


Essaie ceci : à copier dans le ThisWorkbook de ton projet.

reponse = Range("C20").Value
Il est préférable d'éviter ce type de ligne de code puisque ce dernier ne spécifie pas à quel feuille appartient
l'objet
range. Dans un tel cas, l'objet range appartient à la feuille active... et la feuille active n'est pas nécessairement
celle qui est toujours active au moment de tester le code... dans la procédure adapte le nom de la feuille à celle
définit dans ton projet.

En plus d'utiliser Exit sub, tu affectes la valeur true à la variable Cancel. Cela aura pour but d'annuler l'opération
"Enregistrer".

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

With Worksheets("Feuil1")
reponse = .Range("C20").Value
End With
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Cancel = True
Exit Sub
End Select
End Select
End Sub
'--------------------------------


Salutations!




"Nadège" a écrit dans le message de news:0a4a01c381e7$1844b3d0$
Je souhaiterai, en vba, brider la commande Fichier
Enregistrer.
Mon objectif est d'empêcher l'utilisateur d'enregistrer un
bon de commande si certaines infos sont manquantes.
J'ai créé une procédure Workbook_BeforeSave qui teste la
validité des cellules en question (dans l'exemple ci-
dessous la cellule 20 puis 22)mais malgré la présence
d"Exit sub, la boîte de dialogue Enregistrer ne se referme
pas !

reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Exit Sub
End Select
End Select

Merci de votre aide
Avatar
Nadège
Merci de ton aide, mais le problème subsiste :
la boîte de dialogue enregistrer demeure ouverte.
Je souhaiterai qu'elle se referme, empêchant l'utilisateur
d'enregistrer ce fichier non conforme.

Le test sur la cellule se fait correctement et le message
d'alerte s'affiche bien.

-----Message d'origine-----
Bonjour Nadège,


Essaie ceci : à copier dans le ThisWorkbook de ton projet.

reponse = Range("C20").Value
Il est préférable d'éviter ce type de ligne de code
puisque ce dernier ne spécifie pas à quel feuille appartient

l'objet
range. Dans un tel cas, l'objet range appartient à la
feuille active... et la feuille active n'est pas nécessairement

celle qui est toujours active au moment de tester le
code... dans la procédure adapte le nom de la feuille à celle

définit dans ton projet.

En plus d'utiliser Exit sub, tu affectes la valeur true à
la variable Cancel. Cela aura pour but d'annuler l'opération

"Enregistrer".

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


With Worksheets("Feuil1")
reponse = .Range("C20").Value
End With
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Cancel = True
Exit Sub
End Select
End Select
End Sub
'--------------------------------


Salutations!




"Nadège" a écrit dans le
message de news:0a4a01c381e7$1844b3d0$

Je souhaiterai, en vba, brider la commande Fichier
Enregistrer.
Mon objectif est d'empêcher l'utilisateur d'enregistrer un
bon de commande si certaines infos sont manquantes.
J'ai créé une procédure Workbook_BeforeSave qui teste la
validité des cellules en question (dans l'exemple ci-
dessous la cellule 20 puis 22)mais malgré la présence
d"Exit sub, la boîte de dialogue Enregistrer ne se referme
pas !

reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Exit Sub
End Select
End Select

Merci de votre aide


.



Avatar
michdenis
Bonjour Nadège,

Si les conditions sont respectées, il va falloir et avec plaisir que tu m'explique comment l'usager réussi à ouvrir la
fenêtre "Enregistrer".

La procédure suivante du Thisworkbook se produit avant l'ouverture de la fenêtre et si les condtions ne sont pas
respectées, l'opération est annulée et aucune fenêtre s'ouvre. Et cela est due à l'ajout de la ligne de code Cancel True dans la procédure.
Évidemment si cette ligne de code ne s'exécute pas... rien n'empêchera l'usager à enregistrer le fichier. À toi de
définir les conditions nécessaires et obligatoires pour empêcher l'enregistrement du fichier.

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

Si J'étais toi, j'observerai attentivement les conditions de ton sélect case :

IL m'est difficile de te proposer quelque chose.. je n'ai pas vu ton application ...

Es-tu sûr que la feuille où tu veux tester la valeur des cellules est celle qui est active ? Telle que défini dans ta
procédure originale, les objets "range" appartiennent par défaut à la feuille active... et si la feuille active n'est
pas celle désirée, le résultat des tests sera aléatoire.


Salutations!





Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Cancel = True
Exit Sub






"Nadège" a écrit dans le message de news:07a701c38273$a39162d0$


Merci de ton aide, mais le problème subsiste :
la boîte de dialogue enregistrer demeure ouverte.
Je souhaiterai qu'elle se referme, empêchant l'utilisateur
d'enregistrer ce fichier non conforme.

Le test sur la cellule se fait correctement et le message
d'alerte s'affiche bien.

-----Message d'origine-----
Bonjour Nadège,


Essaie ceci : à copier dans le ThisWorkbook de ton projet.

reponse = Range("C20").Value
Il est préférable d'éviter ce type de ligne de code
puisque ce dernier ne spécifie pas à quel feuille appartient

l'objet
range. Dans un tel cas, l'objet range appartient à la
feuille active... et la feuille active n'est pas nécessairement

celle qui est toujours active au moment de tester le
code... dans la procédure adapte le nom de la feuille à celle

définit dans ton projet.

En plus d'utiliser Exit sub, tu affectes la valeur true à
la variable Cancel. Cela aura pour but d'annuler l'opération

"Enregistrer".

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


With Worksheets("Feuil1")
reponse = .Range("C20").Value
End With
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Cancel = True
Exit Sub
End Select
End Select
End Sub
'--------------------------------


Salutations!




"Nadège" a écrit dans le
message de news:0a4a01c381e7$1844b3d0$

Je souhaiterai, en vba, brider la commande Fichier
Enregistrer.
Mon objectif est d'empêcher l'utilisateur d'enregistrer un
bon de commande si certaines infos sont manquantes.
J'ai créé une procédure Workbook_BeforeSave qui teste la
validité des cellules en question (dans l'exemple ci-
dessous la cellule 20 puis 22)mais malgré la présence
d"Exit sub, la boîte de dialogue Enregistrer ne se referme
pas !

reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Exit Sub
End Select
End Select

Merci de votre aide


.



Avatar
Frédéric Sigonneau
Bonsoir,

Comment est composé un numéro de devis valide ?
Supposons un numéro comme 12345 (5 chiffres) mais mis en forme avec un format
personalisé (pour des raisons d'homogénéité de la présentation pas ex) du type
"0000000".
Si tu as ce cas de figure (où une situation semblable), la cellule affiche
0012345 (7 chiffres) mais le nombre visible dans la barre de formule est 12345
(5 chiffres).
En VBA, dans cette situation, ton test Len(Range("C22")) renvoie 5 alors qu'un
test sur le texte affiché dans la cellule, comme Len(Range("C22").Text) renverra
7.
Dans l'autre sens, un nombre comme 12345,12 affiché au format perso "0"
apparaîtra comme 12345 (5 chiffres) alors qu'en réalité Len(Range("C22")) va
renvoyer 8...

Ceci dit, après cette remarque peut-être sans objet pour te dépanner, je pense
que la solution proposée par Denis *devrait* fonctionner. Ecrite très légèrement
différemment, j'obtiens le résultat que tu sembles attendre en testant le texte
affiché dans la cellule (si le numéro est invalide, ton message s'affiche, point
final, et si le numéro est valide la boite de dialogue d'enregistrement
s'affiche) :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22").Text)
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Cancel = True
End Select
End Select
End Sub

A moins qu'on n'ait rien compris, ni l'un ni l'autre ?..

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Je souhaiterai, en vba, brider la commande Fichier
Enregistrer.
Mon objectif est d'empêcher l'utilisateur d'enregistrer un
bon de commande si certaines infos sont manquantes.
J'ai créé une procédure Workbook_BeforeSave qui teste la
validité des cellules en question (dans l'exemple ci-
dessous la cellule 20 puis 22)mais malgré la présence
d"Exit sub, la boîte de dialogue Enregistrer ne se referme
pas !

reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Exit Sub
End Select
End Select

Merci de votre aide


Avatar
Nadège
Merci de ton aide Frédéric.
Je n'avais effectivement pas lu la réponse de Michel
jusqu'au bout mais j'avais fini par parvenir au même
résultat.
Merci bq de votre aide à tous deux.

-----Message d'origine-----
Bonsoir,

Comment est composé un numéro de devis valide ?
Supposons un numéro comme 12345 (5 chiffres) mais mis en
forme avec un format

personalisé (pour des raisons d'homogénéité de la
présentation pas ex) du type

"0000000".
Si tu as ce cas de figure (où une situation semblable),
la cellule affiche

0012345 (7 chiffres) mais le nombre visible dans la barre
de formule est 12345

(5 chiffres).
En VBA, dans cette situation, ton test Len(Range("C22"))
renvoie 5 alors qu'un

test sur le texte affiché dans la cellule, comme Len(Range
("C22").Text) renverra

7.
Dans l'autre sens, un nombre comme 12345,12 affiché au
format perso "0"

apparaîtra comme 12345 (5 chiffres) alors qu'en réalité
Len(Range("C22")) va

renvoyer 8...

Ceci dit, après cette remarque peut-être sans objet pour
te dépanner, je pense

que la solution proposée par Denis *devrait* fonctionner.
Ecrite très légèrement

différemment, j'obtiens le résultat que tu sembles
attendre en testant le texte

affiché dans la cellule (si le numéro est invalide, ton
message s'affiche, point

final, et si le numéro est valide la boite de dialogue
d'enregistrement

s'affiche) :

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

reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22").Text)
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Cancel = True
End Select
End Select
End Sub

A moins qu'on n'ait rien compris, ni l'un ni l'autre ?..

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Je souhaiterai, en vba, brider la commande Fichier
Enregistrer.
Mon objectif est d'empêcher l'utilisateur d'enregistrer
un


bon de commande si certaines infos sont manquantes.
J'ai créé une procédure Workbook_BeforeSave qui teste la
validité des cellules en question (dans l'exemple ci-
dessous la cellule 20 puis 22)mais malgré la présence
d"Exit sub, la boîte de dialogue Enregistrer ne se
referme


pas !

reponse = Range("C20").Value
Select Case reponse
Case Is <> "Non"
Select Case Len(Range("C22"))
Case Is < 7
MsgBox "N° de devis invalide !", vbCritical
Exit Sub
End Select
End Select

Merci de votre aide



.