2

私は現在、外部プログラムの助けを借りていくつかの計算を実行するためにフォームを使用するマクロを持っています。別のプログラム、外部.exeが入力として使用するために、いくつかのワークシート値をファイルに書き込むだけです(そのプログラムはクローズドソースです)。次に、このプログラムはカスタム形式の出力を書き込みます。VBAでそれをスクラップしてから、ワークシートに戻り値を返します。マクロは、送信元と宛先の範囲が指定されているユーザーフォームを介して呼び出されます。

私がやろうとしているのは、ユーザーフォームを介して計算を呼び出す方法をUDFに置き換えることです。GUI方式では、計算の更新は面倒です。また、宛先範囲データでどのような計算が実行されたかを知ることもできません。このパスは、パフォーマンス上の懸念からUDFよりも選択されました。計算が非常に遅いため、外部プログラムをUDFとして呼び出すユーザーフォームコードの一部を再利用して、それを実行することはできません。速度が遅すぎるためです。VBAには非同期実行がないようです(Excel 2010のxllとは対照的です)。

考えられる解決策は、グローバルがtrueに設定されていない限り、実行を開始するとすぐにUDFを終了することです。特定のリボンボタンから再計算が呼び出されない限り、そのグローバルは常にfalseになります。問題は、これが常にUDFを実行し、それらの範囲を常に#N / A値に送信するため、これらの範囲を参照できないことです。もう1つは、偽の数式、つまり、パラメーターと宛先範囲の両方を指定するセルへのコメントを作成することです。これにも多くの問題があります。

それで。偽の非同期計算UDFを実装する方法について何かアイデアはありますか?

ありがとう!

4

1 に答える 1

2

私が正しく理解している場合は、グローバルがfalseの場合に前の計算からの値を返すVBA UDFが必要です。それ以外の場合は、完全に遅い計算を実行します。
これにはいくつかの異なるアプローチがありますが、すべて異なる欠点があります。

  • を使用しますapplication.caller.value。これにより循環参照が発生し、反復計算をオンにする必要があります
  • を使用します application.caller.text。これは単純で、反復計算なしで機能しますが、フォーマットされた値を取得するため、UDFの精度が失われないようにする必要があります。
  • udf exitで、完全な呼び出しセルアドレスによってインデックス付けされたグローバル配列に値を格納し、udfentryで値を取得します。これは、グローバル配列を保存/閉じるときにどこかに保存し、開いたときに取得しない限り、保存されたブックに保持されません。
  • XLL以前の値を取得するまたはXLMマクロと同等のUDFを作成します
于 2012-01-06T09:10:54.420 に答える