
マクロの実行中に、その処理を、条件分岐によってある一定時間だけ止めて、また再開させるようなプログラムを作りたいと考えています。
Application.Waitを使えば、可能というとこまではわかったのですが、それだとマクロ停止中にEXCEL上での一切の操作(たとえばスクロール)ができなくなるので、マクロだけ停止させておいて、他の操作はできるようなやり方はありませんでしょうか?
ちなみに、当方の使用OSはXP、EXCELは2007です。VBAは、はじめて取り組む超初心者で、以下のコードもネットやこちらのサイトを探しまくって、ようやくここまでできました。
なお、本マクロで具体的にやりたいことは、楽天証券のRSSというアプリケーションから、EXCELの特定の列に、1行目から順番に、リアルタイムで株価が書き込まれていきます。その株価を監視して、ある一定以上になったら、音で知らせるということをやりたいのです。その際、株価が書き込まれていく間隔は、数秒~数分です。
長々と書きましたが、ご教授いただけると助かります。
<参考:現在のマクロ>
Sub Test()
Dim waitTime As Variant
Dim 繰り返し As Long
For 繰り返し = 1 To 10
If Cells(繰り返し, 1).Value >= 10000 Then
Shell "mplay32.exe /play /close C:\WINDOWS\Media\notify.wav"
ElseIf Cells(繰り返し, 1).Value = Empty Then
waitTime = Now + TimeValue("0:00:05")
Application.Wait waitTime
End If
Next 繰り返し
End Sub
No.3ベストアンサー
- 回答日時:
こんばんは。
Microsoft のサポートには、そのものズバリの内容がありますが、少し古い内容です。実際、以下のプロパティで、楽天RSSの前バージョン(約2年前)では私は成功していますが、現行ツールでは知りません。RSSは、バージョンがあがりました。
http://support.microsoft.com/support/excel/conte …
それから、外部ツールを使って、音を鳴らすのはあまり賛成しません。一応、書いておきますが、本来は、内部コマンドのBeep やパターンの色付けでよいと思います。
1番目の場合は、最初に、Auto_Open を実行してください。一旦、ファイルを閉じて、再び開いても自動的に設定されています。
なお、Microsoft サポートの注にも書かれていますが、DDEやOLEではない場合に、ハンドラーが取れないこともあります。その場合は、OnEntry や Change イベントを使用してください、と書かれています。つまり、1番のマクロは、データがインポートされたときにのみ、起動するマクロです。ともかく、最初のマクロだけでも試してみてください。まだ、そういう古い方式が可能なのか、こちらでも知りたいのです。
-----------------------------------------
'標準モジュール
'Option Explicit
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
'一旦、閉じて開くか、最初に実行してください。
Sub Auto_Open()
'実際のシート名を入れてください。
Worksheets("Sheet1").OnData = "Test1"
End Sub
Sub Test1()
Dim i As Long
Dim rt As Long
Static j As Long
Const sSOUND As String = "C:\WINDOWS\Media\notify.wav"
i = Cells(Rows.Count, 1).End(xlUp).Row
If i <> j Then
If Cells(i, 1).End(xlUp).Value > 10000 Then
rt = mciSendString("Play " & sSOUND, "", 0, 0)
'Beep 'ビープ
'Cells(Rows.Count, 1).End(xlUp).Interior.ColorIndex = 34 '色づけ
End If
End If
j = i
End Sub
-------------------------------------
OnTime メソッドを使う場合は、LastTime を数秒の間の設定をしたほうがよいです。LastTime を入れないと、待機状態の後に、立て続けに、マクロの起動をしてしまい意味のないものになってしまいます。また、行数が単にインクリースしても、そこにデータがなければ、意味のないチェックになってしまいますから、必ず、実際に存在するデータに連動していなければなりません。また、データが増えなければ、チェックはしません。
以下の場合は、ワークシートの作業中とマクロのデータチェックがぶつかった場合は、作業のほうが必ず優先しますが、その待機状態は、数秒間しかありません。その時に無視したデータは、次のマクロで必ずフォローするように出来ています。なお、色づけとBeep という方式になっていますから、色づけが嫌いなら、コメントブロック(')を入れてください。
一列の最後尾に、文字「Q(大文字・小文字共通)」を入れれば、それで終了します。
------------------------------------------
'標準モジュール
'Option Explicit
Sub TimerMacro()
Dim i As Long '行
Dim n As Long
Dim myTime As Date
Static j As Long
'----------------------------------
'チェックする値を以下に入れてください。
Const MYLIMIT As Long = 10000
'----------------------------------
i = Cells(Rows.Count, 1).End(xlUp).Row
'終了は、Q を入れる
If StrComp(Cells(i, 1).Value, "Q", 1) = 0 Then
MsgBox "終了しました。", 64
Exit Sub
End If
If i > j And j > 0 Then
For n = j To i
'上限を超える場合
If Cells(n, 1).Value > MYLIMIT Then
Cells(n, 1).Interior.ColorIndex = 34 '水色
Beep '音
End If
Next n
ElseIf j = 0 Then
If Cells(i, 1).Value > MYLIMIT Then
Cells(i, 1).Interior.ColorIndex = 34 '水色
Beep '音
End If
End If
j = i
myTime = Now + TimeSerial(0, 0, 5) '5秒
Application.OnTime myTime, "TimerMacro", myTime + TimeSerial(0, 0, 2) '待機2秒
End Sub
----------------------------------------
Wendy02様
ご丁寧なアドバイス、ありがとうございます。
Wendy02様も以前同様なことを、楽天RSSでなされていたのですね。
さて、頂いたアドバイスをもとに、RSSにはつながずテスト環境で試そうと試みたのですが、この場合はDDEではないため、OnEntryやChangeイベントを使用とのことで、恥ずかしながら、まだそこまでの知識が不足しており、上手くテストできておりません。
幸い週末ですので、VBAの学習しつつ、頂きましたサンプルマクロをテストさせて頂きます。うまく進めば、楽天RSSが使用できる月曜以降に本番環境でテストしてみますので、またその結果をご報告させていただきたいと存じます。
取り急ぎお礼まで。
ありがとうございました。
No.2
- 回答日時:
ユーザに一旦制御を返すということのようなので、マクロを一度中断させる(終了させる)ようなコードにしておく必要があります。
一定時間経過後に(続きを)実行させれば可能です。ごく簡単な、サンプルを・・
5秒おきにA1セルの値を1増加します。(中断するには、A1セルに文字を入れてエラーを起こさせるか、Ctr+Breakなど)
マクロを一度抜け出しますので、実際の計算では(もっと複雑でしょうから)、その間にセルの内容が変わったり(ユーザが変える)することも考慮して、また、独立で実行可能なマクロを作成する必要がありますので、ご注意ください。
Sub sample()
Cells(1, 1) = Cells(1, 1) + 1
Application.OnTime Now + TimeValue("00:00:05"), "ThisWorkbook.sample"
End Sub
fujillin様、
早速のアドバイスありがとうございます。
このやり方ですと、私の場合は条件式以下に、
Application.OnTime~
以下を挿入するということだと理解いたしました(違ってますでしょうか?)。
早速試してみます。
誠にありがとうございました。
No.1
- 回答日時:
こんにちは
他にもありますが、比較的簡単な方法のサンプルです。
お使いのアプリケーションとの兼ね合いでお望み通り機能するか、
私にはわかりませんので、試しに、ということで。
Sub TEST()
Dim tm As Single
tm = Timer() + 5
Do
DoEvents
Loop While Timer() < tm
MsgBox "5秒経過"
End Sub
cj_mover様、
早速のアドバイスありがとうございました。
助かりました。
ただ、このマクロを組み込んで実行したところ、メッセージボックスで毎回ボタンを押さないと、マクロはずっと止まったままになるのですね。
不在(監視していない)の時は、自動的にメッセージボックスが閉じて、マクロが再開されるような方法を、ネットで調べてみます。
今回はありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
このQ&Aを見た人はこんなQ&Aも見ています
-
Application.Wait の参照設定
Visual Basic(VBA)
-
VBAでdo内にてWAITを使うとエラーが出る
Visual Basic(VBA)
-
Excel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい
Excel(エクセル)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
エクセルVBA イベントプロシージャを一時停止する方法を知りたい
Visual Basic(VBA)
-
6
VBAでの一時停止と再開の方法
その他(プログラミング・Web制作)
-
7
Excel VBAにて2つの処理を同時実行可能?
Visual Basic(VBA)
-
8
VBAで3秒だけ時間を止めたい
Visual Basic(VBA)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
VBAで一時中断したプログラムの再開をさせたい
Visual Basic(VBA)
-
11
VBAでのユーザフォームの表示有無の確認について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のPCだけ動作しないVBAマク...
-
一つのTeratermのマクロで複数...
-
Excel・Word リサーチ機能を無...
-
エクセルで特定の列が0表示の場...
-
Excel_マクロ_現在開いているシ...
-
エクセルに張り付けた写真のフ...
-
メッセージボックスのOKボタ...
-
ExcelのVBA。public変数の値が...
-
IF関数を使ってマクロを実行さ...
-
オートフィルターとExcelマクロ...
-
ExcelVBAでPDFを閉じるソース
-
バッチファイルでEXCELを起動し...
-
Excel マクロ VBA プロシー...
-
Excelのセル値に基づいて図形の...
-
マクロ実行時、ユーザーフォー...
-
ExcelのVBAを使ってタイトル行...
-
EXCELマクロでのThisisWor...
-
ダブルクリックで貼り付けた画...
-
非表示の列をすべて削除するマクロ
-
Excel マクロでShearePoint先の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
一つのTeratermのマクロで複数...
-
Excel_マクロ_現在開いているシ...
-
メッセージボックスのOKボタ...
-
Excel マクロ VBA プロシー...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
エクセルで別のセルにあるふり...
-
ExcelVBAでPDFを閉じるソース
-
ダブルクリックで貼り付けた画...
-
Excel マクロでShearePoint先の...
-
TERA TERMを隠す方法
-
マクロ実行時、ユーザーフォー...
-
Excelのセル値に基づいて図形の...
-
特定文字のある行の前に空白行...
-
エクセルマクロでワードの一ペ...
-
エクセルで縦に並んだデータを...
-
Excel VBAからAccessマクロを実...
おすすめ情報