2017-09-05 4 views
0

遅延アクティビティ - VBA蒸気チャートからいくつかのデータをつかむために、次のクエリを実行し

//Run analysis 

私はあるに実行している問題のようなあとがき

With ActiveSheet.QueryTables.Add(Connection:= _ 
    "URL;http://steamcharts.com/app/" & games(x), Destination:=Range("A" & lastRowData)) 
    .Name = " & games(x) & " 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .WebSelectionType = xlAllTables 
    .WebFormatting = xlWebFormattingNone 
    .WebPreFormattedTextToColumns = True 
    .WebConsecutiveDelimitersAsOne = True 
    .WebSingleBlockTextImport = False 
    .WebDisableDateRecognition = False 
    .WebDisableRedirections = False 
    .Refresh BackgroundQuery:=True 
End With 

その後、私が持っている他のアクションスクリプトが正しく実行されている間は、「分析」部分は実行されますが、クエリがロードされている間に5秒かかることがあり、前のデータが前にロードされるのを待つのではなく、ワーキング。すべてのデータがスプレッドシートに読み込まれるまで、後続のスクリプトコマンドの実行を遅らせる方法はありますか?

+0

このリンクを参照してください。https://stackoverflow.com/questions/1544526/how-to-pause-for-specific-amount-of-time-excel-vba – PKatona

+0

@PKatonaこのソリューションで問題が発生しているのは、設定された時間を指定しています。私は本当にクエリがまだ実行されていることを確認し、スクリプトを続行するためにデータが移入されるまで必要な時間待つことを確認する方法があるかどうかを尋ねています。 –

答えて

1

正しく推測したように、後続のコマンドの実行を遅らせる方法は、.Refresh BackgroundQuery:=Falseに設定することです。これがどういう意味なのか理解すれば、これは実際には明らかです。内蔵されたExcelのヘルプ

真とすぐにデータベース接続が行われ、照会が実行されたような手順に制御を返すから

。 QueryTableはバックグラウンドで更新されます。すべてのデータがワークシートにフェッチされた後にのみ、プロシージャに制御を戻す場合はFalseを戻します。

おそらく、非同期的および同期的に用語をよく理解しているでしょう。 Falseは、クエリを同期的に実行することを意味します。

同じ結果を達成するための他の方法は、それが偽になるまで.Refreshingプロパティバックグラウンド(非同期)に、次のコードの世論調査では、クエリを実行することです。これにより、カスタムプログレスバーの表示など、他の操作を行うことができます。

フックできるAfterRefreshイベントもあります。

0

End Withの直後にDoEventsを使用してみてください。

+0

動作しません。 'DoEvents'は他の*バックグラウンドプロセスが実行時間を得ることを許可します。これはバックグラウンドで実行されるVBAメソッドとは関係ありません。 – robinCTS

1

興味深いことに、この問題では、答えはかなり簡単でした。明確にするため、私はDoEventsApplication.Wait Now + #12:00:12 AM#のようなものを使用しました(クエリを実行して読み込むのに十分な時間以上待っています)。しかし、これらの両方の方法を使用しても、何らかの理由で、すべてのクエリが実行された後にデータがスプレッドシートにのみ読み込まれるように見えました。

実験では、最後の行を野生の推測である.Refresh BackgroundQuery:=Trueから.Refresh BackgroundQuery:=Falseに変更しましたが、機能しました。

関連する問題