- ベストアンサー
エクセルマクロ自動更新
マクロを1分おきに自動実行するには どうすればよいでしょうか? ※webクエリの更新時間と連動できるとなおよいです よろしくお願いします
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 Wendy02です。 たぶん、Web クエリとの連動のイベントの説明しても、違う環境で試されたのでは、おそらく実証できないでしょうから、OnTime メソッドで説明しておきます。 Sub ActionSetting() Dim myTime As Date myTime = Now() For i = 0 To 360 '6時間 '1分ごと Application.OnTime myTime + TimeValue("00:01:00") * i, "Move2RowTo21Row" Next End Sub Private Sub Move2RowTo21Row() Application.ScreenUpdating = False With Rows(21) .Insert Rows(2).Copy Rows(21) End With Application.ScreenUpdating = True End Sub
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >記述的には理解できないのでそのまま貼り付けてみましたが、動作はできませんでした。 #2と#3 は、話が続いているのですが、おそらくは、きちんと読んでいないのでしょうね。 とは言っても、Culculate イベントの実体が何かわからないと、ちょっと厳しいかもしれません。 >webクエリの更新時間と連動できるとなおよいです 連動ということで、私はのCulculateイベントを書いたわけで、Webクエリの更新が起動となるわけで、そのまま見ていても動くわけはありません。 でも、実際のマクロは見せられていないですから、話が続きませんね。私のほうの、OnTime イベントは、#4の専門家さんが書いておられますので、そのままにしておきますね。こちらのコードも見直していただければ、それはそれなりに考えますが。
お礼
お手数おかけしました。 動作させたいマクロ部分は↓のみですが 時間おきにループさせたいので困っています。 Rows("21:21").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown Rows("2:2").Select Selection.Copy Rows("21:21").Select ActiveSheet.Paste Application.CutCopyMode = False
- toshi_ho
- ベストアンサー率42% (71/168)
こんばんは。お待たせしました。 こんな例がありました。 どうでしょうか? Testを実行するとSheet1をアクティブにして、A1:A10に"t.tanaka"を 書き込みます。そして15秒間何もせず、続いてB1:B10に"t.tanaka"を 書き込みます。処理の停止している15秒間は、Excelに対して通常の処理を 行えます。 【マクロ】 Sub Test() Dim i As Integer Sheets("Sheet1").Select For i = 1 To 10 Cells(i,1) = "t.tanaka" Next i Application.OnTime Now + TimeValue("00:00:15"), "WaitTime" End Sub Sub WaitTime() Dim i As Integer For i = 1 To 10 Cells(i,2) = "t.tanaka" Next i End Sub
お礼
ありがとうございます 部分的に理解できます ここの環境にエクセルが入ってないので 明日会社で動作させて見ます また、ご報告させていただきます。
補足
マクロ自体は無限に実行したいのです。 ↓で実行しましたがだめでした。 お手数ですが再度方法についてお願いします。 Sub Test() Rows("21:21").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown Rows("2:2").Select Selection.Copy Rows("21:21").Select ActiveSheet.Paste Application.CutCopyMode = False Do Application.OnTime Now + TimeValue("00:00:05"), "WaitTime" Loop End Sub Sub WaitTime() Rows("21:21").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown Rows("2:2").Select Selection.Copy Rows("21:21").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub
- Wendy02
- ベストアンサー率57% (3570/6232)
追伸: 今、設定して気が付いたことですが、 Worksheet_Calculate() イベントは、Application 全体から影響を受けますから、他のシートを使っているときに、誤動作してしまう可能性があります。その場合、以下のようにしたらどうかと思います。 Dim blnActive As Boolean Private Sub Worksheet_Activate() blnActive = True End Sub Private Sub Worksheet_Change(ByVal Target As Range) blnActive = False End Sub Private Sub Worksheet_Calculate() If blnActive Then '実行 End If End Sub
お礼
ありがとうございました 記述的には理解できないのでそのまま貼り付けて みましたが、動作はできませんでした。 すいません、お手数おかけしました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >マクロを1分おきに自動実行する と >webクエリの更新時間と連動できるとなおよいです とはExcelの場合は、たぶん別ですね。 例えば、Web クエリを更新するには、以下のようになるかと思いますが、Webクエリ側で、バックグラウンドで動かすとか、更新の周期とかは、オフにする必要があると思います。 だから、連動というよりも、QueryTable Refresh に、マクロを取り付けなくてはなりません。そうでないとしたら、以下のように、Caluculate イベントに、マクロを取り付ければよいと思います。 Sub QueryTableRefresh() On Error Resume Next ActiveSheet.QueryTables(1).Refresh End Sub Sub ActionSetting() Dim myTime As Date myTime = Now() For i = 1 To 60 '1時間 Application.OnTime myTime + TimeValue("00:01:00") * i, "QueryTableRefresh" Next End Sub '------------------------------------------------ もしも、Web クエリと連動させるのでしたら、 同じシートで、Web情報に関わらないエリアのセルに、 =Now() と入れて、 Private Sub Worksheet_Calculate() '実行 End Sub とするのがよいのではないでしょうか?
- toshi_ho
- ベストアンサー率42% (71/168)
確かできたはずです。 会社で確認してきます。 少々お待ち下さい。
お礼
ありがとうございます お待ちしてます
お礼
うまくいきました ありがとうございました