VBA obtenir une action si condition fausse IF Else

Résolu/Fermé
yanou91 - 22 janv. 2013 à 23:18
 yanou91 - 23 janv. 2013 à 22:11
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
A voir également:

3 réponses

via55 Messages postés 14509 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 janvier 2025 2 739
22 janv. 2013 à 23:27
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
0
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.
0
via55 Messages postés 14509 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 janvier 2025 2 739
23 janv. 2013 à 11:56
Bonjour,

Avez-vous essayé avec des AND comme je l'avais indiqué dans mon premier message ?
0
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
0
via55 Messages postés 14509 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 2 janvier 2025 2 739
23 janv. 2013 à 21:46
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 !
0
merci pour l'explication. et je me mets à la forge ^^.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
23 janv. 2013 à 11:23
Bonjour,

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

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