XL 2019 Select Case 3 conditions imbriquées avec 2 variables

pat66

XLDnaute Impliqué
Bonjour le forum,

J'ai du mal rédiger cette macro avec select Case, quelqu'un aurait-il la gentillesse de me donner un coup de main
voici les conditions :

Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveSheet.Range("F30") <> "oxigene" then
Worksheets("Feuil2").Shapes("APC").Visible = false
Worksheets("Feuil2").Shapes("ORF").Visible = false

If ActiveSheet.Range("F30")="oxigene" and ActiveSheet.Range("F31") = "T" then
Worksheets("Feuil2").Shapes("APC").Visible = false
Worksheets("Feuil2").Shapes("ORF").Visible = true

If ActiveSheet.Range("F30")="oxigene" and ActiveSheet.Range("F31") <> "T" then
Worksheets("Feuil2").Shapes("APC").Visible = True
Worksheets("Feuil2").Shapes("ORF").Visible = false
end sub

un grand merci

pat66
 

Phil69970

XLDnaute Barbatruc
Bonjour @pat66
Edit Bonjour Job75
Je te propose ceci : (Non testé)

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Range("F30").Value
Case Is = "oxigene"  'Case "oxigene" '<== Les 2 versions devraient fonctionner
    If ActiveSheet.Range("F31") = "T" Then
        Worksheets("Feuil2").Shapes("APC").Visible = False
        Worksheets("Feuil2").Shapes("ORF").Visible = True
    Else
        Worksheets("Feuil2").Shapes("APC").Visible = True
        Worksheets("Feuil2").Shapes("ORF").Visible = False
    End If
Case Else
    Worksheets("Feuil2").Shapes("APC").Visible = False
    Worksheets("Feuil2").Shapes("ORF").Visible = False
End Select
End Sub


Merci de ton retour

@Phil69970
 
Dernière édition:

pat66

XLDnaute Impliqué
Bonjour Job75,
bonjour Phil69970

je vous remercie à tous les deux, je vais comparer la vitesse d'exécution de vos solutions,
Phil69970, ci joint ta solution dans le classeur ci joint , mais rien ne se passe ou tout disparait , j'ai du zappé quelque chose :eek:

Si F30 = "oxigene" et F31 = "T"
Worksheets("Feuil2").Shapes("APC").Visible = False
Worksheets("Feuil2").Shapes("ORF").Visible = True

Si F30 = "oxigene" et F31 <> "T",
Worksheets("Feuil2").Shapes("APC").Visible = true
Worksheets("Feuil2").Shapes("ORF").Visible = false

Si F30 <> "oxigene" ' peu importe F31
Worksheets("Feuil2").Shapes("APC").Visible = false
Worksheets("Feuil2").Shapes("ORF").Visible = False
 

Pièces jointes

  • Classeur1.xlsm
    14.9 KB · Affichages: 2
Dernière édition:

Phil69970

XLDnaute Barbatruc
Re

@pat66

Quand je vois cela je me dis qu'il va y avoir un problème
1684669522903.png
et dans le code "oxigene"

Toutes les conditions sont remplies si je ne m'abuse .....

1684668372833.png

1684668508776.png


je vais comparer la vitesse d'exécution de vos solutions,
Sur 3 lignes je doute que cela soit probant

Sur un grand nombre de ligne les select case sont le plus rapide et pour encore aller plus vite il faudrait savoir quelles valeurs sont le plus souvent rencontrées pour mettre les case dans un autre ordre....

Rappel : Dans le code les "if" sont tous testés les uns après les autres alors que que les select case sont évaluées dans l'ordre ou ils sont et dès que la valeur est ok on ne teste plus les autres select case d’où un gain de temps.

Rappel 2 : le case else est toujours à la fin car c'est uniquement si aucune des autres conditions "case" ne sont trouvé ...

Et je le répète sur 3 lignes cela m'étonnerait que tu vois une différence ....

@Phil69970
 
Dernière édition:

pat66

XLDnaute Impliqué
Re

@pat66

Quand je vois cela je me dis qu'il va y avoir un problème
Regarde la pièce jointe 1170593 et dans le code "oxigene"

Toutes les conditions sont remplies si je ne m'abuse .....

Regarde la pièce jointe 1170590
Regarde la pièce jointe 1170591


Sur 3 lignes je doute que cela soit probant

Sur un grand nombre de ligne les select case sont le plus rapide et pour encore aller plus vite il faudrait savoir quelles valeurs sont le plus souvent rencontrées pour mettre les case dans un autre ordre....

Rappel : Dans le code les "if" sont tous testés les uns après les autres alors que que les select case sont évaluées dans l'ordre ou ils sont et dès que la valeur est ok on ne teste plus les autres select case d’où un gain de temps.

Rappel 2 : le case else est toujours à la fin car c'est uniquement si aucune des autres conditions "case" ne sont trouvé ...

Et je le répète sur 3 lignes cela m'étonnerait que tu vois une différence ....

@Phil69970
HOuaouuu , milles excuses Phil66970

tout fonctionne à merveille

je reviens vers toi
 

Phil69970

XLDnaute Barbatruc

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
juste en passant
le if <>"oxygene" doit etre separé ou alors le reste du code doit etre dans un else

pour le faire dans un select case comme tu a plusieurs conditions
il faut utiliser un case true/false
ensuite il faut utiliser une règle de priorité de passage des cases sinon ça n'a pas l'effet escompté
car en effet plusieurs case peuvent te donner true ou false

et oui un case sera toujours plus rapide tout simplement parce que quand il a trouver le bon case on sort du select tandis qu'avec un if ou plusieur ou même avec des else , l'execusion lit tout les cases même si il a déjà trouver son "If"

bien que là avec 3 condition on a pas vraiment besoins de chercher gagner du temps

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Worksheets("Feuil2")
        Select Case True

        Case ActiveSheet.Range("F30") = "oxigene" And ActiveSheet.Range("F31") = "T"
            .Shapes("APC").Visible = False
            .Shapes("ORF").Visible = True

        Case ActiveSheet.Range("F30") = "oxigene" And ActiveSheet.Range("F31") <> "T"
            .Shapes("APC").Visible = True
            .Shapes("ORF").Visible = False

        Case ActiveSheet.Range("F30") <> "oxigene"
            .Shapes("APC").Visible = False
            .Shapes("ORF").Visible = False

        End Select
    End With
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Plus simple comme ça quand même :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Me.[F30:F31], Target) Is Nothing Then Exit Sub
   Me.Shapes("APC").Visible = Me.[F30].Value = "oxygène" And Me.[F31].Value = "T"
   Me.Shapes("ORF").Visible = Me.[F30].Value = "oxygène" And Me.[F31].Value <> "T"
   End Sub
 

pat66

XLDnaute Impliqué
re,

bonjour patricktoulon,
bonjour Dranreb,

pensez vous que l'on puisse ajouter une alternative de la façon suivante à F30, du genre :

pour patricktoulon
Case ActiveSheet.Range("F30") = "oxigene" or ActiveSheet.Range("F30") = "airliquide" And ActiveSheet.Range("F31") = "T"

ou pour Dranreb
Me.Shapes("APC").Visible = Me.[F30].Value = "oxygène" or Me.[F30].Value = "airliquide" And Me.[F31].Value = "T"

Dranreb, ta macro ne précises pas que les shapes sont sur la feuil2 et non sur la feuille active, c'est normal ?



merci d'avance
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Re
bonjout pat66
oui tu l'a fait
perso je suis un vieux de la vielle en terme de discipline c'est comme pour les maths je parenthèse les paragraphe d'operande
Enrichi (BBcode):
Case (ActiveSheet.Range("F30") = "oxigene" or ActiveSheet.Range("F30") = "airliquide" )And ActiveSheet.Range("F31") = "T"
 

pat66

XLDnaute Impliqué
re,

ok merci

j'ai modifié en ajoutant les parenthèses comme tu me le conseille
Case (ActiveSheet.Range("F30") = "oxigene" or ActiveSheet.Range("F30") = "airliquide" )And ActiveSheet.Range("F31") = "T"

mais j'ai le message suivant lorsque F30 <> de "oxigene" or de "airliquide"
erreur execution 13, incompatibité de type
et ensuite la macro ne fonctionne plus lorsque je modifies F30 ou F31

alors je viens de tester en ajoutant la gestion d'erreur bien connue
On Error Resume Next
With Worksheets("Feuil2")
----------
End Select
End With
On Error GoTo 0

Ca a l'air de fonctionner ! sinon je suivrais les conseils de Job75
 
Dernière édition:

job75

XLDnaute Barbatruc
Le plus simple c'est comme ceci :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Sheets("Feuil2").Shapes("APC").Visible = LCase(Range("F30")) = "oxigene" And Range("F31") <> "T"
Sheets("Feuil2").Shapes("ORF").Visible = LCase(Range("F30")) = "oxigene" And Range("F31") = "T"
End Sub
à condition que "oxigene" soit bien l'orthographe utilisée.
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 182
dernier inscrit
moutassim.amine