Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Nb occurences non juste

cathodique

XLDnaute Barbatruc
Bonjour,

j'ai voulu extraire des lignes de données d'un tableau répondant à un critères dans un autre tableau.
J'ai voulu redimensionner mon second tableau au préalable pour ne pas utiliser Redim Preserve.
J'ai trouvé la formule ci-dessous sur le site de Feu Jacques Boisgontier (Repose en paix. Merci)
qui donne le nombre d’occurrences, mais le résultat renvoyé n'est pas juste, il manque toujours 1.
Est-ce une mauvaise utilisation ou adaptation de ma part?
VB:
Option Explicit
Option Compare Text
Sub ChoixAnimal()
Dim Tbl(), i As Long, Tb(), cle, n As Integer
'cle = "Chat"
'cle = "Chien"
cle = "lapin"

'ajout 1 colonne pour mettre n° de ligne
 Tbl = Range("TbA").Resize(Range("TbA").ListObject.ListRows.Count, Range("TbA").ListObject.ListColumns.Count + 1).Value

'Dans la 3eme colonne d'un tableau Tbl(,3) à 2D.
n = UBound(Filter(Application.Transpose(Application.Index(Tbl, , 3)), cle)) 'manque toujours 1
'compter nombre d'occurence de la clé pour redim Tb
ReDim Tb(1 To n, 1 To UBound(Tbl, 2))
'l'objectif récupèrer uniquement les lignes répondant au critère avec leur n° de ligne

End Sub

Merci pour votre aide.

Bonne fin de dimanche.
 

Pièces jointes

  • NbOccurences.xlsm
    22.8 KB · Affichages: 5

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à @cathodique ,

Filter retourne toujours un tableau de base 0 et pas de base 1.

Vous vous compliquez un peu la vie , non ? Pourquoi ne pas utiliser Redim Preserve qui est très rapide ? Il a en plus l'avantage de rajouter une colonne vide contrairement à votre redimensionnement qui comprendra (le cas échéant) les valeurs de la colonne supplémentaire. Je déconseille le Filter qui donne des résultats pas toujours espéré si on ne le maitrise pas.

VB:
Sub ChoixAnimal()
Dim Tbl(), i As Long, Tb(), cle, n As Integer
   cle = "lapin"
   Tbl = Range("TbA").Value: ReDim Preserve Tbl(1 To UBound(Tbl), 1 To 1 + UBound(Tbl, 2))
   n = Application.CountIf(Range("TbA").Columns(3), cle)
   If n > 0 Then ReDim Tb(1 To n, 1 To UBound(Tbl, 2) + 1)
End Sub

Attention à Filter : x = Filter(Array("chien", "chat","chienne", "pinson","chien de prairie"), "chien", True) . x sera un tableau à 3 éléments et pas à un élément. On n'aura pas filtré que sur le mot chien.

edit : bonjour @TooFatBoy .
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour,

Tbl() est un tableau donc ses indices doivent commencer à zéro, et du coup le Ubound doit être égal au nombre de colonnes ou de lignes moins un.
Bonsoir @TooFatBoy ,

Je te remercie. Voici ce que j'ai trouvé, un exemple pour 1 tableau 1D et un autre pour 1 tableau 2D

On veut compter combien de fois toto apparaît dans la table Tbl() à 1 dimension.

n = UBound(Filter(Tbl, "toto", vbTextCompare))


Dans la 2eme colonne d'un tableau Tbl(,2) à 2D.

n=Ubound(Filter(Application.Transpose(Application.Index(Tbl, ,2)),"toto"))

J'ai utilisé le second exemple. Effectivement, mon tableau est option base 1.

Merci.
 

cathodique

XLDnaute Barbatruc
Bonsoir @mapomme ,

C'est surtout plus dans un but d'apprentissage. J'utilise le Redim Preserve. Cependant, je n'ai encore appris les bonnes pratiques. Je dirais plutôt, je n'arrive plus à tout retenir. Il y a tellement de choses. Et, bien souvent, manquant de pratique je me noie dans un verre d'eau à moitié plein.

Merci beaucoup.

Bonne soirée.
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…