У меня есть решение, которое не использует 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, а затем поиска совпадений в заданном диапазоне, начиная с предыдущего совпадения.
В электронной таблице гораздо проще, чем с помощью объяснения выше, но это лучшее, что я могу сделать на данный момент ...