« Copy、Pasteメソッドを使わないコピペ | トップページ | 素数を調べる »

2010年12月 4日 (土)

Webクエリを秒単位で更新する

Webクエリを自動で更新するには
[外部データ範囲のプロパティ]-[更新の周期]に
チェックをいれて有効にしてから
60分から1分の間で更新の周期を指定します。
Vba20101204a
Vba20101204b

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

このようになります。
Vba20101204c_2

実用的には
インターネットが接続されていなくて
Webクエリが更新できない場合の対応など必要です。

|

« Copy、Pasteメソッドを使わないコピペ | トップページ | 素数を調べる »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Webクエリを秒単位で更新する:

« Copy、Pasteメソッドを使わないコピペ | トップページ | 素数を調べる »