- ベストアンサー
Excel VBAでスタートとストップを実装する方法
- Excel VBAを使用して、指定した時間間隔でデータを集めるマクロを作成する場合、スタートとストップを簡単に操作できるようにする方法を教えてください。
- 現在、特定の時間にスタートし、一定の時間間隔でデータを集めるマクロを作成していますが、停止する際にエクセルを一度閉じる必要があります。コマンドボタンを使って、スタートとストップを行えるようにする方法を教えてください。
- Excel VBAでデータを一定の時間間隔で集めるマクロを作成していますが、スタートとストップが不便です。エクセルを一度閉じないと停止できないため、コマンドボタンを使って操作できるようにしたいです。スタートとストップを操作する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Application.OnTime を解除するには OnTime メソッドの引数 Schedule に False をセットするってのはヘルプにまんま書いてあります。 ヘルプも読む癖つけませんか? Private myTimer As Date Sub StartProc() ' 今から 10秒後に処理開始 myTimer = Now + TimeValue("00:00:10") Application.OnTime EarliestTime:=myTime, Procedure:="ProcHoge" End Sub Sub StopProc() Application.OnTime EarliestTime:=myTime, Procedure:="ProcHoge", Schedule:=False End Sub Sub ProcHoge() あれやこれやの処理 myTime = myTime + TimeValue("00:01:00") Application.OnTime EarliestTime:=myTime, "ProcHoge" End Sub ボタンでスタート / ストップを指示するとのことですが、ボタンはどこに配置する予定でしょうか。 ワークシート上に配置するなら ActiveX コントロールのボタンではなく、フォームコントロールのボタンを配置し、クリック時に実行するマクロとして、標準モジュールに書いてある上記の StartProc を指定します。 ストップ用のボタンは StopProc を指定します。
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
シートにコマンドボタンを2つ貼り付ける。 >最近勉強し始めたばかりで の人がやる人の課題ではないと思う。APIなど使わないとならないのではないかな。 こういうタイマーを使う処理や、実行中の処理を中止するなどは、特に後者はVBAでは禁断の範囲かと思う。 私も興味で手探りでやったので参考までに。 ーー ボタンクリックで開始の仕組みは簡単。 Private Sub CommandButton1_Click() 以下3行でボタンのクリックイベント ーー 停止が問題で Private Sub CommandButton2_Click()以下。 ーー シートモジュールに Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_CLOSE As Long = &H10 Private Sub CommandButton1_Click() Macro End Sub Private Sub CommandButton2_Click() Dim hwindow As Long 'hwindow = FindWindow(vbNullString, "電卓") 'hwindow = FindWindow(vbNullString, "Microsoft Excel - タイマー繰り返しVBA.xls") hwindow = FindWindow(vbNullString, "無題 - メモ帳") <--この””内のウインドウタイトル部分を正しく入れること If hwindow <> 0 Then Call SendMessage(hwindow, WM_CLOSE, 0, 0) End If End Sub === 標準モジュールに Private MyTime As Date Sub Macro() MsgBox "開始" & Time MyTime = Now() + TimeSerial(0, 0, 5) 'TimeSerial(22, 16, 0) Application.OnTime MyTime, "本体" End Sub Sub 本体() Sheets("Sheet1").Range("A10").Copy Sheets("Sheet2").Select Range("A2").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown MsgBox Time 'ActiveWorkbook.Save MyTime = MyTime + TimeValue("00.00.10") Application.OnTime MyTime, "本体" End Sub 質問のコードは、テストに便利なように、多少変更している。1分ー>10秒など。 質問のコードはSelectが多くて読みにくい。マクロの記録式から脱却のこと。 ーー それにつけても、質問のコードは、1データで1ブック書き出しているようだが、コピーはあっても貼り付けのコードが見当たらないのでは。 ーー また次の1分後のデータを同一シートの1行下に記録していく(それを順次繰返す)のが普通ではないのか。であれば質問のコードは不完全。