2010-09-21 5 views
3

É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:

alt text

Répondre

4

est ici une petite fonction VBA je l'utilise souvent pour ce genre de but

Function FindInRange(InRange As Range, Arg As Range) As Integer 
Dim Idx As Integer, Jdx As Integer, IsFound As Boolean 

    FindInRange = 0 
    IsFound = False 

    For Idx = 1 To InRange.Rows.Count 
     IsFound = True 
     For Jdx = 1 To InRange.Columns.Count 
      If InRange(Idx, Jdx) <> Arg(1, Jdx) Then 
       IsFound = False 
       Exit For 
      End If 
     Next Jdx 

     If IsFound Then 
      FindInRange = Idx 
      Exit For 
     End If 
    Next Idx 

End Function 

InRange doit être la même largeur ou plus large que Arg, mais peut être bien sûr plus grand ou plus petit que votre A: D

dans votre feuille d'échantillon entrer dans une cellule vide "= findinrange (A1: D4, A3: D3)"

la formule renvoie "0" si rien trouvé, sinon la ligne #

Bonne chance - MikeD

+0

très belle fonction, merci! J'ai mis à jour ma question avec ma solution, mais j'aime mieux ton exemple. – Lernkurve

+0

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

0

votre recherche On suppose commence clés A1 et vos données commence à A3.Cette formule de tableau retourne le numéro de ligne où toutes les données correspondant à la recherche clé

=SUM(($A$3:$A$6=A1)*($B$3:$B$6=B1)*($C$3:$C$6=C1)*($D$3:$D$6=D1)*(ROW($A$3:$A$6))) 

Entrée avec Ctrl + Maj + Entrée, non seulement Entrez. Notez qu'il renvoie la ligne de feuille de calcul, pas la position dans la table. Si vous voulez la position dans la table, vous pouvez soustraire un moins que la ligne de départ de la table du résultat (2 dans ce cas parce que la table commence à la ligne 3).

Si plusieurs lignes correspondent, la somme de toutes les lignes sera retournée (pas très utile). Mais j'ai supposé qu'il n'y avait qu'une seule ligne correspondante.

0

Une autre option consiste à ajouter une nouvelle colonne à votre feuille Excel où les colonnes A: D sont concaténées, puis utilisez la fonction lookup/sverweis. Ce serait probablement plus rapide qu'une solution VBA.

+0

et comment obtiendriez-vous le "nombre de ligne correspondante "hors de ce VLOOKUP? – MikeD

+0

hmm, semble qu'il faudrait encore une colonne de plus 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, les 'sumifs' et la colonne des numéros de lignes étaient une autre option ... –

+0

Je ne veux pas mettre en doute l'intention d'obtenir le numéro de ligne - si la question était posée de cette façon, il y aurait une bonne raison . D'un autre côté, je suis d'accord avec vous sur le fait qu'une «clé concaténée» dans de nombreux cas est une bonne solution. J'ai l'habitude d'ajouter un caractère de séparation pour éviter des effets étranges comme dans "12_34" contre "123_4". – MikeD