• ベストアンサー

エクセルマクロ自動更新

マクロを1分おきに自動実行するには どうすればよいでしょうか? ※webクエリの更新時間と連動できるとなおよいです よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

fsoyu
質問者

お礼

うまくいきました ありがとうございました

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 >記述的には理解できないのでそのまま貼り付けてみましたが、動作はできませんでした。 #2と#3 は、話が続いているのですが、おそらくは、きちんと読んでいないのでしょうね。 とは言っても、Culculate イベントの実体が何かわからないと、ちょっと厳しいかもしれません。 >webクエリの更新時間と連動できるとなおよいです 連動ということで、私はのCulculateイベントを書いたわけで、Webクエリの更新が起動となるわけで、そのまま見ていても動くわけはありません。 でも、実際のマクロは見せられていないですから、話が続きませんね。私のほうの、OnTime イベントは、#4の専門家さんが書いておられますので、そのままにしておきますね。こちらのコードも見直していただければ、それはそれなりに考えますが。

fsoyu
質問者

お礼

お手数おかけしました。 動作させたいマクロ部分は↓のみですが 時間おきにループさせたいので困っています。 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)
回答No.4

こんばんは。お待たせしました。 こんな例がありました。 どうでしょうか?  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

fsoyu
質問者

お礼

ありがとうございます 部分的に理解できます ここの環境にエクセルが入ってないので 明日会社で動作させて見ます また、ご報告させていただきます。

fsoyu
質問者

補足

マクロ自体は無限に実行したいのです。 ↓で実行しましたがだめでした。 お手数ですが再度方法についてお願いします。 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)
回答No.3

追伸: 今、設定して気が付いたことですが、 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

fsoyu
質問者

お礼

ありがとうございました 記述的には理解できないのでそのまま貼り付けて みましたが、動作はできませんでした。 すいません、お手数おかけしました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >マクロを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)
回答No.1

確かできたはずです。 会社で確認してきます。 少々お待ち下さい。

fsoyu
質問者

お礼

ありがとうございます お待ちしてます

関連するQ&A

専門家に質問してみよう