поиск данных в Excel - PullRequest
       55

поиск данных в Excel

1 голос
/ 21 октября 2008

У меня есть две переменные таблицы данных 100x100 в Excel.

Мне нужна функция, которая возвращает все возможные наборы переменных, которые дают заданное целевое значение. То, на что я смотрю, это какая-то рекурсивная 2-мерная функция поиска. Может ли кто-нибудь указать мне правильное направление?

Ответы [ 5 ]

1 голос
/ 21 октября 2008

Это может быть сделано без VBA, довольно компактно, вот так.

Предположим, что ваша таблица 100x100 находится в B2: CW101, и мы помещаем список чисел от 1 до 100 влево от A2 до A101 и снова от 1 до 100 сверху от B1 до CW1

Создайте столбец ячеек внизу, начиная, скажем, с 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))

Это формула «массива», поэтому нажмите Ctrl-Shift-Enter вместо Enter, и вокруг формулы должны появиться фигурные скобки {}.

Затем скопируйте столько строк, сколько вам нужно. Вам также нужно поставить большое число над вашей первой формулой, то есть в B103, например, 999999.

Формула выполняет вычисление Rowx100 + Column, но только для каждой успешной ячейки, и функция MAX находит самый большой результат, исключая все предыдущие найденные результаты, т.е. она находит целевые результаты по одному, начиная с нижней вправо и работает вверху слева. (С небольшим усилием вы могли бы заставить его искать другой путь).

Это даст вам результаты, например 9922, то есть строка 99, столбец 22, и вы можете легко извлечь эти значения из числа.

Надеюсь, это имеет смысл.

1 голос
/ 21 октября 2008

Нет встроенной функции, которая будет делать то, что вы хотите, я в этом уверен на 99%.

Можно построить функцию VBA, которая возвращает массив, в соответствии с уже показанным быстрым и грязным Sub. Создайте вариант для хранения выходных данных, возможно Redimmed до максимально возможного количества результатов и Redim Preserve-d до фактического числа в конце. Затем верните это как результат функции, которую затем необходимо вызвать как функцию массива (Control-Shift-Enter).

Один минус в том, что вам нужно убедиться, что целевой диапазон был достаточно большим, чтобы вместить весь результат: Excel не сделает этого автоматически.

0 голосов
/ 21 октября 2008

У меня есть решение, которое не использует VBA, но оно довольно грязное. Это включает в себя создание еще одной одномерной таблицы в Excel и поиск по ней. Для таблицы данных 100x100 новой таблице потребуется 10000 строк.

Извинения, если это не соответствует вашим потребностям.

Резюме ниже - дайте мне знать, если вам нужно больше подробностей. N = размерность данных, например 100 в вашем примере.

Сначала создайте новую таблицу с пятью столбцами и NxN строками. В каждом случае заменяйте имена моих столбцов соответствующими ссылками на Excel

В первом столбце (назовите его INDEX) просто перечислены 1, 2 ... NxN.

Второй столбец (DATAROW) содержит формулу для циклического перебора 1, 2 ... N, 1, 2 ... N ... Это можно сделать, используя что-то вроде = MOD (INDEX-1, N) + 1

Третий столбец (DATACOL) содержит 1, 1, 1 ... 2, 2, 2 ... (N раз каждый). Это можно сделать с помощью = INT ((INDEX-1) / N) + 1

Четвертый столбец (VALUE) содержит значение из вашей таблицы данных, используя что-то вроде: = OFFSET ($ A $ 1, DATAROW, DATACOL), при условии, что ваша таблица данных начинается с $ A $ 1

Теперь у нас есть одномерная таблица, содержащая все ваши данные.

Пятый столбец (LOOKUP) содержит формулу: = МАТЧ (цель, СМЕЩЕНИЕ (ЗНАЧЕНИЕ, [LOOKUP-1], 0), 0) + [LOOKUP-1]

, где [LOOKUP-1] относится к ячейке, расположенной непосредственно выше (например, в ячейке F4 это относится к F3). Вам понадобится 0 над первой ячейкой в ​​столбце LOOKUP.

VALUERANGE должен быть фиксированной (именованной или использующей знаки $) ссылкой на весь столбец VALUE.

В столбце LOOKUP содержатся номера INDEX, которые можно использовать для поиска DATAROW и DATACOL, чтобы найти положение совпадения в данных.

Это работает путем поиска совпадений в VALUERANGE, а затем поиска совпадений в заданном диапазоне, начиная с предыдущего совпадения.

В электронной таблице гораздо проще, чем с помощью объяснения выше, но это лучшее, что я могу сделать на данный момент ...

0 голосов
/ 21 октября 2008

Я много пробовал без использования VBA, но, похоже, без него невозможно. Чтобы решить эту проблему, мне нужно было пройти через весь массив и найти ближайшие значения. Затем эти значения были разыменованы с использованием вызовов и свойств диапазона, и выходные данные были сгенерированы в диапазоне, увеличиваемом при каждом действительном совпадении.

Быстрая и грязная реализация выглядит так:

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

Я все еще ищу подход без VBA.

0 голосов
/ 21 октября 2008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...