時計による一定時間ごとに起動させる方法

このQ&Aのポイント
  • 質問者はマクロを使って時計によって一定時間ごとに起動させたいと考えています。具体的には、00分と30分ごとにマクロを起動させる方法を知りたいとのことです。
  • このマクロでは、指定したセル範囲の値を最終行の下に追加し、31行目以降では最初のセル範囲を削除する処理を行っています。
  • 具体的な方法としては、ApplicationオブジェクトのOntimeメソッドを使用し、指定した時間間隔ごとにマクロを自動的に実行することが可能です。
回答を見る
  • ベストアンサー

時計による一定時間ごとに起動させるには

素人です。誰か教えてください。 sub Macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then ’31行に到達してから1行目を削除する   range("E1:H1").delete shift:=xlshiftup  end if  application.ontime now + timeserial(0, 30, 0), "Macro1" end sub というマクロなのですが これを時計により00分と30分(例えば10時、10時半、11時、11時半、、、) というふうに起動させるにはどうしたらいいでしょうか?

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

変更前: application.ontime now + timeserial(0, 30, 0), "Macro1" 変更後: application.ontime application.floor(now, timeserial(0, 30, 0)) + timeserial(0, 30, 0), "Macro1"

perrault
質問者

お礼

いつもありがとうございます! もう頭があがりません!

その他の回答 (1)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

マクロはさっぱりなんで、考え方だけ、 まず、時刻が00、30分だったら○○する・・・と書いてはいけません。 時刻が00、30分で実行したあと、次の00、30分を待った時、まだ1分にはなりません。 ので、また処理が走ってしまいます。 ので、 (最初のみ)フラグをオフにする(例えばa=0、どこかのセルに記憶する) そしてループして  時刻が00、30分だったらフラグを立てる(a=1)、で実行する。  時刻が01、31分になったらフラグをオフにする(a=0)。

perrault
質問者

お礼

確かにおっしゃる通りめちゃめちゃ荒ぶってます! まともに動かなくなってしましました! 参考になります!

関連するQ&A

  • 2つのマクロをうまく動かすにはどうしたら?

    以下の2つのマクロを同時に動かそうとしています マクロ2はマクロ1で出した数字から始めの値段と終わりの値段と高安4つをエクセル関数で抽出して 出した4つの数字を24個蓄積することをめざしてます。 それぞれは1つで起動させるとうまく動くのですが 同時に動かすとマクロ1は4つずつ記録を始めたりと思い通りに動きません。 これを解決するにはどうしたらいいでしょうか? Sub Macro1() Range("E65536").End(xlUp).Offset(1).Resize(1, 4).Value = Range("A2:D2").Value If Range("E65536").End(xlUp).Row > 30 Then '31行に到達してから1行目を削除する Range("E1:H30").Delete shift:=xlShiftUp End If Application.OnTime Application.Floor(Now, TimeSerial(0, 1, 0)) + TimeSerial(0, 1, 0), "Macro1" End Sub Sub Macro2() Range("I65536").End(xlUp).Offset(1).Resize(1, 4).Value = Range("A5:D5").Value If Range("I65536").End(xlUp).Row > 24 Then '25行に到達してから1行目を削除する Range("I1:L1").Delete shift:=xlShiftUp End If Application.OnTime Application.Floor(Now, TimeSerial(0, 30, 0)) + TimeSerial(0, 30, 0), "Macro2" End Sub 追加としてマクロ1は30分もしくは00分(9時00分、9時30分、10時11時も同様)に記録を始めて 9時1分や31分には一旦削除最初から記録を蓄積するということを目指してます。 つまり10時10分からマクロを動かすと10時31分になると一旦削除して最初から始めるとうものです。 こちらも可能ならお願いします!

  • VBAの答えを求めています

    素人です。誰か教えてください。 下記マクロのend ifより下の部分で時計単位で30分と00分に起動させるように したいのですが起動させるとマクロが常時計算を続けてしまいパンクしてしまします。 sub Macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then ’31行に到達してから1行目を削除する   range("E1:H1").delete shift:=xlshiftup  end if  application.ontime application.floor(now, timeserial(0, 30, 0)) + timeserial(0, 30, 0), end sub どうしたら解消できるでしょうか!?

  • 誰か助けてください!マクロが無効にされます、、

    先日エクセル2013で sub Macro1()  range("E65536").end(xlup).offset(1).resize(1, 4).value = range("A1:D1").value  if range("E65536").end(xlup).row > 30 then ’31行に到達してから1行目を削除する   range("E1:H1").delete shift:=xlshiftup  end if  application.ontime now + timeserial(1, 0, 0), "Macro1" end sub というマクロを作ってもらいました。 しかしいざ動かそうとすると最初のマクロが起動したあと必ず「このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」とでます。 コンテンツを有効化してもマクロのセキュリティをすべてのマクロを有効にしてもだめです。 デジタル署名しようにもアマゾンでネットでエクセルのみ購入したためかselfcert.exeがありません。 全く原因と解決方法が分かりません!誰か助けてください!

  • マクロで分岐をさせる方法

    下記の記録マクロでWith→End With 間にIFで分岐を試みたのですが エラーになります。どうすれば出来るのか伝授をお願いします。 マクロは初心者です。 Dim hensuh(2) As Integer Dim dekiru As Long Dim kinek As Long Dim uineu As Long Dim myTime As Date Dim flg As Boolean Sub OnTimeSamp1() Application.OnTime EarliestTime:=TimeValue("09:00:00"), Procedure:="Ontime_Set" '記録開始 Application.OnTime EarliestTime:=TimeValue("11:00:00"), Procedure:="Ontime_Reset" '記録終了 End Sub Sub Ontime_Set() 'トグルになっている If flg = False Then flg = True myTime = Now + TimeSerial(0, 0, 1) ElseIf flg = True Then flg = False Else Exit Sub End If If Range("A1").Value = "" Then Range("A1").Value = Format(Now, "hh:mm:ss") '時間記録(スタート) End If Application.OnTime EarliestTime:=myTime, _ Procedure:="my_Procedure", Schedule:=flg If flg = False Then myTime = 0 End If End Sub Sub my_Procedure() Worksheets("kirokuyou").Activate 'ワークシートをアクティブにする。(記録中別のワークシートを開けた場合そこに記録されてしまうのを防ぐ) With Range("A65536").End(xlUp).Offset(1) .Value = Format(Now, "yyyy:mm:dd:hh:mm:ss") '時間記録 .Offset(, 1).Value = Range("S3").Value 'S3 の値 .Offset(, 2).Value = Range("T3").Value 'T3 の値 .Offset(, 3).Value = Range("U3").Value 'U3 の値 .Offset(, 4).Value = Range("V3").Value 'V3 の値 dekiru = Range("V3").Value Range("V6").Value = dekiru kinek = Range("T22").Value Range("T18").Value = kinek uineu = Range("U22").Value Range("U18").Value = uineu 'IF S17 >= 120 Then 'hensuh(0) = Range("S17").Value ←変数に代入後、分岐させたいのですがエラーになる 'Elseif S17 >= 110 Then 'hensuh(1) = Range("S17").Value ←変数に代入後、分岐させたいのですがエラーになる 'Elseif S17 >= 100 Then 'hensuh(2) = Range("S17").Value ←変数に代入後、分岐させたいのですがエラーになる 'End If flg = False myTime = 0 End With Call Ontime_Set End Sub Sub Ontime_Reset() 'タイマーリセット On Error Resume Next Application.OnTime EarliestTime:=myTime, _ Procedure:="my_Procedure", Schedule:=False If Err.Number > 0 Then MsgBox "OnTime設定はされていません。", 64 Err.Clear flg = False Else MsgBox myTime & "の設定は解除されました。", 64 flg = False myTime = Empty End If End Sub

  • VBAで処理フラグの立て方

    こういった条件でやりたいのですがうまくいきません・・・ 処理フラグの立て方は間違っていないと思うのですが・・・ ちょっとセルとかは変えてあります。 もしE3の値が4で割り切れたら8行目を削除し次の処理は行わない もしE3の値が4で割り切れなかったらE4の値が4で割り切れるか処理をする。 割り切れたら18行目を削除 E3とE4の値両方が4で割り切れなかったら8行目を削除し1行あがるので17行目を削除したいです Sub rdlt() If Range("I1").Value = 0 Then Range("I1").Value = 1 '処理は一度きり If Range("E3").Value Mod 4 = 0 Then Rows("8:8").delete '4で割れたとき8行目を削除 Range("J1").Value = 1 '4で割れたときは次の処理用にフラグ End If If Range("J1").Value = 0 Then 'E3が4で割れなかったときは処理する If Range("E4").Value Mod 4 <> 0 Then Rows("18:18").delete Range("J1").Value = 1 End If End If End If End Sub

  • アプリケーション定義または、オフジェクトエラー

    office2010 マクロ実行で”アプリケーション定義または、オフジェクトエラー"が発生します いろいろ調べてみたのですが、原因分からず、教えてください。 Sheet1のA1~A8までシート名が記載されています。 このシート名の後ろにdataを付与してシートを追加し、編集用とするマクロです。 Macro13を実行してMacro1のエラー発生という所が黄色くなります。 ' Range("E1:S" & Worksheets(Worksheets("SHEET1").Cells(i, 1).Value).Range("B" & Rows.Count).End(xlUp).Row).Value = "=A1管理!RC[-4]" の場合は、動作します。 なので、 Worksheets(""SHEET1"").Cells(i, 1).value! が悪いと思うのですが、どうしたらよいかが分かりません。 Dim i As Long Sub Macro13() ' Sheets("Sheet1").Select For i = 1 To Range("A1").End(xlDown).Row With Worksheets.Add() .Name = Worksheets("SHEET1").Cells(i, 1) & "data" Call Macro1 End With Next End Sub Sub Macro1() ' 各シートの整列版作成 ' 'データ参照 ' Range("E1:S" & Worksheets(Worksheets("SHEET1").Cells(i, 1).Value).Range("B" & Rows.Count).End(xlUp).Row).Value = "=A1管理!RC[-4]" '動作Ok Range("E1:S" & Worksheets(Worksheets("SHEET1").Cells(i, 1).Value).Range("B" & Rows.Count).End(xlUp).Row).Value = "=Worksheets(""SHEET1"").Cells(i, 1).value!RC[-4]" ’エラー発生 '下記は編集内容 'D列:F列を参照し、先頭6桁の右3文字がドライだったらTD、先頭6桁の右3文字がレンチだったらTL Range("D1:D" & Range("E" & Rows.Count).End(xlUp).Row).Value = "=IF(RIGHT(LEFT(RC[2],6),3)=""ドライ"",""TD"",IF(RIGHT(LEFT(RC[2],6),3)=""レンチ"",""TL"",""""))" '計算用に1行ダミー行挿入 Range("A1").Select Selection.EntireRow.Insert 'C列:E列を参照し、セル結合されているセルを名称、フロント、リアの区分名とする Range("C2:C" & Range("E" & Rows.Count).End(xlUp).Row).Value = "=IF(RC[2] <>0,RC[2],R[-1]C)" 'B列:E列を参照し、先頭1桁がNだったら名称、0だったらB列1つ上の名称 Range("B2:B" & Range("E" & Rows.Count).End(xlUp).Row).Value = "=IF(LEFT(RC[3],1)=""N"",RC[3],R[-1]C)" 'A列:B,C,D列を結合 Range("A2:A" & Range("E" & Rows.Count).End(xlUp).Row).Value = "=IF(RC[1]=RC[2],"""",CONCATENATE(RC[1],RC[2],RC[3]))" End Sub

  • エクセルVBEについて

    VBE初心者です。以下のプログラムを実行すると「testが見つかりません」とエラーが出てしまいます。application.ontimeの使い方がよく分かりません。どこが違うんでしょうか?よろしくお願いします。 Sub test() Range("D10").Value = Second(Time) If Range("D10").Value >= 55 Then Exit Sub End If Application.OnTime Now + TimeValue("00:00:01"), "test" End Sub

  • インデックスが有効範囲に出ないと出る

    下記のようなVBAを書きました。しかしインデックスが有効範囲にないとメッセージがでるのですが、どこがまちがっているでしょうか?? Sub macro1() Dim i As Long Dim r As Long Worksheets("フェアリスト ").Select Worksheets("csv").Range("A:C").ClearContents For i = 2 To 50 Step 5 If Worksheets("フェアリスト").Cells(11, i + 1) <> "" Then r = Worksheets("フェアリスト").Cells(65536, i + 1).End(xlUp).Row Worksheets("フェアリスト").Range(Cells(11, i), Cells(r, i + 3)).Copy _ Destination:=Worksheets("csv").Range("B65536").End(xlUp).Offset(1) Worksheets("csv").Range("A65536").End(xlUp).Offset(1).Resize(r - 3, 1).Value = Worksheets("フェアリスト").Cells(8, i).Value End If Next i Worksheets("csv").Range("A1:C1").Delete shift:=xlShiftUp End Sub

  • E列が空白のとき、その空白行を削除し、番号を振り直す

    windows7 Excel2003でマクロ勉強中です。 あるサイトにE列が空白のとき、その空白行を削除し、番号を振り直すという コードがありました。 自分で作った表(表の最上段の2行は項目名が入っています。)で  実行すると「Rangeメソッドは失敗しました。Globalオブジェクト」と エラーが出ます。エラーはでますが、処理自体は正しく実行されます。 このエラーの原因と回避するにはどうしたらよろしいでしょうか。 Sub E列が空白のとき、その空白行を削除し、番号を振り直す() Dim i As Long, j As Long '行削除の処理 For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 If Range("A" & i).Value <> "" And IsNumeric(Range("A" & i).Value) = True Then If Range("E" & i).Value = "" Then Rows(i).Delete End If End If Next '番号振りなおし処理 '’’Range("A" & Rows.Count).End(xlUp).Offset(1).Select For i = 0 To Range("A" & Rows.Count).End(xlUp).Row If Range("A" & i).Value = "番号" Then j = 1 ・・・・・ここでエラー発生 If Range("A" & i).Value <> "" And IsNumeric(Range("A" & i).Value) = True Then Range("A" & i).Value = j j = j + 1 End If Next ActiveSheet.Protect End Sub

  • セルには何も入ってないのに、数値型になる理由は?

    セルに何も入ってない状態で Sub Macro() If IsNumeric(Range("a1").Value) = True Then MsgBox "A1には数値が入ってます" End If End Sub を実行すると、 "A1には数値が入ってます" が表示されます。 なぜでしょうか? Sub Macro2() MsgBox TypeName(Range("a1").Value) End Sub を実行すると、stringが返ってきます。

専門家に質問してみよう