2011-12-23 23 views
0

VBAを使用して配列の中央値を計算すると、Excel 2010のクラッシュに問題がある(Windows XPではExcelが応答しません)中央値関数はゼロと評価される。残念ながら、問題は特定のコードセットのコンテキストでしか再現できません(デバッグのために単純化バージョンを書き込もうとすると問題は発生しません)。それにもかかわらず、誰かがこの問題を興味深いと思うのは、次の理由からです。中央値がゼロ(VBA)の場合のクラッシュ(プログラムが応答しない)

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

アレイが非常に小さい(たとえば8)場合でもクラッシュが発生します。

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

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

+0

私はこの問題を複製できません。問題を引き起こすコードを投稿できますか? –

+0

申し訳ありません。 URLのフォーマットが正しくありません。ここで再試行です。 http://www.bgsu.edu/departments/psych/faculty/randers/temp/median%20problem.xlsm – user1113568

+0

@CharlesWilliamsご協力いただきありがとうございます。この問題にはVBAコードがスプレッドシートとやりとりされるため、xlsmファイル全体(http://www.bgsu)をダウンロードできるURLがここにあります。edu/departments/psych/faculty/randers/temp/median%20problem.xlsm(マークダウンの書式設定を使用してコードだけをスタックアウトフローに含める方法を理解しようとします) – user1113568

答えて

0

ありがとうございます。私は今問題を複製することができます。私にはExcel 2010のバグのように見えます。それを絞り込むことが中央値では極めて少数と浮動小数点の問題に関連するバグのようになります。例えば、あなたが呼び出す前に

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

を作るために

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

にアドインによってゼロに問題を回避することができますMEDIAN。
これを許可する場合は、テストファイルを使用してExcelチームにバグとして報告します。

+0

ありがとうございます。はい、コードを送ってバグとして報告してください。また、すべての統計計算が配列ではなくスプレッドシートのセル範囲で行われるように、私のプログラムを再実行することで、すでにバグを回避しています。 – user1113568

0

Excel 2003の場合を除き、Double型またはSingle型の配列を計算する場合のみ、同じ問題が発生しています。つまり、計算の「回答」がゼロの場合、配列の中央値を計算するときにExcelがハングします(応答なし)。

配列のパーセンタイルまたはトリムマン関数を計算する場合も同じです。

範囲に配列を書き込んだり、計算式( "= MEDIAN(myRng)"など)を使用すると、Excelはフリーズしません。 double型またはsingle型の配列を計算する場合のみ。 (Excelは、私が長い使用している場合は気にしていないようです。整数を試していません。)

上で示唆したように、私は回避策を使用しました:

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 

kludgeとして動作するようです。 (しかし、深刻な統計的な作業のためにExcelから移行する必要があることを示しています。最終的にC++を習得する時間、試してみますか?)

関連する問題