Étant donnéComment trouver une ligne correspondante dans Excel?
Une recherche clé
---------------------------
| | 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. Cela signifie: à l'aide d'une clé de recherche (01, 2, 4, TextA), la fonction doit indiquer que la ligne correspondante est 3 dans l'exemple ci-dessus.
Les valeurs dans la clé de recherche (A, B, C, D) sont un identifiant unique.
Comment 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 Application (VBA) pour analyser la colonne A pour "01". Une fois que j'ai trouvé une cellule contenant "01", je vérifierais les cellules adjacentes dans les colonnes B, C et D si elles correspondent à mes critères de recherche.
Je suppose que cet algorithme va fonctionner. Mais: y a-t-il une meilleure solution?
Version
- Excel 2000 SP3 9.0.8961
- VBA 6,5
Toutefois, si vous connaissez une solution dans toutes les versions ultérieures d'Excel ou VBA, je suis curieux de savoir aussi bien.
Edit: 22.09.2010
Merci à tous pour vos réponses. @MikeD: très belle fonction, merci!
Ma solution
Voici la solution que je prototypé. Tout est codé en dur, trop verbeux et pas une fonction comme dans la solution de MikeD. Mais je vais le réécrire dans mon application actuelle 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
Ceci est la feuille Excel qui va avec le code ci-dessus:
très belle fonction, merci! J'ai mis à jour ma question avec ma solution, mais j'aime mieux ton exemple. – Lernkurve
Danke für die Blumen! J'ai eu cette fonction en stock ;-) ... nous faisons tous la même chose en quelque sorte. Je suppose que la clé à emporter ici pourrait être de prendre le problème à un niveau d'abstraction un peu plus élevé: "comparer ligne par ligne un certain nombre de critères avec le même nombre de colonnes dans une plage donnée" – MikeD