いくつかのドロップダウン メニュー/ユーザー アクションに応じて、いくつかのデータ フィードがパラメーターを SQL クエリに戻すワークブックがあります。これにより、ワークブックのトリムが維持され、計算が改善されます。アイテム レベルの詳細をすべてワークブックにローカルに保持することは実際的ではありません。
VBA の一部の要素は、これらのパラメーター化されたクエリから得られるデータの評価に依存しています。ここで問題が発生します。VBA は、マクロ内のすべてを評価する前に、パラメータがクエリに返されるのを待ちません。
フィードが更新されるまで VBA の実行をプログラムで「一時停止」するためのベスト プラクティスについて、何か考えやアドバイスがあるかどうか知りたいです。私の現在の回避策は、VBA を 2 つの部分にチャンクし、変更されたデータに依存するものを別の関数にスローし、application.ontime を使用して X 秒間一時停止することです。
Application.OnTime Now + TimeSerial(0, 0, 10), "Restart"
これは 90% の解決策ですが、理想的とは言えません。時間の長さは任意です。非常に遅い接続では長さが不十分であり、高速な接続では不必要に遅くなります。
理想的には、Excel の準備が整うまで待ってから続行する何らかの方法があるでしょう。MS Internet Controls ライブラリを使用する場合と同様に、使用できます
Do Until .document.ReadyState = "complete"
IE が準備完了状態を返すまで実行を一時停止します。よりエレガントなソリューションのための戦略はありますか?
編集:以下の jon ごとに、コードを追加し、SQL クエリがどのように機能するかを説明します。
select sts1.studentid, sts1.alphascore as testcycle,
sts2.numscore as lexile, sts3.alphascore as gleq, sts4.numscore as nce
from ps.studenttestscore sts1
join ps.students stu on (sts1.studentid = stu.id)
join ps.studenttestscore sts2 on (sts1.studenttestid = sts2.studenttestid)
join ps.studenttestscore sts3 on (sts1.studenttestid = sts3.studenttestid)
join ps.studenttestscore sts4 on (sts1.studenttestid = sts4.studenttestid)
where (stu.id = ? ) and (sts1.testscoreid = 578) and (sts2.testscoreid = 575)
and (sts3.testscoreid = 577) and (sts4.testscoreid = 576)
? 関連する学生 ID を渡すパラメーターです。MS クエリは、そのパラメーターのセル値を使用します。表示されるセルには、選択された学生に基づいたルックアップがあります。
=IFERROR(INDEX(Stu!$B:$F,MATCH(Student!B2,Stu!$F:$F,0),1),999999)
(iferror は、何らかの理由で不適切な値が選択された場合に厄介なダイアログ ボックスがポップアップするのを防ぐために、任意の数値を渡すだけです)。