Function.Match qui ne fonctionne pas
Bonjour,
Dans le fichier ci-joint, lorsque je clique sur le bouton en place sur la feuille ‘Effectif d'un mois’, il faut indiquer une date (entre janvier 2014 et décembre 2025). Mon code passe alors en revue toutes les feuilles et recherche sur les feuilles dont le nom commence par ‘Groupe’, sur la ligne 1, dans quelle colonne se trouve la date indiquée dans la InputBox.
J’ai finalement utilisé le code ci-dessous afin de trouver cette colonne
For k = 1 To 1000 'Pour avoir de la marge
If Sheets(i).Cells(1, k) = Mois_traité Then
Colonne_mois_traité = k
GoTo Etiquette_Bis
End If
Next k
Etiquette_Bis:car je ne suis pas arrivé à faire fonctionner le code suivant
Colonne_mois_traité = Application.WorksheetFunction.Match(Mois_traité, Sheets(i).Range("A1:Z1"), 0)Savez-vous pourquoi cette dernière ligne de code bloque ?
A vous relire.
Bonjour,
Après moultes essais et réflexion si on met Range("B1") dans la ligne ça fonctionne. B1 contenant la date à chercher.
Colonne_mois_traité = Application.WorksheetFunction.Match(Range(B1), Plage, 0)C'est la date qui pose problème, si on fait référence à une cellule qui contient la date ça va. Même phénomène d'ailleurs avec EQUIV
Curieux.
Salut Robjam et merci pour ta réponse
Ta solution est intéressante, mais elle ne me satisfait pas entièrement car j'hésitais à fusionner les textes des cellules A1 et B1 afin qu'il y ait un texte "suivi" en A1. Et puis également – et surtout - car j'aimerais comprendre la maniclette pour d'autres utilisations.
Sur la base de ton idée, j’ai ainsi tenté de donner diverses valeur à la variable ‘Mois_traité’ [ Cdate(Mois_traité), CStr(Mois_traité), CLng(Mois_traité) ], mais rien n’y fait.
Donc si tu as – ou qui que ce soit d’autre - une idée afin de pouvoir quand même utiliser ma ligne de code, ce serait le top. A préciser encore que je n’aimerais pas devoir passer par un nom comme ton nom ‘Plage’.
A vous relire.
Re,
J'avais essayé aussi les différents types. J'ai défini Plage parce qu'au début je croyais que c'était la cause du problème.
Regarder dans l'aide
Si vous utilisez une fonction de feuille de calcul qui requiert une référence de plage comme argument, vous devez indiquer un objet Range. Par exemple, vous pouvez utiliser la fonction de feuille de calcul Match pour rechercher une plage de cellules. Dans une cellule de feuille de calcul, vous devez taper une formule telle que =MATCH(9,A1:A10,0). En revanche, dans une procédure Visual Basic, vous spécifiez un objet Range pour obtenir le même résultat.
[/i
]Sub FindFirst()
myVar = Application.WorksheetFunction _
.Match(9, Worksheets(1).Range("A1:A10"), 0)
MsgBox myVar
End Sub Dans l'aide d'Excel on trouve.
On voit que Valeur cherchée peut être un nombre, un texte, une valeur logique. Rien pour les dates.
Référence du développeur Excel
WorksheetFunction.Match, méthode
Afficher toutAfficher tout
Masquer toutMasquer tout
Renvoie la position relative d'un élément dans une matrice (matrice : permet de créer des formules uniques permettant d'obtenir plusieurs résultats et qui agissent sur un groupe d'arguments répartis dans des lignes et des colonnes. Une plage matricielle partage une même formule tandis qu'une constante matricielle est un groupe de constantes qui sert d'argument.), qui correspond à une valeur spécifiée dans un ordre spécifié. Utilisez la fonction MATCH au lieu de l'une des fonctions LOOKUP lorsque vous avez besoin de la position d'un élément dans une plage au lieu de l'élément proprement dit.
Syntaxe
expression.Match(Arg1, Arg2, Arg3)
expression Variable représentant un objet WorksheetFunction.
Paramètres
Nom Obligatoire/Facultatif Type de données Description
Arg1 Obligatoire Variante Valeur_cherchée - valeur que vous utilisez pour rechercher la valeur souhaitée dans un tableau.
Arg2 Obligatoire Variante Matrice_recherche - plage de cellules contiguës contenant des valeurs de recherche possibles. Matrice_recherche doit être une matrice ou une référence à une matrice.
Arg3 Facultatif Variante Type - nombre -1, 0 ou 1. Type spécifie la manière dont Microsoft Excel recherche valeur_cherchée dans matrice_recherche.
Valeur renvoyée
Double
Remarques
Valeur_cherchée est la valeur à recherche dans matrice_recherche. Par exemple, lorsque vous recherchez le numéro d'une personne dans un annuaire, vous utilisez le nom de la personne sous forme de valeur recherchée, mais c'est le numéro de téléphone que vous recherchez.
Valeur_cherchée peut être une valeur (nombre, texte ou valeur logique) ou une référence de cellule à un nombre, du texte ou une valeur logique.
Si type prend la valeur 1, la fonction MATCH recherche la plus grande valeur qui est inférieure ou égale à valeur_cherchée. Matrice_recherche doit être placée dans l'ordre croissant : ...-2, -1, 0, 1, 2, ..., A-Z, FALSE, TRUE.
Si type prend la valeur 0, la fonction MATCH recherche la première valeur qui est exactement égale à valeur_cherchée. Matrice_recherche peut se trouver dans un ordre quelconque.
Si type prend la valeur -1, la fonction MATCH recherche la plus petite valeur qui est supérieure ou égale à valeur_cherchée. Matrice_recherche doit être placée dans l'ordre croissant : TRUE, FALSE, Z-A, ...2, 1, 0, -1, -2, ..., etc.
Si type est omis, il est considéré comme égal à 1.
La fonction MATCH renvoie la position de la valeur recherchée dans matrice_rechercher, et non la valeur proprement dite. Par exemple, la fonction MATCH("b",{"a","b","c"},0) renvoie 2, la position relative de « b » dans la matrice {"a","b","c"}.
La fonction MATCH ne distingue pas les majuscules et les minuscules lors de la recherche des valeurs de texte.
Si la fonction MATCH ne parvient pas à trouver une valeur correspondante, elle renvoie la valeur d'erreur #N/A.
Si type prend la valeur 0, vous pouvez utiliser des caractères génériques, des points d'interrogation (?) et des astérisques (*), dans lookup_value. Un point d'interrogation correspond à un caractère unique, un astérisque à une séquence de caractères. Si vous souhaitez rechercher un point d'interrogation ou un astérisque, entrez un tilde (~) avant le caractère.
Merci pour cette nouvelle réponse,.
Ce n'est pas évident de savoir ce qui est ton texte, ce qui est le texte copié de l'aide Excel.
Dans cette aide, il est quand même indiqué que l'on peut rechercher avec une 'valeur logique' et il me semble qu'une date est une valeur logique.
Si quelqu'un d'autre à également une idée.
Amicalement.
Bonjour
Modifies ta ligne
Colonne_mois_traité = Application.WorksheetFunction.Match(CSng(Mois_traité), Sheets(i).Range("A1:Z1"), 0)Un conseil:
Il faut typer ta variable de retour ( Colonne_mois_traité) en variant
Car cette fonction peut te retourner une erreur si donnée non trouvée
Normalement (une solution)
Option Explicit
Sub aa()
Dim i As Byte, j As Integer, k As Integer, Mois_traité As Date
Dim DerLig As Integer, Colonne_mois_traité, compteur As Integer
Application.ScreenUpdating = False
Mois_traité = InputBox("Indique une date au format MM.AAAA")
Range("A2:A" & Rows.Count).Clear
Range("B1") = Mois_traité
For i = 1 To Sheets.Count
If Left(Sheets(i).Name, 6) <> "Groupe" Then GoTo Etiquette
DerLig = Range("A" & Rows.Count).End(xlUp).Row
Range("A" & DerLig + 1) = Sheets(i).Name
Rows(DerLig + 1).RowHeight = 20
Rows(DerLig + 1).Font.Bold = True
Colonne_mois_traité = Application.Match(CSng(Mois_traité), Sheets(i).Range("A1:Z1"), 0)
If Not IsError(Colonne_mois_traité) Then
For j = 5 To Sheets(i).Range("A" & Rows.Count).End(xlUp).Row
If Sheets(i).Cells(j, Colonne_mois_traité) <> "" Then
compteur = compteur + 1
Range("A" & DerLig + compteur + 1) = Sheets(i).Cells(j, 1)
End If
Next j
Else
MsgBox "Mois non trouvé dans la page " & Sheets(i).Name
End If
Etiquette:
compteur = 0
Next i
ActiveSheet.PrintOut
End SubDans ce code j'utilise Application.Match à la place de Application.WorksheetFunction.Match
Résultat différent si donnée non trouvée
Pourquoi ?
I don't know
Salut Banzai et merci pour ta réponse.
Moi qui espérait une solution toute simple ....
Mais au moins j'ai une explication presque complète. A ce sujet, ça fait plaisir de voir que même toi tu dois dire de temps en temps : I don't know
Cordialement.