VBA obtenir une action si condition fausse IF Else
Résolu
yanou91
-
yanou91 -
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
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:
- VBA obtenir une action si condition fausse IF Else
- Action - Guide
- Excel cellule couleur si condition texte - Guide
- Télécharger film d'action gratuitement et rapidement - Télécharger - TV & Vidéo
- Vous devez disposer d'une autorisation pour effectuer cette action - Guide
- Fausse alerte mcafee - Accueil - Piratage
3 réponses
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
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.
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.
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
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
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 !
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 !