0

VBA を使用して配列の中央値を計算すると、中央値関数がゼロに評価される場合に、Excel 2010 がクラッシュする (Windows XP は Excel が「応答していません」と言う) という問題があります。残念ながら、問題は特定のコード セットのコンテキストでのみ再現可能です (デバッグ用に簡略化されたバージョンを作成しようとすると、問題は発生しません)。とはいえ、次の理由からこの問題を興味深いと感じる人もいると思います。

application.worksheetfunction.median が呼び出されている間にクラッシュが発生します。VBA はその呼び出しを通過できません。その後ゼロでダイビングする問題ではありません。

配列が非常に小さい場合でもクラッシュが発生します (例: 8)。

効果的な回避策は、各配列項目に小さな定数を追加し、中央値を計算してから、すぐに各配列値から定数を減算することです。これにより、正しい答えが得られるようです。しかし、Excel がこの回避策を必要とするのではないかと心配しています。

この問題は、並べ替えを伴う別のワークシート関数、パーセンタイル関数でも発生します。

4

2 に答える 2

0

ありがとうございました。問題を再現できるようになりました。私には Excel 2010 のバグのように見えます。絞り込むと、中央値の非常に小さい数値の浮動小数点問題に関連するバグのように見えます。たとえば、ゼロを追加することで問題を回避できます

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

作る

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

MEDIANに電話する前に。
許可していただける場合は、テスト ファイルを使用して、これをバグとして Excel チームに報告します。

于 2011-12-26T18:37:36.383 に答える
0

同様の条件下で同じ問題が発生しています-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++ を学習する時が来たと思います。または、試してみてください。)

于 2012-01-17T20:15:25.883 に答える