2010-03-02 5 views
0

данных в TheRange {1 "" 1 "" 1 "" 1 "" 2}Excel Match Ошибка в разреженном диапазоне с повторяющимися ключами

= матч (2, TheRange , 1) возвращает 9, как и ожидалось

= Match (1.5, TheRange, 1) возвращает 7, как и ожидалось

= Match (1, TheRange, 1) возвращает 5, который не ожидается

Любой встретить это ? Кто-нибудь получил исправление?

Кроме того, если я использую Worksheet.Function.Match в VBA, я получаю более неожиданные результаты.

+0

BTW все работает нормально, если мы поставляем разреженный массив с не дублирующимися ключами, например. {1 "" 2 "" 3 "" 4 "", 5}. Он также работает с различными размерами массивов, например. {1 "" 1 "" 1 "" 1 "" 2 "", 2}. – DangerMouse

+0

Это правда, что двоичный поиск на несортированных данных иногда по-прежнему получает правильный ответ, но это зависит от того, что именно выполняется поиск и что ищут. Например. MATCH (1, {1,42,3}, 1) «работает», но MATCH (1, {1, -42,3}, 1) этого не делает. – jtolle

ответ

3

Если вы укажете 1 для аргумента match_type (третий аргумент для MATCH), то Excel ожидает, что массив будет отсортирован. По-видимому, Excel выполняет двоичный поиск значения - начиная с середины и находя среднее значение (которое является 5-м значением в вашем случае) при поиске 1.

Если вы укажете 0 для «match_type», вы будете получить то, что вы ожидаете - по крайней мере для этого случая. Дополнительную информацию см. В документации для функции MATCH.

+0

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

+1

Но Excel не дает вам никаких гарантий относительно того, что он будет делать, когда массив не отсортирован, и вы скажете Excel, что массив * is * sorted ... – jtolle

+0

Массив отсортирован, но разрежен. Многие функции Excel отлично работают с редким массивом, например. Сумма, StDev и т. Д. И совпадение обычно не находятся в некоторых очень специфических наборах (см. Выше) упорядоченных разреженных данных. Похоже, мне непоследовательное поведение, что нет другого решения, кроме как написать мою собственную реализацию. – DangerMouse

0

Один из способов решения этой проблемы - превратить пробелы в ошибки.

Попробуйте эти формулы:

=MATCH(1/(2),1/$A$1:$A$9,-1) 
=MATCH(1/(1.5),1/$A$1:$A$9,-1) 
=MATCH(1/(1),1/$A$1:$A$9,-1) 

Это массив формул поэтому при вводе их в вас должны подтвердить их с «Ctrl + Shift + Enter», а не просто «войти».