У меня есть решение, которое не использует VBA, но оно довольно грязное. Это включает в себя создание еще одной одномерной таблицы в Excel и поиск по ней. Для таблицы данных 100x100 новой таблице потребуется 10 000 строк.
Извините, если это не соответствует вашим потребностям.
Резюме ниже - дайте мне знать, если вам нужно больше деталей. N = размерность данных, например. 100 в вашем примере.
Сначала создайте новую таблицу с пятью столбцами и строками NxN. В каждом случае замените мои имена столбцов соответствующей ссылкой Excel.
В первом столбце (назовем его ИНДЕКС) просто перечислены 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.
Теперь у нас есть одномерная таблица, содержащая все ваши данные.
Пятый столбец (ПРОСМОТР) содержит формулу: =ПОИСКПОЗ(цель, СМЕЩ(ЗНАЧЕНИЕ, [ПРОСМОТР-1], 0),0)+ [ПРОСМОТР-1]
где [ПРОСМОТР-1] относится к ячейке непосредственно выше (например, в ячейке F4 это относится к F3). Вам понадобится 0 над первой ячейкой в столбце ПРОСМОТР.
VALUERANGE должен быть фиксированной (именованной или с использованием знаков $) ссылкой на весь столбец VALUE.
Столбец LOOKUP затем содержит числа INDEX, которые можно использовать для поиска DATAROW и DATACOL, чтобы найти положение совпадения в данных.
Это работает путем поиска совпадений в VALUERANGE, а затем поиска совпадений в скорректированном диапазоне, начиная с предыдущего совпадения.
В электронной таблице это намного проще, чем с помощью объяснения выше, но это лучшее, что я могу сделать на данный момент...
person
Mark Pattison
schedule
21.10.2008