VBA obtenir une action si condition fausse IF Else [Résolu/Fermé]

Signaler
-
 yanou91 -
Bonjour,

Je voudrais savoir quelle fonction VBA pourrait me donner le contraire de l'instruction IF Else. C'est à dire que cette fonction nous donne une action si la condition est vrai et une autre (else) si elle est fausse. J'ai malheureusement remarqué que cela ne marchait que dans ce sens.

Quelle instruction IF... quelque chose (ou une autre) pourrait me permettre de citer quelques valeurs de champs pour lesquelles VBA doit les masquer dans le champ et cocher toutes les autres ?


Je place ci-dessous un exemple de fonction If Else (vrai puis faux) qui fonctionne pour vous donner un aperçu de ce que je voudrais faire.

En vous remerciant pour votre aide.


Dim pt As PivotItem
Dim PivotItem As PivotItem
For Each pt In ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Poste").PivotItems
If (pt.Name = "120") Or (pt.Name = "261") Or (pt.Name = "300") Or (pt.Name = "301") Or (pt.Name = "302") Or (pt.Name = "311") Or (pt.Name = "321") Or (pt.Name = "322") Or Then
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Poste").PivotItems(pt.Name).Visible = True
End With
Else:
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Poste")
.PivotItems(pt.Name).Visible = False
End With
End If
Next pt



excel2003

3 réponses

Messages postés
12850
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
20 novembre 2020
2 067
Bonsoir,


Il me semble que l'inverse serait :
If (pt.Name <>"120") And (pt.Name <>"261") And (pt.Name <>"300") And(pt.Name <> "301") And (pt.Name <>"302") And (pt.Name <>"311") And (pt.Name <>"321") And (pt.Name <>"322") Then
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _ "Poste").PivotItems(pt.Name).Visible = True

qui ne devrait faire l'action que pour les données autres que 120, 261 etc..

A essayer et me dire si c'est bon
Bonjour,

Tout d'abord merci pour votre réponse. Votre methode est bien trouvée. Elle devrait permettre de réaliser l'action voulu sans toucher au sens TRUE/FALSE de la fonction.

Malheureusement, vba persiste à ne pas faire l'action (les valeurs choisies ne sont pas décocher au TCD) tout en affichant aucune erreur dans l'execution de la macro.

Je vous mets le bout de code qui correspond à ce que j'ai fait. L'action "inverse" recherché est à appliquer sur le champs "CGR A".

En vous remerciant.


Dim pt As PivotItem
Dim AB As PivotItem
For Each pt In ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Poste").PivotItems
If (pt.Name = "120") Or (pt.Name = "261") Or (pt.Name = "300") Or (pt.Name = "301") Or (pt.Name = "302") Or (pt.Name = "311") Or (pt.Name = "321") Or (pt.Name = "322") Or (pt.Name = "330") Or (pt.Name = "331") Or (pt.Name = "332") Or (pt.Name = "336") Or (pt.Name = "339") Or (pt.Name = "340") Or (pt.Name = "341") Or (pt.Name = "342") Or (pt.Name = "343") Or (pt.Name = "351") Or (pt.Name = "354") Or (pt.Name = "356") Or (pt.Name = "357") Or (pt.Name = "358") Or (pt.Name = "502") Or (pt.Name = "600") Or (pt.Name = "603") Or (pt.Name = "604") Or (pt.Name = "300") Or (pt.Name = "140") Then
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Poste").PivotItems(pt.Name).Visible = True
End With
Else:
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Poste")
.PivotItems(pt.Name).Visible = False
End With
End If
Next pt


For Each AB In ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("CGR A").PivotItems
If (AB.Name <> "92110002") Or (AB.Name <> "92031300") Or (AB.Name <> "92212030") Or (AB.Name <> "92030900") Or (AB.Name <> "92070000") Or (AB.Name <> "92211011") Or (AB.Name <> "92020008") Then
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"CGR A").PivotItems(AB.Name).Visible = True
End With

Else:
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"CGR A")
.PivotItems(AB.Name).Visible = False
End With

End If
Next AB

PS : J'ai testé egalement en retirant la partie Else pour le champ CGR A et ca donne le meme resultat.
Messages postés
12850
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
20 novembre 2020
2 067
Bonjour,

Avez-vous essayé avec des AND comme je l'avais indiqué dans mon premier message ?
Toutes mes excuses.

J'ai pas vu les "And" tellement j'etais obsédé par les "><". Cela marche parfaitement. merci beuacoup. Je débute sur VBA j'ai acheté un livre pour m'y former. une derniere chose : pourriez vous me dire pourquoi cela marche avec le "and" plutot que le "Or"?. Au depart j'avais mis "Or" car je voulais pas que VBA crois qu'il faille que toutes les valeurs soit présentes obligatoirement.

Merci beaucoup
Messages postés
12850
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
20 novembre 2020
2 067
Au départ tu avais bien raison de mettre OR dans le sens ou tu voulais que la condition s'effectue :
SI A=x OU A=y ALORS action
action s'effectuant pour x comme pour y
Comme tu voulais que la condition s'exécute à l'envers il faut donc prendre le contraire :
= devient <> et OU devient ET, c'est la logique mathématique !

Bonne lecture et bonne pratique
C'est en forgeant qu'on devient forgeron !
merci pour l'explication. et je me mets à la forge ^^.
Messages postés
23656
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
19 novembre 2020
6 479
Bonjour,

92110002 est-il réellement une chaine ?
Si nombre : <>92110002

Et sans fichier c'est discuter dans le vide...
eric
Effectivement. Maintenant la macro fonctionne. Merci d'avoir répondu sur le sujet.