Comment trouver une ligne correspondante dans Excel?
Donné
Une clé de recherche
---------------------------
| | A | B | C | D |
---------------------------
| 1 | 01 | 2 | 4 | TextA |
---------------------------
Une feuille Excel
------------------------------
| | A | B | C | D | E |
------------------------------
| 1 | 03 | 5 | C | TextZ | |
------------------------------
| 2 | 01 | 2 | 4 | TextN | |
------------------------------
| 3 | 01 | 2 | 4 | TextA | |
------------------------------
| 4 | 22 | T | N | TextX | |
------------------------------
Question
Je voudrais avoir une fonction comme ceci: f(clé) -> result_row.
Qui signifie: étant donné une clé de recherche (01, 2, 4, TextA), la fonction est de me dire que la ligne correspondante est 3 dans l'exemple ci-dessus.
Les valeurs dans la clé de recherche (A, B, C, D) est un identificateur unique.
Comment puis-je obtenir le numéro de ligne de la ligne correspondante?
Une solution
La solution qui vient en premier à l'esprit est d'utiliser Visual Basic pour Applications (VBA) pour analyser la colonne A pour "01". Une fois j'ai trouvé une cellule contenant "01", j'aimerais vérifier les cellules adjacentes dans les colonnes B, C et D si elles correspondent à mes critères de recherche.
Je suppose que l'algorithme fonctionne. Mais: est-il une meilleure solution?
Version
- Excel 2000 9.0.8961 SP3
- VBA 6.5
Toutefois, si vous connaissez une solution dans toutes les versions ultérieures d'Excel ou VBA, je suis curieux de savoir en tant que bien.
Edit: 22.09.2010
Merci à vous tous pour vos réponses. @MikeD: très belle fonction, merci!!!!
Ma solution
Voici la solution que j'ai prototypé. Tout est codé en dur, trop verbeux et non pas une fonction comme dans MikeD de la solution. Mais je vais le réécrire dans mon application réelle pour prendre des paramètres et retourner une valeur de résultat.
Sub FindMatchingRow()
Dim searchKeyD As Variant
Dim searchKeyE As Variant
Dim searchKeyF As Variant
Dim searchKeyG As Variant
Const indexStartOfRange As String = "D6"
Const indexEndOfRange As String = "D9"
' Initialize search key
searchKeyD = Range("D2").Value
searchKeyE = Range("E2").Value
searchKeyF = Range("F2").Value
searchKeyG = Range("G2").Value
' Initialize search range
myRange = indexStartOfRange + ":" + indexEndOfRange
' Iterate over given Excel range
For Each myCell In Range(myRange)
foundValueInD = myCell.Offset(0, 0).Value
foundValueInE = myCell.Offset(0, 1).Value
foundValueInF = myCell.Offset(0, 2).Value
foundValueInG = myCell.Offset(0, 3).Value
isUnitMatching = (searchKeyD = foundValueInD)
isGroupMatching = (searchKeyE = foundValueInE)
isPortionMatching = (searchKeyF = foundValueInF)
isDesignationMatching = (searchKeyG = foundValueInG)
isRowMatching = isUnitMatching And isGroupMatching And isPortionMatching And isDesignationMatching
If (isRowMatching) Then
Range("D21").Value = myCell.Row
Exit For
End If
Next myCell
End Sub
C'est la feuille Excel qui va avec le code ci-dessus:
OriginalL'auteur Lernkurve | 2010-09-21
Vous devez vous connecter pour publier un commentaire.
voici une petite fonction VBA j'utilise souvent pour ce genre de but
InRange
doivent être de la même largeur ou plus large queArg
, mais peut bien sûr être plus grande ou plus petite que la votre Un:DDans votre Exemple de fiche d'entrer dans une cellule vide "=findinrange(A1:D4,A3:D3)"
La formule renvoie "0" si rien n'a été trouvé d'autre de la ligne #
Bonne chance - MikeD
Danke für die Blumen! J'avais cette fonction sur stock 😉 ... nous faisons tout de même en quelque sorte. Je suppose que la clé à emporter ici pourrait être de prendre le problème à un niveau un peu plus élevé niveau d'abstraction: "comparer, ligne par ligne, un certain nombre de critères avec le même nombre de colonnes dans une plage donnée"
OriginalL'auteur MikeD
Supposons que votre clé de recherche commence en A1 et vos données commence en A3. Ce tableau formule renvoie le numéro de ligne où toutes les données qui correspond à la clé de recherche
Entrée avec ctrl+Maj+Entrée, pas juste à l'Entrée. Notez qu'il retourne la feuille de calcul en ligne, pas de la position dans le tableau. Si vous voulez que la position dans le tableau, vous pouvez soustraire un de moins que le départ de ligne de la table de résultat (2 dans ce cas, parce que le tableau commence sur la ligne 3).
Si il y en a plusieurs lignes qui correspondent, ce sera le retour de la somme de toutes les lignes (pas très utile). Mais je suppose qu'il y a seulement une ligne correspondante.
OriginalL'auteur Dick Kusleika
Une autre option est d'ajouter une nouvelle colonne de votre feuille excel où les colonnes d'Un:D sont concaténés, et ensuite utiliser le
lookup/sverweis
fonction. Ce serait probablement plus rapide qu'une solution VBA.hmm, il semble qu'il exigerait de même une colonne pour les numéros de ligne. Mais alors, pourquoi utiliser un numéro de ligne comme un id si vous avez une clé composite? Si vous étiez sur Excel2007,
sumifs
avec les numéros de ligne de la colonne ont été une autre option...Je ne veux pas en question l'intention d'obtenir le numéro de ligne si la question a été posée de cette façon, il y aura une bonne raison. D'autre part je suis d'accord avec vous qu'un "concaténés clé" dans de nombreux cas, est une bonne solution. J'ai l'habitude d'ajouter un caractère de séparation pour éviter des effets bizarres comme dans "12_34" vs "123_4".
Match plutôt de Recherche vous donnera la ligne.
OriginalL'auteur Karsten W.