2012-01-19 1012 views
16

私は1つのボタンをクリックすることができるコードをいくつか作成しており、そのシートにあるクエリテーブルを更新します。Excel vbaリフレッシュ待機

私の問題は、情報の一部をコピーして新鮮なコードを残していることですが、このコードはリフレッシュが開始され、情報がまだ置き換えられていない直後に実行されています。

リフレッシュが完了するまで待ち時間を作成し、残りのコードを続行できます。

私はインターネット等速度に応じて、長すぎるまたは短すぎる待っているわけではないように私は私がこれをどのように行うことができます

、わずか5秒のためではなく、さわやかな期間を待つことしたくないですか?

編集:

シンプルコード:ここで

ActiveWorkbook.RefreshAll 

全てのリフレッシュが終了するまで、私は遅延や待機中のコードが必要...次に

MsgBox("The Refreshing is Completed!") 

ことで何か方向。しかし、それは実際に終了する前にmsgboxを言うことはできません....ときどきインターネットの速度に応じて、リフレッシュは短くても長くかかるので、私は実際のリフレッシュ時間の変数にしたい。

+2

あなたは非背景リフレッシュを指定するには、 'querytable.refresh false'をを使用していますか? –

+0

これまでのところActiveWorkbook.RefreshAllのみでしたが、リフレッシュが完了したらチェックするループが必要です。それは私がそれを想像したところです – dave123

+1

ActiveWorkbook.querytables.count:ActiveWorkbook.querytables(i).refresh false:next'を個別に '' i = 1のためにリフレッシュすることで、これを行うことができます。 –

答えて

9

Web-Queryの外部データ範囲のプロパティには、「バックグラウンド更新を有効にする」のようなチェックボックスがあり、目的の効果を達成するためにチェックを外す必要があります。

は、このページの一番下を見てください:写真

ため http://www.mrexcel.com/tip103.shtml

編集:

Sub AddWebquery() 
    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "URL;http://de.selfhtml.org/html/tabellen/anzeige/table_tr_th_td.htm", _ 
     Destination:=Range("$A$1")) 
     .Name = "table_tr_th_td" 
     .BackgroundQuery = False 
     .RefreshStyle = xlInsertDeleteCells 
     .WebSelectionType = xlSpecifiedTables 
     .WebFormatting = xlWebFormattingNone 
     .WebTables = "1" 
     .Refresh BackgroundQuery:=False 
    End With 
End Sub 

Sub TestRefreshing() 
    Range("A1").Clear 
    ActiveWorkbook.RefreshAll 
    Debug.Print "Test: " & Range("A1").Value 
End Sub 

クエリを追加するAddWebqueryを実行します。ここでは

が所望の効果を示した二つのマクロですTestRefreshingを実行してエフェクトをテストします。 .BackgroundQuery = FalseTrueという行を間違った結果に変更することができます。

Testpageは10秒睡眠と:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>SO-Test</title> 
    </head> 
    <body> 
     <?php 
     sleep(10); 
     ?> 
     <table border="1"> 
      <thead> 
       <tr><th>1</th></tr> 
      </thead> 
      <tbody> 
       <tr><td>2</td></tr> 
      </tbody> 
     </table> 
    </body> 
</html> 
+0

これはVBAでリフレッシュすることができず、リフレッシュが完了するまで待つ – dave123

+0

はいそうです。ちょうどそれをテストした。プロパティで変更され、その直後にDebug.PrintでRefreshAllが呼び出されました。それは常に望ましい値を返しました。空の値はありません – DKSan

+0

これは、次のコードが実行されるまで待機期間をまだ許していません。 Debug.Printの後にMsgBox( "finished refresh")を追加すると、MsgBoxが表示され、リフレッシュが完了します。 – dave123

6

私は同様の問題を持っていた、と私たちは以下のことで、それを解決してきました。このよう

For i = 1 To ActiveWorkbook.Connections.Count 
    ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False 
    'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery 
Next 

ActiveWorkbook.RefreshAll 

私たちがすることができますよリフレッシュを呼び出す前に、すべての接続backgroundQueryプロパティが確実にfalseであることを確認してください。

-1

スクリプトをvbaで待機させたい場合は、sleepを使用する必要があります。しかし、睡眠はExcel vbaでは動作しないことがあります。その代わりの

http://99students.com/macro-sleep-vba/

[email protected] 2014年8月11日 からのサンプルコード

Sub Setting_Sleep_Without_Sleep_Function() 
MsgBox Now 
Application.Wait DateAdd("s", 10, Now) 
MsgBox Now 
End Sub 
0

がここに簡単です

Application.Wait (Now + TimeValue("0:01:00"))

てみてくださいあなたが完全な制御を可能にするバージョン。 'RefreshAllを使用する代わりに、次のサブルーチンを作成します。 ' Excl VBAからルーチンを呼び出し、実行する場所は 'です。完了するまで何も起こりません。 'もう1つの利点は、ピボットテーブルをリフレッシュしないため、干渉しないため 'です。リフレッシュされたデータに依存するピボットがある場合は、同様のリフレッシュを実行することができます '完成されました。

sub RefreshQueries() 
    dim ws as worksheet 
    dim qt as QueryTable 
    For each ws in thisworkbook.worksheets 
     For each qt in ws.querytables 
      qt.refresh 
     next qt 
    next ws 
end sub 
7

私はPowerPivotモデルで作業していましたが、モデルを保存して閉じる前にデータを更新したかったのです。しかし、リフレッシュが完了する前にモデルを閉じただけで、モデルは開封時に再開しました。私はそれがあまりにもあなたのために働く願ってい

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

:右RefreshAllメソッドの後に次の行を追加し

は、トリックを行いました。

物事をスピードアップするには、イベントを無効にすることを確認してください。

私はExcel 2010を使用していますが、この方法が古いバージョンで利用可能かどうかはわかりません。

+0

これは素晴らしいことです。ありがとう –

+0

あなたはようこそ。私は喜んで助けることができます。 –

0

別の方法として、Workbooks.Openコマンドを使用してURLを別のブックとして読み込む方法があります。

これにより、通話が終了した直後にWebリクエストからのデータに完全にアクセスできます。さらに、Webクエリのようにフリーズするのではなく、ロード中にExcelにプログレスバーが表示されます。

は、この質問に私の答えを参照してください:How can I post-process the data from an Excel web query when the query is complete?

そのアプローチのトレードオフは、あなたがあなた自身を取り戻すのデータを処理して管理する必要がある - Excelはあなたのための特定の宛先に入れません。

私たちはあなたがやっているようなものにかなり似たものを試してみると、このルートになってしまいました。

0
ActiveWorkbook.RefreshAll 
     Do While Application.CalculationState <> xlDone 
      DoEvents 
     Loop 

私はその古い質問を知っていますが、これは私の役に立つものです。 数式が計算されるのを待つためにも機能します。

+0

それは私のために働かなかった –

+0

最初にブックをアクティブにしましたか? (私はその愚かな質問を知っているが、私は単純なことを忘れてしまったのでコードが機能しなかった回数は非現実的である)。 MyWorkbook.Activate Then .RefreshAll – DDuffy

+1

はい、もちろんです。 'Application.CalculateUntilAsyncQueriesDone'は最後に問題を解決しました。 –

1

のチェックを外し、「背景をリフレッシュ有効にする」 データに - >接続 - > [プロパティ

これは、バックグラウンドで更新を無効にして、更新が完了するのを待ちます。

enter image description here

関連する問題