Function Index/Match avec Filtrage

Bonjour le forum,

Le principe est de filtrer (via un filtre) des données et de récupérer via une combinaison Index/Match les infos qui m'interessent.

J'ai écris ceci :

vrenvoi = wf.Index(.Range("I8:M" & dl1).SpecialCells(xlCellTypeVisible), wf.Match(vcherchee, .Range(Cells(8, i + 1), Cells(dl1, i + 1)).SpecialCells(xlCellTypeVisible), 0), wf.Match(vcherchee, .Range("I7:M7"), 0))

J'ai l'erreur d'éxécution 1004 : Impossible de lire la propriété Match de la classe WorksheetFunction

En parlant uniquement de la SYNTAXE de cette ligne de code. Y a t il une erreur ? A noter que la valeur renvoyée(vrenvoi) et la valeur cherchée(vcherchée) sont de type String (donc pas la peine d'utiliser des Cdbl etc)

Je suis conscient que ce post est inutile vu qu'il n'y a aucun fichier exemple. Si je veux faire un fichier exemple, il faut que je mette tout le reste de mon code en amont et vous ne comprendrez rien.

En espérant que quelqu'un puisse m'aider.

PS : Bien évidemment, j'ai déclaré mes variables.

PISTE : J'ai l'impression qu'on ne peut pas utiliser .SpecialCells(xlCellTypeVisible) avec une fonction Match.

Merci d'avance

Salut MPETIT,

Procède par étape grâce à des variables

wf est un Worksheet je suppose, Index s'utilise de la sorte NumFeuille = wf.Index

Alors je ne vois pas ce que viennent faire toutes ces instructions dedans, mais sans fichier

@+

Bonjour le forum, bonjour BrunoM45,

Je vais tout expliquer de A à Z. J'ai fait une fichier exemple et je vais essayer d'être le plus concis.

Dans ce fichier exemple, j'ai 2 feuilles :

Feuil1 : Un planning représentant les moyens en préventif en fonction de la périodicité et de la semaine.

Feuil2 : Un visualisation permettant d'avoir directement un aperçu par semaine des préventifs.

Principe et étape (j'ai mis 3 étape dans mon code pour vous retrouver) :

Étape 1 : Je vais sur ma Feuil1. Je sélectionne le filtre de la S01, soit le filtre en cellule "K4". Je désactive le cochage "(Vides)". Le résultat nous donne les moyens ayant un préventif. Ces périodicités sont de 5 types : MEN, MEN+B, TRIM, SEM et ANN. Typiquement pour la S01, on a 3 machines en préventif. La première en TRIM, la seconde en SEM, et la troisième en MEN+B. Suite à ce filtre, je copie les plages "A30:BE" (plage fixe) et "K30:L103"(plage des périodicités).

Étape 2 : C'est cette étape que je fais manuellement actuellement et que je veux automatiser ! Dans la Feuil1, il y a dans la plage "F30:J103", des heures associées à une périodicité. Par exemple, pour S01, pour le premier moyen avec TRIM, on a 12h. Pour SEM, on a 4h et pour MEN+B on a 8h. J'aimerais après avoir copié les infos de l'étape 1, utiliser une fonction index/match pour rechercher les heures associées. Il me manque uniquement la ligne index/match.

Etape 3 : Dans la feuil2, je copie l'entête "ligne 8 et 9" et le N°de semaine associé de la feuil1.

Le fichier exemple est fonctionnel. L'étape 1 et 3 fonctionne parfaitement. C'est l'étape 2 qui me pose problème et particulièrement la ligne :

vrenvoi = wf.Index(.Range("I8:M" & dl2).SpecialCells(xlCellTypeVisible), wf.Match(vcherchee, .Range(Cells(8, j + 1), Cells(dl2, j + 1)).SpecialCells(xlCellTypeVisible), 0), wf.Match(vcherchee, .Range("I7:M7"), 0)) 'ce que j'essaye d'appliquer pour récupérer les heures associé à la périodicité.

En espérant avoir été assez clair.

Mon code n'est peut-être pas le plus optimal. Si vous avez du temps, n'hésitez pas à le modifier.

PS : J'avais déjà évoqué ce sujet dans un autre post mais sans la notion de filtrage.

Index-Equiv en VBA (excel-pratique.com)

Merci d'avance,

@+

Re,

Le fichier n'est pas complet il manque au moins 1 feuille

Mais en définissant la feuille "Planning 2021" comme suit

Dim ShtP As Worksheet
Set ShtP = ThisWorkbook.Sheets("Planning 2021")

Il faudrait essayer la fonction comme ça

vrenvoi = wf.Index(ShtP.Range("I8:M" & dl2).SpecialCells(xlCellTypeVisible), wf.Match(vcherchee, ShtP.Range(ShtP.Cells(8, j + 1), ShtP.Cells(dl2, j + 1)).SpecialCells(xlCellTypeVisible), 0), wf.Match(vcherchee, ShtP.Range("I7:M7"), 0)) 'ce que j'essaye d'appliquer pour récupérer les heures associé à la périodicité.

@+

Re,

En voulant aller vite, j'ai oublié de modifier l'étape 2 (les noms des feuilles viennent de mon fichier original).

Le voici modifié avec la fonction préconisé, néanmoins j'ai toujours la même erreur…

@+

Bonjour le fil, MPETIT

J'ai décortiqué le code et notamment la récupération de vrenvoi

J'y ai trouvé plusieurs problèmes :

1) La fonction Match ne semble pas vouloir marcher avec SpecialCells(xlCellTypeVisible)

2) Si je met des valeurs en dur pour wf.Index, j'ai toujours une erreur, donc ta fonction Index() ne marche pas non plus

Ton histoire semble vraiment compliquée et malgré ton explication je n'arrive pas à comprendre ce que tu veux faire exactement.

Bref perso j'arrête là, désole, j'ai le cerveau embrumé (besoin de vacances)

@+

Bonjour le forum, MPETIT,

1) En effet, je pense aussi qu'on ne peut pas appliquer SpecialCells(xlCellTypeVisible) sur la fonction Match.

En tout cas, merci d'avoir essayé ! C'est gentil de ta part.

Prend donc des vacances, ca devrait te faire du bien.

@+

Bonjour à tous,

Voici un essai en utilisant une fonction personnalisée MATCH_VISIBLE :

sub main()
'code
ligne& = MATCH_VISIBLE(vcherchee, .Range(Cells(8, i + 1), Cells(dl1, i + 1)))
if ligne > 0 then vrenvoi = wf.Index(.Range("I8:M" & dl1), ligne, wf.Match(vcherchee, .Range("I7:M7"), 0)) else vrenvoi = "#N/A"
'suite
end sub

function MATCH_VISIBLE(vcherchee, rVecteur as range) as long
dim cell as range
for each cell in rVecteur.cells
    n = n + 1
    if not (rows(cell.row).hidden or columns(cell.column).hidden) then
        if cell.value like vcherchee then MATCH_VISIBLE = n: exit function
    end if
next cell
end function

Je ne connais pas le type de vrenvoi. S'il est de type string, c'est bon, sinon, il faudra trouver autre chose ou le mettre de type variant...

Cdlt,

Rechercher des sujets similaires à "function index match filtrage"