Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

La msgbox s'affiche trop tôt

20 réponses
Avatar
C15
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et centrage de
différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue procédure qui me
permet d'actualiser le graphique en fonction de données saisies dans le
tableau.

J'ai en particulier la procédure suivante :

>>>>
Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900 livres)",
vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900 livres)",
vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157 kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157 kg)",
vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780 kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780 kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


>>>
Le Worksheet_Calculate() me permet d'afficher une boite de dialogue si
les données calculées en B20 et/ou B22 sont > valeur spécifique à un
avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit certaines cellules
du tableau (et par conséquent du graphique) en fonction de l'avion
sélectionné dans une liste déroulante, par l'exécution des macros
Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour afficher les
données de cet avion et qu'après je choisis un des 2 autres (normal
2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle disparait dès
que je fais OK.
Elle réapparait si B20>...


Comment faire pour que ces msgbox ne s'affiche réellement que si
B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15

10 réponses

1 2
Avatar
C15
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond aux
cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un p'tit
conseil : évite les espaces dans les noms de feuille, etc... surtout si tu
veux faire un peu de programmation , par ex. MasseEtCentrage c'est très
lisible - en alternant Majuscules et Minuscules ; c'est pour ça que
l'éditeur VBA ajoute des guillemets simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien été
saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le nom ne
serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message de news:
O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1 nouveau
module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de l'objet
Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le fichier,
notamment la gestion des graphiques (un peu galère car les échelles des
axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre en
place des variables et d'utiliser la méthode case pour "regrouper" des
procédures similaires, même si hélas les données étant relativement
variables d'un avion à l'autre, le gain ne sera peut-être pas si
intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et SaisieComplète
(noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour définir le
nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le message de
news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de ma part
(ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont pas
saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure à la
masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2)
= "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2)
= "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2)
= "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2)
= "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien été
saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée au D/L
(" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le message de
news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer qu'à la
fin, en ayant simplement adapté le message à chaque cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (2900
livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (1157 kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (1157 kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780 kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (780 kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le message de
news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et centrage
de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue procédure qui
me permet d'actualiser le graphique en fonction de données saisies
dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157 kg)",
vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157 kg)",
vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780 kg)",
vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780 kg)",
vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de dialogue
si les données calculées en B20 et/ou B22 sont > valeur spécifique à
un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit certaines
cellules du tableau (et par conséquent du graphique) en fonction de
l'avion sélectionné dans une liste déroulante, par l'exécution des
macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour afficher les
données de cet avion et qu'après je choisis un des 2 autres (normal
2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle disparait
dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que si
B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15















Avatar
jero
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message de news:
%
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le poids
max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond aux
cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un p'tit
conseil : évite les espaces dans les noms de feuille, etc... surtout si
tu veux faire un peu de programmation , par ex. MasseEtCentrage c'est
très lisible - en alternant Majuscules et Minuscules ; c'est pour ça que
l'éditeur VBA ajoute des guillemets simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien été
saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le nom
ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message de
news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1 nouveau
module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le fichier,
notamment la gestion des graphiques (un peu galère car les échelles des
axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre en
place des variables et d'utiliser la méthode case pour "regrouper" des
procédures similaires, même si hélas les données étant relativement
variables d'un avion à l'autre, le gain ne sera peut-être pas si
intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour définir
le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le message de
news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de ma
part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont pas
saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure à la
masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And Right(Range("G5"),
2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And Right(Range("G5"),
2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And Right(Range("G5"),
2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2)
= "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And Right(Range("G5"),
2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée au
D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le message de
news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer qu'à
la fin, en ayant simplement adapté le message à chaque cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (2900
livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (1157
kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780 kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le message
de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue procédure
qui me permet d'actualiser le graphique en fonction de données
saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157 kg)",
vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780 kg)",
vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780 kg)",
vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de dialogue
si les données calculées en B20 et/ou B22 sont > valeur spécifique
à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit certaines
cellules du tableau (et par conséquent du graphique) en fonction de
l'avion sélectionné dans une liste déroulante, par l'exécution des
macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour afficher
les données de cet avion et qu'après je choisis un des 2 autres
(normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que si
B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15

















Avatar
C15
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message de news:
%
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le poids
max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond aux
cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un p'tit
conseil : évite les espaces dans les noms de feuille, etc... surtout si
tu veux faire un peu de programmation , par ex. MasseEtCentrage c'est
très lisible - en alternant Majuscules et Minuscules ; c'est pour ça que
l'éditeur VBA ajoute des guillemets simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien été
saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le nom
ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message de
news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1 nouveau
module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le fichier,
notamment la gestion des graphiques (un peu galère car les échelles des
axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre en
place des variables et d'utiliser la méthode case pour "regrouper" des
procédures similaires, même si hélas les données étant relativement
variables d'un avion à l'autre, le gain ne sera peut-être pas si
intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour définir
le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le message de
news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de ma
part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont pas
saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure à la
masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And Right(Range("G5"),
2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And Right(Range("G5"),
2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And Right(Range("G5"),
2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2)
= "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And Right(Range("G5"),
2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée au
D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le message de
news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer qu'à
la fin, en ayant simplement adapté le message à chaque cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (2900
livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (1157
kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780 kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le message
de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue procédure
qui me permet d'actualiser le graphique en fonction de données
saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157 kg)",
vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780 kg)",
vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780 kg)",
vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de dialogue
si les données calculées en B20 et/ou B22 sont > valeur spécifique
à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit certaines
cellules du tableau (et par conséquent du graphique) en fonction de
l'avion sélectionné dans une liste déroulante, par l'exécution des
macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour afficher
les données de cet avion et qu'après je choisis un des 2 autres
(normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que si
B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15




















Avatar
jero
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage '!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans espace
après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de news:
O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message de
news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un p'tit
conseil : évite les espaces dans les noms de feuille, etc... surtout si
tu veux faire un peu de programmation , par ex. MasseEtCentrage c'est
très lisible - en alternant Majuscules et Minuscules ; c'est pour ça
que l'éditeur VBA ajoute des guillemets simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien été
saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le
nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message de
news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1 nouveau
module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car les
échelles des axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre en
place des variables et d'utiliser la méthode case pour "regrouper" des
procédures similaires, même si hélas les données étant relativement
variables d'un avion à l'autre, le gain ne sera peut-être pas si
intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour définir
le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le message
de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de ma
part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont
pas saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"), 2)
= "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure à
la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And Right(Range("G5"),
2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And Right(Range("G5"),
2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And Right(Range("G5"),
2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée au
D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le message
de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer qu'à
la fin, en ayant simplement adapté le message à chaque cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (2900
livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (1157
kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780
kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue procédure
qui me permet d'actualiser le graphique en fonction de données
saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157
kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont > valeur
spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit certaines
cellules du tableau (et par conséquent du graphique) en fonction
de l'avion sélectionné dans une liste déroulante, par l'exécution
des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour afficher
les données de cet avion et qu'après je choisis un des 2 autres
(normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que si
B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15





















Avatar
C15
Bonjour Jero,

Je reviens vers toi après un long silence.

J'ai encore beaucoup travaillé sur mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201001/cijswTFwgQ.xls

Concernant la plage "Données", je l'ai limité au poids des passagers
avant et au carburant embarqué ; en effet on peut n'avoir ni passagers
arrière ni bagages.

J'ai voulu faire quelque chose qui ressemble à une appli et donc sans
barre de menus, d'outils, de formule.
C'est peut-être pas le top, mais j'y suis presque arrivé pour qu'à
l'ouverture cela soit "propre", sans pour autant supprimer ces barres
dans Excel ou les autres fichiers.

Ce que je n'arrive pas trop à gérer c'est la fermeture (Before Close ou
auto_close et/ou 2 boutons "fermer en sauvegardant" et "fermer sans
sauvegarder".
L'utilisateur de base n'a pas besoin de sauvegarder a priori.
Moi, si je dois modifier ce fichier, je dois pouvoir.

Pour info aux environ de la cellule A35, j'ai un bouton invisible pour
afficher la barre de menus (je n'ai pas trouvé mieux comme astuce).


Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage '!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans espace
après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de news:
O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message de
news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un p'tit
conseil : évite les espaces dans les noms de feuille, etc... surtout si
tu veux faire un peu de programmation , par ex. MasseEtCentrage c'est
très lisible - en alternant Majuscules et Minuscules ; c'est pour ça
que l'éditeur VBA ajoute des guillemets simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien été
saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le
nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message de
news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1 nouveau
module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car les
échelles des axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre en
place des variables et d'utiliser la méthode case pour "regrouper" des
procédures similaires, même si hélas les données étant relativement
variables d'un avion à l'autre, le gain ne sera peut-être pas si
intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour définir
le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le message
de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de ma
part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont
pas saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"), 2)
= "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure à
la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And Right(Range("G5"),
2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And Right(Range("G5"),
2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And Right(Range("G5"),
2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée au
D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le message
de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer qu'à
la fin, en ayant simplement adapté le message à chaque cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (2900
livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (1157
kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780
kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue procédure
qui me permet d'actualiser le graphique en fonction de données
saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157
kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) = "JC"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) = "AK"
Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont > valeur
spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit certaines
cellules du tableau (et par conséquent du graphique) en fonction
de l'avion sélectionné dans une liste déroulante, par l'exécution
des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour afficher
les données de cet avion et qu'après je choisis un des 2 autres
(normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que si
B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15























Avatar
C15
Rebonjour,

Petites questions subsidiaires :
Comment protéger ma feuille (tel que j'ai fais mon tableau, la méthode
classique verrouiller cellules/protéger feuille plante) ?

Comment empêcher le clic droit sur les boutons(pour éviter d'accéder au
code) ?

Merci de ton aide.

A+

C15

C15 a écrit :
Bonjour Jero,

Je reviens vers toi après un long silence.

J'ai encore beaucoup travaillé sur mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201001/cijswTFwgQ.xls

Concernant la plage "Données", je l'ai limité au poids des passagers
avant et au carburant embarqué ; en effet on peut n'avoir ni passagers
arrière ni bagages.

J'ai voulu faire quelque chose qui ressemble à une appli et donc sans
barre de menus, d'outils, de formule.
C'est peut-être pas le top, mais j'y suis presque arrivé pour qu'à
l'ouverture cela soit "propre", sans pour autant supprimer ces barres
dans Excel ou les autres fichiers.

Ce que je n'arrive pas trop à gérer c'est la fermeture (Before Close ou
auto_close et/ou 2 boutons "fermer en sauvegardant" et "fermer sans
sauvegarder".
L'utilisateur de base n'a pas besoin de sauvegarder a priori.
Moi, si je dois modifier ce fichier, je dois pouvoir.

Pour info aux environ de la cellule A35, j'ai un bouton invisible pour
afficher la barre de menus (je n'ai pas trouvé mieux comme astuce).


Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage '!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans
espace après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de
news: O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message
de news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un
p'tit conseil : évite les espaces dans les noms de feuille, etc...
surtout si tu veux faire un peu de programmation , par ex.
MasseEtCentrage c'est très lisible - en alternant Majuscules et
Minuscules ; c'est pour ça que l'éditeur VBA ajoute des guillemets
simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où
le nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le
message de news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1
nouveau module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car
les échelles des axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de
mettre en place des variables et d'utiliser la méthode case pour
"regrouper" des procédures similaires, même si hélas les données
étant relativement variables d'un avion à l'autre, le gain ne
sera peut-être pas si intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas
dans la procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour
définir le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ;
cela signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le
message de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop
aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans
la procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de
ma part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne
sont pas saisies, aucun message
If Range("B20").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément
inférieure à la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont
bien été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max
autorisée au D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le
message de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer
qu'à la fin, en ayant simplement adapté le message à chaque
cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(780 kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue
procédure qui me permet d'actualiser le graphique en
fonction de données saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont >
valeur spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit
certaines cellules du tableau (et par conséquent du
graphique) en fonction de l'avion sélectionné dans une liste
déroulante, par l'exécution des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau
est entièrement renseigné sauf si je choisis d'abord RN pour
afficher les données de cet avion et qu'après je choisis un
des 2 autres (normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement
que si B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15

























Avatar
jero
Salut,
1-Pour fermer sans/avec sauvegarde :
Application.ThisWorkbook.Close SaveChanges:úlse
Attention c'est bien écrit SaveChanges : = False
remplacer False par True pour sauvegarder
2-Pour interdire le clic droit
Sub AutoriserMenusContextuels(OuiNon As Boolean)
Dim Cbar As CommandBar
For Each Cbar In CommandBars
If Cbar.Type = msoBarTypePopup Then
Cbar.Enabled = OuiNon
End If
Next Cbar
End Sub
Dans ta procédure
Private Sub Workbook_Open() tu ajoutes
AutoriserMenusContextuels False
et dans
Private Sub Workbook_BeforeClose(Cancel As Boolean) tu ajoutes
AutoriserMenusContextuels True
Bon courage....
"C15" a écrit dans le message de news:

Rebonjour,

Petites questions subsidiaires :
Comment protéger ma feuille (tel que j'ai fais mon tableau, la méthode
classique verrouiller cellules/protéger feuille plante) ?

Comment empêcher le clic droit sur les boutons(pour éviter d'accéder au
code) ?

Merci de ton aide.

A+

C15

C15 a écrit :
Bonjour Jero,

Je reviens vers toi après un long silence.

J'ai encore beaucoup travaillé sur mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201001/cijswTFwgQ.xls

Concernant la plage "Données", je l'ai limité au poids des passagers
avant et au carburant embarqué ; en effet on peut n'avoir ni passagers
arrière ni bagages.

J'ai voulu faire quelque chose qui ressemble à une appli et donc sans
barre de menus, d'outils, de formule.
C'est peut-être pas le top, mais j'y suis presque arrivé pour qu'à
l'ouverture cela soit "propre", sans pour autant supprimer ces barres
dans Excel ou les autres fichiers.

Ce que je n'arrive pas trop à gérer c'est la fermeture (Before Close ou
auto_close et/ou 2 boutons "fermer en sauvegardant" et "fermer sans
sauvegarder".
L'utilisateur de base n'a pas besoin de sauvegarder a priori.
Moi, si je dois modifier ce fichier, je dois pouvoir.

Pour info aux environ de la cellule A35, j'ai un bouton invisible pour
afficher la barre de menus (je n'ai pas trouvé mieux comme astuce).


Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage '!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans
espace après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de
news: O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message de
news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un
p'tit conseil : évite les espaces dans les noms de feuille, etc...
surtout si tu veux faire un peu de programmation , par ex.
MasseEtCentrage c'est très lisible - en alternant Majuscules et
Minuscules ; c'est pour ça que l'éditeur VBA ajoute des guillemets
simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le
nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message
de news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1
nouveau module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car les
échelles des axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre
en place des variables et d'utiliser la méthode case pour
"regrouper" des procédures similaires, même si hélas les données
étant relativement variables d'un avion à l'autre, le gain ne sera
peut-être pas si intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans
la procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour
définir le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le
message de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop
aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de
ma part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont
pas saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"),
2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au
D/L (2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure
à la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au
D/L (1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au
D/L (780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont
bien été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée
au D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le
message de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer
qu'à la fin, en ayant simplement adapté le message à chaque cas
:

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780
kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue
procédure qui me permet d'actualiser le graphique en fonction
de données saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157
kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont >
valeur spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit
certaines cellules du tableau (et par conséquent du graphique)
en fonction de l'avion sélectionné dans une liste déroulante,
par l'exécution des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour
afficher les données de cet avion et qu'après je choisis un
des 2 autres (normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que
si B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15



























Avatar
C15
Bonsoir Jero,

Merci de ces propositions.

Par contre, la procédure interdisant le clic droit semble s'appliquer à
la session Excel en cours.
J'ai préféré protéger le code par un mot de passe.

Par contre je n'ai pas réussi à protéger ma feuille car j'ai un conflit
avec mon graphique (j'aurai voulu n'autoriser l'accès qu'aux cellules
"jaunes", les autres, les boutons, la photo, le graphique ne pouvant
être modifiés).

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
1-Pour fermer sans/avec sauvegarde :
Application.ThisWorkbook.Close SaveChanges:úlse
Attention c'est bien écrit SaveChanges : = False
remplacer False par True pour sauvegarder
2-Pour interdire le clic droit
Sub AutoriserMenusContextuels(OuiNon As Boolean)
Dim Cbar As CommandBar
For Each Cbar In CommandBars
If Cbar.Type = msoBarTypePopup Then
Cbar.Enabled = OuiNon
End If
Next Cbar
End Sub
Dans ta procédure
Private Sub Workbook_Open() tu ajoutes
AutoriserMenusContextuels False
et dans
Private Sub Workbook_BeforeClose(Cancel As Boolean) tu ajoutes
AutoriserMenusContextuels True
Bon courage....
"C15" a écrit dans le message de news:

Rebonjour,

Petites questions subsidiaires :
Comment protéger ma feuille (tel que j'ai fais mon tableau, la méthode
classique verrouiller cellules/protéger feuille plante) ?

Comment empêcher le clic droit sur les boutons(pour éviter d'accéder au
code) ?

Merci de ton aide.

A+

C15

C15 a écrit :
Bonjour Jero,

Je reviens vers toi après un long silence.

J'ai encore beaucoup travaillé sur mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201001/cijswTFwgQ.xls

Concernant la plage "Données", je l'ai limité au poids des passagers
avant et au carburant embarqué ; en effet on peut n'avoir ni passagers
arrière ni bagages.

J'ai voulu faire quelque chose qui ressemble à une appli et donc sans
barre de menus, d'outils, de formule.
C'est peut-être pas le top, mais j'y suis presque arrivé pour qu'à
l'ouverture cela soit "propre", sans pour autant supprimer ces barres
dans Excel ou les autres fichiers.

Ce que je n'arrive pas trop à gérer c'est la fermeture (Before Close ou
auto_close et/ou 2 boutons "fermer en sauvegardant" et "fermer sans
sauvegarder".
L'utilisateur de base n'a pas besoin de sauvegarder a priori.
Moi, si je dois modifier ce fichier, je dois pouvoir.

Pour info aux environ de la cellule A35, j'ai un bouton invisible pour
afficher la barre de menus (je n'ai pas trouvé mieux comme astuce).


Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage '!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans
espace après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de
news: O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message de
news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui correspond
aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse
et centrage'!$A$26:$C$26,'Masse et centrage'!$B$12,'Masse et
centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un
p'tit conseil : évite les espaces dans les noms de feuille, etc...
surtout si tu veux faire un peu de programmation , par ex.
MasseEtCentrage c'est très lisible - en alternant Majuscules et
Minuscules ; c'est pour ça que l'éditeur VBA ajoute des guillemets
simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où le
nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le message
de news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1
nouveau module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car les
échelles des axes ne sont pas identiques d'un avion à l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de mettre
en place des variables et d'utiliser la méthode case pour
"regrouper" des procédures similaires, même si hélas les données
étant relativement variables d'un avion à l'autre, le gain ne sera
peut-être pas si intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans
la procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour
définir le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ; cela
signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le
message de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop
aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans la
procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de
ma part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne sont
pas saisies, aucun message
If Range("B20").Value > 2900 And Right(Range("G5"),
2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au
D/L (2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément inférieure
à la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au
D/L (1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au
D/L (780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée à
l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont
bien été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par :
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max autorisée
au D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le
message de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer
qu'à la fin, en ayant simplement adapté le message à chaque cas
:

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L (780
kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue
procédure qui me permet d'actualiser le graphique en fonction
de données saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (2900
livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (2900
livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (1157
kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (1157
kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR (780
kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont >
valeur spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit
certaines cellules du tableau (et par conséquent du graphique)
en fonction de l'avion sélectionné dans une liste déroulante,
par l'exécution des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau est
entièrement renseigné sauf si je choisis d'abord RN pour
afficher les données de cet avion et qu'après je choisis un
des 2 autres (normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement que
si B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15






























Avatar
jero
Salut,
Par défaut tout est vérouillé...
Tu sélectionnes les cellules en jaunes et format...protection décocher
vérouiller
Tu protèges la feuille (autoriser les utilisateurs à sélectionner uniquement
les cellules dévérouillées)
dans les procédures où tu modifies des cellules vérouillées, tu modifies le
code (exemple) :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
ActiveSheet.Unprotect 'Modif...
....
....
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
'Modif....
End If
End Sub
La manip est : Tu déprotèges en début de procédure et tu reprotèges en
fin...
Je viens de tester, ça fonctionne...
A+

"C15" a écrit dans le message de news:
%
Bonsoir Jero,

Merci de ces propositions.

Par contre, la procédure interdisant le clic droit semble s'appliquer à la
session Excel en cours.
J'ai préféré protéger le code par un mot de passe.

Par contre je n'ai pas réussi à protéger ma feuille car j'ai un conflit
avec mon graphique (j'aurai voulu n'autoriser l'accès qu'aux cellules
"jaunes", les autres, les boutons, la photo, le graphique ne pouvant être
modifiés).

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
1-Pour fermer sans/avec sauvegarde :
Application.ThisWorkbook.Close SaveChanges:úlse
Attention c'est bien écrit SaveChanges : = False
remplacer False par True pour sauvegarder
2-Pour interdire le clic droit
Sub AutoriserMenusContextuels(OuiNon As Boolean)
Dim Cbar As CommandBar
For Each Cbar In CommandBars
If Cbar.Type = msoBarTypePopup Then
Cbar.Enabled = OuiNon
End If
Next Cbar
End Sub
Dans ta procédure
Private Sub Workbook_Open() tu ajoutes
AutoriserMenusContextuels False
et dans
Private Sub Workbook_BeforeClose(Cancel As Boolean) tu ajoutes
AutoriserMenusContextuels True
Bon courage....
"C15" a écrit dans le message de
news:
Rebonjour,

Petites questions subsidiaires :
Comment protéger ma feuille (tel que j'ai fais mon tableau, la méthode
classique verrouiller cellules/protéger feuille plante) ?

Comment empêcher le clic droit sur les boutons(pour éviter d'accéder au
code) ?

Merci de ton aide.

A+

C15

C15 a écrit :
Bonjour Jero,

Je reviens vers toi après un long silence.

J'ai encore beaucoup travaillé sur mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201001/cijswTFwgQ.xls

Concernant la plage "Données", je l'ai limité au poids des passagers
avant et au carburant embarqué ; en effet on peut n'avoir ni passagers
arrière ni bagages.

J'ai voulu faire quelque chose qui ressemble à une appli et donc sans
barre de menus, d'outils, de formule.
C'est peut-être pas le top, mais j'y suis presque arrivé pour qu'à
l'ouverture cela soit "propre", sans pour autant supprimer ces barres
dans Excel ou les autres fichiers.

Ce que je n'arrive pas trop à gérer c'est la fermeture (Before Close ou
auto_close et/ou 2 boutons "fermer en sauvegardant" et "fermer sans
sauvegarder".
L'utilisateur de base n'a pas besoin de sauvegarder a priori.
Moi, si je dois modifier ce fichier, je dois pouvoir.

Pour info aux environ de la cellule A35, j'ai un bouton invisible pour
afficher la barre de menus (je n'ai pas trouvé mieux comme astuce).


Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage '!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans
espace après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de
news: O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message
de news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un
p'tit conseil : évite les espaces dans les noms de feuille, etc...
surtout si tu veux faire un peu de programmation , par ex.
MasseEtCentrage c'est très lisible - en alternant Majuscules et
Minuscules ; c'est pour ça que l'éditeur VBA ajoute des guillemets
simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où
le nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le
message de news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1
nouveau module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car
les échelles des axes ne sont pas identiques d'un avion à
l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de
mettre en place des variables et d'utiliser la méthode case pour
"regrouper" des procédures similaires, même si hélas les données
étant relativement variables d'un avion à l'autre, le gain ne
sera peut-être pas si intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas
dans la procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour
définir le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ;
cela signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le
message de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop
aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans
la procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de
ma part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne
sont pas saisies, aucun message
If Range("B20").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément
inférieure à la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont
bien été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par
:
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max
autorisée au D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le
message de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer
qu'à la fin, en ayant simplement adapté le message à chaque
cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(780 kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue
procédure qui me permet d'actualiser le graphique en
fonction de données saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont >
valeur spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit
certaines cellules du tableau (et par conséquent du
graphique) en fonction de l'avion sélectionné dans une liste
déroulante, par l'exécution des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau
est entièrement renseigné sauf si je choisis d'abord RN pour
afficher les données de cet avion et qu'après je choisis un
des 2 autres (normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement
que si B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15































Avatar
C15
Bonjour Jero,

Merci pour cette réponse, une fois de plus très claire.

A+

C15


jero a écrit :
Salut,
Par défaut tout est vérouillé...
Tu sélectionnes les cellules en jaunes et format...protection décocher
vérouiller
Tu protèges la feuille (autoriser les utilisateurs à sélectionner uniquement
les cellules dévérouillées)
dans les procédures où tu modifies des cellules vérouillées, tu modifies le
code (exemple) :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
ActiveSheet.Unprotect 'Modif...
....
....
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
'Modif....
End If
End Sub
La manip est : Tu déprotèges en début de procédure et tu reprotèges en
fin...
Je viens de tester, ça fonctionne...
A+

"C15" a écrit dans le message de news:
%
Bonsoir Jero,

Merci de ces propositions.

Par contre, la procédure interdisant le clic droit semble s'appliquer à la
session Excel en cours.
J'ai préféré protéger le code par un mot de passe.

Par contre je n'ai pas réussi à protéger ma feuille car j'ai un conflit
avec mon graphique (j'aurai voulu n'autoriser l'accès qu'aux cellules
"jaunes", les autres, les boutons, la photo, le graphique ne pouvant être
modifiés).

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
1-Pour fermer sans/avec sauvegarde :
Application.ThisWorkbook.Close SaveChanges:úlse
Attention c'est bien écrit SaveChanges : = False
remplacer False par True pour sauvegarder
2-Pour interdire le clic droit
Sub AutoriserMenusContextuels(OuiNon As Boolean)
Dim Cbar As CommandBar
For Each Cbar In CommandBars
If Cbar.Type = msoBarTypePopup Then
Cbar.Enabled = OuiNon
End If
Next Cbar
End Sub
Dans ta procédure
Private Sub Workbook_Open() tu ajoutes
AutoriserMenusContextuels False
et dans
Private Sub Workbook_BeforeClose(Cancel As Boolean) tu ajoutes
AutoriserMenusContextuels True
Bon courage....
"C15" a écrit dans le message de
news:
Rebonjour,

Petites questions subsidiaires :
Comment protéger ma feuille (tel que j'ai fais mon tableau, la méthode
classique verrouiller cellules/protéger feuille plante) ?

Comment empêcher le clic droit sur les boutons(pour éviter d'accéder au
code) ?

Merci de ton aide.

A+

C15

C15 a écrit :
Bonjour Jero,

Je reviens vers toi après un long silence.

J'ai encore beaucoup travaillé sur mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201001/cijswTFwgQ.xls

Concernant la plage "Données", je l'ai limité au poids des passagers
avant et au carburant embarqué ; en effet on peut n'avoir ni passagers
arrière ni bagages.

J'ai voulu faire quelque chose qui ressemble à une appli et donc sans
barre de menus, d'outils, de formule.
C'est peut-être pas le top, mais j'y suis presque arrivé pour qu'à
l'ouverture cela soit "propre", sans pour autant supprimer ces barres
dans Excel ou les autres fichiers.

Ce que je n'arrive pas trop à gérer c'est la fermeture (Before Close ou
auto_close et/ou 2 boutons "fermer en sauvegardant" et "fermer sans
sauvegarder".
L'utilisateur de base n'a pas besoin de sauvegarder a priori.
Moi, si je dois modifier ce fichier, je dois pouvoir.

Pour info aux environ de la cellule A35, j'ai un bouton invisible pour
afficher la barre de menus (je n'ai pas trouvé mieux comme astuce).


Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Tu as toujours la même erreur (2 fois) à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"






tu avais : ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage '!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
(l'erreur est à 'Masse et centrage ' : c'est 'Masse et centrage' sans
espace après centrage)
Sinon, après correction ça roule... prêt pour le décollage ;>)
A+
"C15" a écrit dans le message de
news: O%
Bonsoir,

Voilà...

http://www.cijoint.fr/cjlink.php?file=cj201001/cijAk3U2we.xls

Merci de ton aide.

A+

C15

jero a écrit :
Salut,
Peux-tu mettre ton fichier sur Ci-Joint ?
A+

"C15" a écrit dans le message
de news: %
Bonsoir Jero,

J'ai corrigé selon tes indications, il n'y a plus de bug de
fonctionnement...mais l'alerte ne s'affiche plus si l'on dépasse le
poids max au D/L !

Merci de ton aide.

A+

C15
jero a écrit :
Salut,
Quelques corrections :
1-
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
On Error Resume Next
Range("Données").ClearContents
On Error GoTo 0
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
Note : c'est bien Range("Données").ClearContents et non
Range("Données").ClearComments
2-
Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub
Note : Il y avait une erreur à :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
(un espace de trop dans 'Masse et centrage'!...) et en passant un
p'tit conseil : évite les espaces dans les noms de feuille, etc...
surtout si tu veux faire un peu de programmation , par ex.
MasseEtCentrage c'est très lisible - en alternant Majuscules et
Minuscules ; c'est pour ça que l'éditeur VBA ajoute des guillemets
simple, sinon tu aurais :
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="=MasseEtCentrage!$A$26:$C$26,MasseEtCentrage!$B$12:$B$14"

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont bien
été saisies
Dim Cel, P As Boolean
P = True
On Error GoTo Sortie:
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
Exit Function
Sortie:
SaisieComplète = False
End Function
Note : J'ai ajouté un traitement d'erreur (On Error...) au cas où
le nom ne serais pas encore défini.
Voilà, voilà...
A+

"C15" a écrit dans le
message de news: O%
Bonsoir Jero,

1 Tu avais raison, la procédure je l'avais mise 2 fois (dans 1
nouveau module et rajoutée à un module existant).
2 et 3 corrigé.
4 OK.
5 j'avais fait attention aux coupures de lignes.

J'ai revérifié et maintenant cela bloque sur "la méthode Range de
l'objet Global a échoué" concernant la ligne
For Each Cel In Range(Plage)

Pour info ci joint le fichier.

http://www.cijoint.fr/cjlink.php?file=cj201001/cijDPZYrA7.xls

Tu verras que grâce à tes conseils j'ai sacrément améliorer le
fichier, notamment la gestion des graphiques (un peu galère car
les échelles des axes ne sont pas identiques d'un avion à
l'autre).
Je ne me suis pas encore penché sur tes derniers conseils de
mettre en place des variables et d'utiliser la méthode case pour
"regrouper" des procédures similaires, même si hélas les données
étant relativement variables d'un avion à l'autre, le gain ne
sera peut-être pas si intéressant que cela.
Je vais m'y lancer d'ici à la fin de la semaine.

Merci de ton aide.

A+

C15






jero a écrit :
Salut,
1-> De plus j'ai un problème avec DéfinirPlageDonnées et
SaisieComplète (noms ambigus).
Tu n'aurais pas copié 2 fois les procédures ?
2-> Par ailleurs cela coince sur Range("Données").ClearComments
Tu as raison, c'est Range("Données").ClearContents
3-> l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents
Oui, mais tu peux supprimer cette ligne
4-> Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas
dans la procédure DéfinirPlageDonnées
Non, la procédure DéfinirPlageDonnées n'est utilisée que pour
définir le nom "Données", c'est normal...
5-....(ou une non maitrise du copier/coller).
Peut-être, fais attention, par exemple :
ActiveWorkbook.Names.Add Name:="Données", RefersTo:="='Masse et
centrage'!$A$26:$C$26,'Masse et centrage'!$B$12:$B$14"
C'est sur UNE SEULE LIGNE... Pour le vérifier, lorsque tu fais
copier/coller, tu ne dois pas obtenir de lignes "en rouge" ;
cela signifierait une erreur de syntaxe.
A+

"C15" a écrit dans le
message de news:
Bonjour Jero,

Dans ta procédure DéfinirPlageDonnées
j'ai modifié les plages en RC car Excel ne semblait pas trop
aimer.

Dans Worksheet_Change tu fais appel à G5 or G5 n'est pas dans
la procédure DéfinirPlageDonnées.

Par ailleurs cela coince sur
Range("Données").ClearComments

l'apostrophe est-il justifié pour :
'Range("A26,B26,C26,B12:B14").ClearContents

Ne serait-ce pas plutôt
Merci de ton aide en me disant si c'est une mauvaise analyse de
ma part (ou une non maitrise du copier/coller).

A+

C15


jero a écrit :
Salut,
Dans la feuille "Masse et centrage" :

Private Sub Worksheet_Calculate()
If SaisieComplète("Données") Then 'Si toutes les données ne
sont pas saisies, aucun message
If Range("B20").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (2900 livres)", vbOKOnly
'Inutile (la masse à l'ATR est forcément
inférieure à la masse au D/L non ?)
'ElseIf Range("B22").Value > 2900 And
Right(Range("G5"), 2) = "RN" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (2900 livres)", vbOKOnly
ElseIf Range("B20").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (1157 kg)", vbOKOnly
'ElseIf Range("B22").Value > 1157 And
Right(Range("G5"), 2) = "JC" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (1157 kg)", vbOKOnly
ElseIf Range("B20").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
MsgBox "Vous avez dépassé la masse max autorisée
au D/L (780 kg)", vbOKOnly
'ElseIf Range("B22").Value > 780 And
Right(Range("G5"), 2) = "AK" Then
'MsgBox "Vous avez dépassé la masse max autorisée
à l'ATR (780 kg)", vbOKOnly
End If
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G5")) Is Nothing Then
'Range("A26,B26,C26,B12:B14").ClearContents
Range("Données").ClearComments
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
DéfinirPlageDonnées Right(Range("G5"), 2)
End If
End Sub

Dans un module standard :

Sub DéfinirPlageDonnées(TypeAvion As String)
'Cette procédure permet de définir un nom ("Données") qui
correspond aux cellules à saisir
'Cette plage peut-être différente d'un avion à l'autre
'A compléter....
On Error Resume Next
ActiveWorkbook.Names("Données").Delete
On Error GoTo 0
Select Case TypeAvion
Case "JC", "RN"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12:$B$14"
Case "AK"
ActiveWorkbook.Names.Add Name:="Données",
RefersTo:="='Masse et centrage'!$A$26:$C$26,'Masse et
centrage'!$B$12,'Masse et centrage'!$B$14"
Case Else
End Select
End Sub

Function SaisieComplète(Plage As String) As Boolean
'Cette fonction permet de vérifier que TOUTES les données ont
bien été saisies
Dim Cel, P As Boolean
P = True
For Each Cel In Range(Plage)
P = P And Not IsEmpty(Cel)
Next
SaisieComplète = P
End Function

Note :
Tu pourrais remplacer la procédure Worksheet_Calculate() par
:
Private Sub Worksheet_Calculate()
Dim Msg As String, PoidsMax As Single
If SaisieComplète("Données") Then
Select Case Right(Range("G5"), 2)
Case "RN"
PoidsMax = 2900
Case "JC"
PoidsMax = 1157
Case "AK"
PoidsMax = 780
End Select
If Range("B20").Value > PoidsMax Then
Msg = "Vous avez dépassé la masse max
autorisée au D/L (" & PoidsMax & ")"
MsgBox Msg, vbOKOnly
End If
End If
End Sub

A+
jpg

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le
message de news: %
Bonsoir,
Au lieu de lancer la MsgBox à chaque if, on peut ne la lancer
qu'à la fin, en ayant simplement adapté le message à chaque
cas :

Private Sub Worksheet_Calculate()
Dim monMess as string

If Range("B20").Value > 2900 And Right(Range("G5"), 2) = "RN"
Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)"

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)"

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)"

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)"

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée au D/L
(780 kg)"

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
monmess = "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)"

End If
MsgBox monmess, vbOKOnly
End Sub

--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/web/mpfe
News://news.microsoft.com/microsoft.public.fr.excel
"C15" a écrit dans le
message de news:
Bonjour à tous et à toutes,

J'ai un fichier avec un tableau pour calculer les masses et
centrage de différents avions.

Gràce à Jéro et Michdenis, j'ai mis en place une longue
procédure qui me permet d'actualiser le graphique en
fonction de données saisies dans le tableau.

J'ai en particulier la procédure suivante :

Private Sub Worksheet_Calculate()

If Range("B20").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(2900 livres)", vbOKOnly

ElseIf Range("B22").Value > 2900 And Right(Range("G5"), 2) =
"RN" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(2900 livres)", vbOKOnly

ElseIf Range("B20").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L
(1157 kg)", vbOKOnly

ElseIf Range("B22").Value > 1157 And Right(Range("G5"), 2) =
"JC" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(1157 kg)", vbOKOnly

ElseIf Range("B20").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée au D/L (780
kg)", vbOKOnly

ElseIf Range("B22").Value > 780 And Right(Range("G5"), 2) =
"AK" Then
MsgBox "Vous avez dépassé la masse max autorisée à l'ATR
(780 kg)", vbOKOnly

End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("G5")) Is Nothing Then
Range("A26,B26,C26,B12:B14").ClearContents
Select Case Right(Range("G5"), 2)
Case "RN"
Macro_RN
Case "JC"
Macro_JC
Case "AK"
Macro_AK
End Select
End If


End Sub


Le Worksheet_Calculate() me permet d'afficher une boite de
dialogue si les données calculées en B20 et/ou B22 sont >
valeur spécifique à un avion immatriculé AK, JC ou RN.

La Worksheet_Change(ByVal Target As Range) me remplit
certaines cellules du tableau (et par conséquent du
graphique) en fonction de l'avion sélectionné dans une liste
déroulante, par l'exécution des macros Macro_AK...

Cette msgbox n'apparait normalement que lorsque le tableau
est entièrement renseigné sauf si je choisis d'abord RN pour
afficher les données de cet avion et qu'après je choisis un
des 2 autres (normal 2900>1157 ou 780).
Elle apparait alors avant l'actualisation du tableau, elle
disparait dès que je fais OK.
Elle réapparait si B20>...

Comment faire pour que ces msgbox ne s'affiche réellement
que si B20>1157 (ou 780) ?


Merci de votre aide.

A+

C15

































1 2