Сбой (программа не отвечает), когда медиана оценивается как ноль (VBA) - PullRequest
0 голосов
/ 23 декабря 2011

У меня проблема со сбоем Excel 2010 (Windows XP говорит, что Excel «не отвечает»), когда я использую VBA для вычисления медианы массива, в случаях, когда медианная функция оценивается как ноль.К сожалению, проблема воспроизводима только в контексте определенного набора кода (когда я пытаюсь написать упрощенную версию, для отладки проблема не возникает).Тем не менее, я думаю, что кто-то может найти эту проблему интересной по следующим причинам:

Сбой происходит во время вызова application.worksheetfunction.median.VBA не может пройти этот вызов.Это не проблема последующего погружения на ноль.

Сбой происходит, даже если массив очень мал (например, 8).

Я обнаружил, что эффективный обходной путь для меня - добавить небольшую константу к каждому элементу массива, затемвычислите медиану, затем немедленно вычтите постоянную из каждого значения массива.Похоже, это дает правильный ответ.Но меня беспокоит, что Excel требует этого обходного пути.

Проблема также возникает с другой функцией рабочего листа, которая включает сортировку: функцию процентиля.

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Я получаю ту же проблему в аналогичных условиях - за исключением Excel 2003 и только при вычислении массива типа Double или Single.То есть Excel просто зависает (без ответа) при вычислении медианы массива, когда «ответ» на вычисление равен нулю.

То же самое при вычислении функций массива в процентилях или тримме.

Если я записываю массив в диапазон, а затем для вычисления использую формулу ("= MEDIAN (myRng)" и т. Д.), Excel не останавливается.Только при расчете массива типа Double или Single.(Excel, похоже, не возражает, если я использую Long; я не пробовал Integer.)

Я использовал обходной путь, как предложено выше:

For i = 1 To UBound(myArr)
    ratioArr(i) = ratioArr(i) + 0#
Next i

{мои вычисления здесьзатем:}

For i = 1 To UBound(myArr)
    ratioArr(i) = ratioArr(i) - 0#
Next i

Кажется, работает, как кладжа.(Но это показывает, что мне нужно перейти с Excel на любую серьезную статистическую работу. Пожалуй, пришло время, наконец, изучать C ++ или плакать.)

0 голосов
/ 26 декабря 2011

Спасибо. Теперь я могу продублировать проблему. Похоже, ошибка в Excel 2010 для меня. Сужая его, это похоже на ошибку, связанную с проблемами с плавающей запятой с чрезвычайно маленькими числами в медиане: например, вы можете обойти проблему, добавив ноль к

tempCrossZ(i) = tempA(i) * tempB(i)

сделать

tempCrossZ(i) = tempA(i) * tempB(i) + 0#

перед вызовом МЕДИАНА.
Если вы позволите, я сообщу об этом как об ошибке команде Excel, используя ваш тестовый файл.

...