OVH Cloud OVH Cloud

Comparer une valeur à celle d'un array

9 réponses
Avatar
René Delcourt
Bonjour à toutes et à tous,

Je voudrais rendre visible tous les items d'un pivotlist visible SI leur
valeur est égale à une valeur stockée "derndate(Y)".
Je trouve que la solution IF est un peu longuette.
Une suggestion?

Public derndate(0 To 100) As Date

For Y = 0 To duree
derndate(Y) = DateFin - Y
Next
PivotCacheDate

Sub PivotCacheDate()
Dim pt As PivotTable
Dim pf As PivotField
Dim Pi As PivotItem
Application.DisplayAlerts = False
On Error Resume Next
For Each pt In ActiveSheet.PivotTables
For Each pf In pt.RowFields
pf.AutoSort xlManual, pf.SourceName
If pf = Choix1 Then
For Each Pi In pf.PivotItems
>>>C'est ici<<<< If derndate(0) = Pi.Value Or Pi.Value = derndate(1) Or Pi.Value = derndate(2) Or Pi.Value = derndate(3) Or Pi.Value = derndate(4) Or Pi.Value = derndate(5) Or Pi.Value = derndate(6) Or _
Pi.Value = derndate(7) Or Pi.Value = derndate(8) Or
Pi.Value = derndate(9) Or Pi.Value = derndate(10) Or Pi.Value = derndate(11)
Or Pi.Value = derndate(12) Or Pi.Value = derndate(13) Or _
Pi.Value = derndate(14) Or Pi.Value = derndate(15) Or
Pi.Value = derndate(16) Or Pi.Value = derndate(17) Or Pi.Value = derndate(18)
Or Pi.Value = derndate(19) Or Pi.Value = derndate(20) Or _
Pi.Value = derndate(21) Or Pi.Value = derndate(22) Or
Pi.Value = derndate(23) Or Pi.Value = derndate(24) Or Pi.Value = derndate(25)
Or Pi.Value = derndate(26) Or Pi.Value = derndate(27) Or _
Pi.Value = derndate(28) Or Pi.Value = derndate(29) Or
Pi.Value = derndate(30) Or Pi.Value = derndate(31) Then
Pi.Visible = True
Else
Pi.Visible = False
End If
Next Pi
End If
pf.AutoSort xlAscending, pf.SourceName
Next pf
Next pt
Application.DisplayAlerts = True
End Sub

Merci
--
René Delcourt

9 réponses

Avatar
AV
| Une suggestion?

Refaire le TCD sur la base filtrée en fonction du critère....

AV
Avatar
anonymousA
Bonjour,

Toujours possible de chaercher si une valeur appartient à un tableau
en utilisant Match, ce qui simplifie la recherche de pi.value dans le
tableau derndate

ex ci-dessous

Dim derndate(1 To 31)

For I = 1 To 31
derndate(I) = I
Next
derndate(20) = "toto"
On Error Resume Next
MsgBox Application.WorksheetFunction.Match("toto", derndate, 0)
If Err Then MsgBox "pas trouvé"

A+
Avatar
René Delcourt
Merci.

et si la comparaison se fait sur un tableau de type
Reg=("aa","bb","cc") ?
--
René Delcourt



Bonjour,

Toujours possible de chaercher si une valeur appartient à un tableau
en utilisant Match, ce qui simplifie la recherche de pi.value dans le
tableau derndate

ex ci-dessous

Dim derndate(1 To 31)

For I = 1 To 31
derndate(I) = I
Next
derndate(20) = "toto"
On Error Resume Next
MsgBox Application.WorksheetFunction.Match("toto", derndate, 0)
If Err Then MsgBox "pas trouvé"

A+




Avatar
René Delcourt
Encore moi...

Application.WorksheetFunction.Match("toto", derndate, 0)

Le derndate me pose problème (1004).
derndate reprend-il toutes les valeurs qui ont été stockées dans la boucle
précédente?
--
René Delcourt



Bonjour,

Toujours possible de chaercher si une valeur appartient à un tableau
en utilisant Match, ce qui simplifie la recherche de pi.value dans le
tableau derndate

ex ci-dessous

Dim derndate(1 To 31)

For I = 1 To 31
derndate(I) = I
Next
derndate(20) = "toto"
On Error Resume Next
MsgBox Application.WorksheetFunction.Match("toto", derndate, 0)
If Err Then MsgBox "pas trouvé"

A+




Avatar
anonymousA
idem sous réserve bien sur que Reg soit défini comme un array ( cf
ci-dessous). D'ailleurs autrement, il y a une erreur de syntaxe.

Reg = Array("aa", "bb", "cc")
MsgBox Application.WorksheetFunction.Match("bb", Reg, 0)

le proc ci dessus renverra 2 qui est bien la position de la chaine "bb"
dans l'array.

A+
Avatar
anonymousA
oui.Mais s'il ne trouve pas toto et sans gestion d'erreur, il se plante
ce qui est bien normal. dans l'exemple initial que je t'avais fait
parvenir, j'avais pris le soin d'affecter à l'un des éléments du
tableau derndate la valeur toto.

A+
Avatar
René Delcourt
Alors je ne comprends pas pourquoi ce code ne fonctionne pas :
If pf = Choix1 Then
For Each Pi In pf.PivotItems
If Evaluate(Application.WorksheetFunction.Match(Pi,
DernDate, 0)) <> Err Then Pi.Visible = True Else Pi.Visible = False
Next Pi
End If
PS: Je suis content de te retrouver sur ce forum. Je me souviens que , à mes
débuts en VBA, tu m'avais souvent dépanné.
--
René Delcourt



oui.Mais s'il ne trouve pas toto et sans gestion d'erreur, il se plante
ce qui est bien normal. dans l'exemple initial que je t'avais fait
parvenir, j'avais pris le soin d'affecter à l'un des éléments du
tableau derndate la valeur toto.

A+




Avatar
anonymousA
Re,

merci pour le PS de mon POST.

Pour ce qui est de ton problème, je ne comprends pas quelque chose.Si
comme je le crois , pf est un champ, alors tu ne peux pas affecter un
objet à une variable en dehors de Set.Par ailleurs, je ne vois pas bien
l'interêt de Evaluate dans ta syntaxe mais peut-être pourras-tu me
l'expliquer ?

un exemple ci-dessous avec un array derndate qui ne ressemble evidemment
pas au tien ( mais c'est pour la pédagogie)

Sub tt()

Dim pt As PivotTable
Dim sh As Worksheet
Dim choix1 As PivotField

Set sh = ActiveSheet
Set pt = sh.PivotTables(1)

Set choix1 = pt.PivotFields(2)
app choix1

End Sub

Sub app(pf As PivotField)

derndate = Array("bleu", "titi", "rouge")

For Each Pi In pf.PivotItems
On Error Resume Next
variable = Application.WorksheetFunction.Match(Pi, derndate, 0)
If Err Then
Err.Clear
Pi.Visible = False
Else
Pi.Visible = True
End If
Next Pi

End Sub

j'espère que ca t'éclaire plus.

A+

Alors je ne comprends pas pourquoi ce code ne fonctionne pas :
If pf = Choix1 Then
For Each Pi In pf.PivotItems
If Evaluate(Application.WorksheetFunction.Match(Pi,
DernDate, 0)) <> Err Then Pi.Visible = True Else Pi.Visible = False
Next Pi
End If
PS: Je suis content de te retrouver sur ce forum. Je me souviens que , à mes
débuts en VBA, tu m'avais souvent dépanné.


Avatar
René Delcourt
C'est nickel!
Encore merci
--
René Delcourt



Re,

merci pour le PS de mon POST.

Pour ce qui est de ton problème, je ne comprends pas quelque chose.Si
comme je le crois , pf est un champ, alors tu ne peux pas affecter un
objet à une variable en dehors de Set.Par ailleurs, je ne vois pas bien
l'interêt de Evaluate dans ta syntaxe mais peut-être pourras-tu me
l'expliquer ?

un exemple ci-dessous avec un array derndate qui ne ressemble evidemment
pas au tien ( mais c'est pour la pédagogie)

Sub tt()

Dim pt As PivotTable
Dim sh As Worksheet
Dim choix1 As PivotField

Set sh = ActiveSheet
Set pt = sh.PivotTables(1)

Set choix1 = pt.PivotFields(2)
app choix1

End Sub

Sub app(pf As PivotField)

derndate = Array("bleu", "titi", "rouge")

For Each Pi In pf.PivotItems
On Error Resume Next
variable = Application.WorksheetFunction.Match(Pi, derndate, 0)
If Err Then
Err.Clear
Pi.Visible = False
Else
Pi.Visible = True
End If
Next Pi

End Sub

j'espère que ca t'éclaire plus.

A+

Alors je ne comprends pas pourquoi ce code ne fonctionne pas :
If pf = Choix1 Then
For Each Pi In pf.PivotItems
If Evaluate(Application.WorksheetFunction.Match(Pi,
DernDate, 0)) <> Err Then Pi.Visible = True Else Pi.Visible = False
Next Pi
End If
PS: Je suis content de te retrouver sur ce forum. Je me souviens que , à mes
débuts en VBA, tu m'avais souvent dépanné.