2008-10-21 20 views
1

J'ai une table de données de 2 variables 100x100 dans Excel.recherche de données dans Excel

J'ai besoin d'une fonction qui retourne tous les ensembles possibles de variables qui donnent une valeur cible donnée. Ce que je regarde est une sorte de fonction de recherche reursive bidimensionnelle. Quelqu'un peut me diriger dans la bonne direction?

+0

On ne sait pas ce que vous voulez. Pouvez-vous poster quelques exemples de données, une table 5x5 dire, avec le résultat que vous recherchez dans le format que vous le souhaitez. – Hobbo

+0

ne pouvez-vous pas simplement écrire une macro qui utilise la fonction Excel LOOKUP? – Simon

Répondre

1

Il peut se faire sans VBA, assez compacte, comme si.

Supposons que votre table de 100x100 est en B2: CW101, et nous avons mis une liste des numéros 1 à 100 sur la gauche de A2 à A101, et encore 1 à 100 dans la partie supérieure de B1 à CW1

Créer une colonne de cellules en dessous, en commençant (par exemple) dans B104

B104=MAX(($A$2:$A$101*100+$B$1:$CW$1<B103)*($B$2:$CW$101=TargetValue)*($A$2:$A$101*100+$B$1:$CW$1)) 

Ceci est une formule « tableau », donc appuyez sur Ctrl-Maj-Entrée au lieu de Enter, et accolades {} doit apparaître dans la formule.

Puis recopiez pour autant de lignes que vous pourriez avoir besoin. Vous devez également placer un grand nombre au-dessus de votre première formule, par exemple dans B103, par exemple 999999.

La formule consiste à calculer Rowx100 + Column, mais uniquement pour chaque cellule réussie, et la fonction MAX trouve le résultat le plus grand , en excluant tous les résultats précédents trouvés, c'est-à-dire qu'il trouve les résultats cibles un à la fois, en partant du bas à droite et en allant vers le haut à gauche. (Avec un peu d'effort, vous pouvez l'obtenir pour chercher dans l'autre sens). Cela vous donnera des résultats comme 9922, qui est la ligne 99, colonne 22, et vous pouvez facilement extraire ces valeurs à partir du nombre.

Espérons que cela a du sens.

+0

($ B $ 2: $ CW $ 101 = TargetValue) Que fait cette partie? Cette construction ne me semble pas familière. –

+0

Cela vérifie si les cellules de B2: CW101 sont égales à la valeur souhaitée. Je l'ai juste appelé TargetValue. Si vous demandez comment nous pouvons tester 10 000 cellules à la fois, alors vous voulez savoir comment fonctionnent les "formules matricielles". Il y a quelques très bonnes explications d'entre eux, comme ici - www.cpearson.com/excel/array.htm – dbb

+0

Great link, Merci. C'est maintenant aussi clair que le jour. –

0

J'ai essayé beaucoup sans utiliser VBA mais ne semble pas être possible sans elle. Pour résoudre ce problème, je devais faire une boucle dans tout le tableau et trouver les valeurs les plus proches. Ces valeurs ont ensuite été dédoublées en utilisant des appels et des propriétés de plage et la sortie a été générée dans une plage incrémentée à chaque correspondance valide.

La mise en œuvre rapide et sale est comme sous:

Dim arr As Range 
Dim tempval As Range 
Dim op As Integer 

Set arr = Worksheets("sheet1").Range("b2:ao41") 
op = 1 
Range("B53:D153").ClearContents 





For Each tempval In arr 
If Round(tempval.Value, 0) = Round(Range("b50").Value, 0) Then 

Range("b52").Offset(op, 0).Value = Range("a" & tempval.Row).Value 
Range("b52").Offset(op, 1).Value = Cells(tempval.Column, 1).Value 
Range("b52").Offset(op, 2).Value = tempval.Value 
op = op + 1 

End If 

Next 
Range("b50").Select 

Je cherche toujours une approche sans VBA.

1

Il n'y a pas de fonction intégrée qui fera ce que vous voulez, j'en suis sûr à 99%.

Une fonction VBA qui retourne un tableau pourrait être construite, en suivant les lignes de Sub déjà montrées. Créez un Variant pour contenir la sortie, peut-être Redimmed au nombre de résultats maximum possible et Redim Preserve-d au nombre réel à la fin. Renvoyez-le ensuite en tant que résultat de la fonction qui doit ensuite être appelée en tant que fonction de tableau (Control-Shift-Enter). Un inconvénient est que vous devez vous assurer que la plage cible est suffisamment grande pour contenir le résultat entier: Excel ne le fera pas automatiquement.

0

J'ai une solution qui n'utilise pas VBA, mais c'est assez compliqué. Cela implique de créer un autre tableau unidimensionnel dans Excel et d'effectuer des recherches à ce sujet. Pour une table de données 100x100, la nouvelle table nécessiterait 10 000 lignes.

Excuses si cela ne correspond pas à vos besoins.

Un résumé est ci-dessous - laissez-moi savoir si vous avez besoin de plus de détails. N = la dimension des données, par ex. 100 dans votre exemple.

Commencez par créer une nouvelle table avec cinq colonnes et des lignes NxN. Dans chaque cas, remplacez mes noms de colonne par la référence Excel appropriée

La première colonne (appelez-la INDEX) indique simplement 1, 2 ... NxN.

La deuxième colonne (DATAROW) contient une formule pour boucler 1, 2 ... N, 1, 2 ... N ... Cela peut être fait en utilisant quelque chose comme = MOD (INDEX-1, N) +1

La troisième colonne (DATACOL) contient 1, 1, 1 ... 2, 2, 2 ... (N fois chacun). Cela peut être fait avec = INT ((INDEX-1)/N) 1

La quatrième colonne (valeur) contient la valeur de votre table de données, en utilisant quelque chose comme: = OFFSET ($ A $ 1, datarow , DATACOL), en supposant que votre table de données commence à $ A $ 1

Nous avons maintenant un tableau à une dimension contenant toutes vos données.

La cinquième colonne (LOOKUP) contient la formule: = MATCH (cible, OFFSET (ValueRange, [lookup-1], 0), 0) + [lookup-1]

où [lookup-1 ] se réfère à la cellule immédiatement au-dessus (par exemple dans la cellule F4 cela se réfère à F3). Vous aurez besoin d'un 0 au-dessus de la première cellule dans la colonne LOOKUP.

VALUERANGE doit être une référence fixe (nommée ou utilisant $ signs) à toute la colonne VALUE.

La colonne LOOKUP contient alors les numéros INDEX qui peuvent être utilisés pour rechercher DATAROW et DATACOL pour trouver la position de la correspondance dans les données.

Cela fonctionne en recherchant des correspondances dans VALUERANGE, puis en recherchant des correspondances dans une plage ajustée commençant après la correspondance précédente.

Il est beaucoup plus facile dans une feuille de calcul puis par l'explication ci-dessus, mais c'est le meilleur que je peux faire pour le moment ...