Webクエリを自動で更新するには
[外部データ範囲のプロパティ]-[更新の周期]に
チェックをいれて有効にしてから
60分から1分の間で更新の周期を指定します。
1分未満で更新するには
VBAを使用します。
まずはWebクエリを作成します。
例として下のコードで作成するWebクエリを使用します。
下のコードは手動でWebクエリを作成したときに
マクロ自動記録したものです。
テキトーに
47ニュースのWebページの株価の部分を取り込みます。
この株価の更新間隔は1分以上だと思うので
この株価を秒単位を取り込む意味はないです。
Webクエリを作成するコード:Sub macro101204a() 'Webクエリ作成
Sheets.Add.Name = "macro101204" With Sheets("macro101204").QueryTables.Add (Connection:="URL;http://www.47news.jp/", _ Destination:=Range("A1")) .Name = "クエリ1" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "2" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .Refresh BackgroundQuery:=False End With End Sub |
このWebクエリをVBAで更新するには
次のようにします。
Webクエリを更新するコード:Sub macro101204b() 'Webクエリを更新する
Sheets("macro101204").QueryTables("クエリ1").Refresh End Sub |
上のプロシージャを秒単位で実行すれば
Webクエリの秒単位の更新ができます。
これにはOnTimeメソッドを使います。
下のプロシージャでは10秒間隔で更新するように
OnTimeメソッドでmacro101204cを実行する時間を
Now + TimeValue("00:00:10")
で指定して、
現在 + 10秒に実行、つまり
10秒後に実行するようにしています。
TimeValue関数の引数を変更すれば
その他の間隔で更新できます。
もちろん、分単位でも時間単位でも指定できます。
実際は、Webクエリの更新は
簡単なデータでも時間が掛かるので
1秒単位での更新などは無理があると思います。
コードはこちら
Webクエリを秒単位で更新するコード:Sub macro101204c() 'Webクエリを更新する '秒単位で更新する
Debug.Print Now & " クエリ1を更新します。" Sheets("macro101204").QueryTables("クエリ1").Refresh Application.OnTime _ Now() + TimeValue("00:00:10"), "macro101204c" End Sub |
Webクエリを更新したら
そのデータを違うシートにコピペして
時系列データにしたりなど
更新するたびに実行したい処理があります。
そんな場合は
RefreshメソッドとOnTimeメソッドの間で
更新するたびに実行したい処理をいれます。
Refreshメソッドを
BackgroundQuery:=False にすると
クエリの更新が終わるまで
Refreshメソッドの次のコードは実行されません。
したがって
更新する前のデータをコピペすることがなくなります。
コードはこちら
Webクエリを更新し処理するコード:Sub macro101204d() 'Webクエリを更新する '秒単位で更新する
Debug.Print Now & " クエリ1を更新します。" Sheets("macro101204").QueryTables("クエリ1").Refresh
BackgroundQuery:=False '更新のたびに実行したい処理 With Sheets("macro101204") .Rows(10).Insert .Cells(10, 1) = Now .Cells(10, 1).NumberFormatLocal = "hh:mm:ss" .Cells(10, 2) = Cells(1, 2) .Cells(10, 3) = Cells(2, 2) .Cells(10, 4) = Cells(4, 2) .Cells(10, 5) = Cells(5, 2) .Cells(10, 6) = Cells(6, 2) End With Application.OnTime _ Now() + TimeValue("00:00:10"), "macro101204d"
End Sub |
このようになります。
実用的には
インターネットが接続されていなくて
Webクエリが更新できない場合の対応など必要です。
コメント