2

ワークシートで100,000回以上使用されるUDFがあるとします。関数内で、バッチ内でさらに何回呼び出されるかを知る方法はありますか?基本的に私がやりたいのは、すべての関数に実行する作業のToDoリストを作成させることです。私は次のようなことをしたい:

IF remaining functions to be executed after this one = 0 then ...

これを行う方法はありますか?

バックグラウンド:

パラメータ(日付、時間、ノード、タイプ)を指定するだけでユーザーがSQLクエリを実行するUDFを作成したいと思います。関数が実行されるたびにSQLクエリを実際に実行する場合は、これを行うのは非常に簡単です。私がこれをしたので、それが途方もなく遅いので、私はそれが簡単であることを知っています。私の新しいアイデアは、関数が探しているデータがグローバルキャッシュ変数に存在するかどうか、そしてそれをグローバル変数「job-list」に追加しないかどうかを最初に確認することです。

私がやりたいのは、最後の関数が呼び出されてジョブリストを調べ、実行するSQLクエリの数が最も少なく、グローバルキャッシュ変数を埋めるときです。キャッシュ変数がいっぱいになると、テーブルの更新を実行して、他のすべての関数が再度呼び出されるようにします。これは、後続の呼び出しで、必要なデータがキャッシュ内にあるためです。

4

2 に答える 2

2

まず、
VBA UDFのパフォーマンスは、UDFのコーディング方法に非常に敏感です。効率的なVBAUDFの作成に関する一連の投稿を参照してください。

http://fastexcel.wordpress.com/2011/06/13/writing-efficient-vba-udfs-part-3-avoiding-the-vbe-refresh-bug/

http://fastexcel.wordpress.com/2011/05/25/writing-efficient-vba-udfs-part-1/

複数の結果を返すには、配列UDFの使用も検討する必要があります。http :
//fastexcel.wordpress.com/2011/06/20/writing-efiicient-vba-udfs-part5-udf-array-formulas-go-faster/


このシリーズの12番目の投稿では、AfterCalculateイベントとキャッシュの使用について概説しています http://fastexcel.wordpress.com/2012/12/05/writing-efficient-udfs-part-12-getting-used-range-fast-using -application-events-and-a-cache /
基本的に必要なアプローチは、UDFがキャッシュをチェックし、最新でないか利用できない場合は、キューにリクエストを追加することです。
次に、計算後のイベントを使用してキューを処理し、必要に応じて別の再計算をトリガーします。

于 2013-02-10T17:55:21.983 に答える
0

Excelスプレッドシートから100,000のSQLクエリを実行することは、不十分な設計のようです。これらの上にキャッシュメカニズムを作成すると、問題が複雑になり、おそらく必要以上に複雑になります。これが適切な場合もありますが、代わりに他の設計アプローチを検討します。

最も明白なのは、Excelスプレッドシートからデータを取得し、それをデータベースのテーブルにロードすることです。次に、データベースを使用して、すべての行の処理を1回として実行します。最後のステップは、結果をExcelに読み戻すことです。

Excelからデータベースに多数の行を取得する最良の方法は、Excelファイルをcsvとして保存し、それらを一括挿入することです。

このアプローチは、問題に対して機能しない場合があります。ただし、一般的に、データベースで実行されているセットベースのアプローチの方がはるかに優れたパフォーマンスを発揮します。

cach'ingメカニズムに関しては、そのルートを下る必要がある場合。次の擬似コードを持つ関数を想像できます。

Check if input values are in cache.
If so, read values from cache.
Else do complex processing.
Load values in cache.

このロジックは関数に含まれる可能性があります。ただし、@ Bulatが示唆しているように、関数の周囲にキャッシュレイヤーを追加する方がおそらく良いでしょう。

于 2013-02-10T17:32:52.910 に答える