excelのVBAを使用して[ある作業をしている=マクロを実行中など]ときに、同じPCの画面上で、経過時間を表示したり、そのデータをマクロ側で利用したいのです。①VBAマクロから時計にコマンドを送ったり(時計をスタート、ストップさせる、0にリセットする)、②VBAのマクロで時計情報を得たりする方法があるのか、そうしたことができる時計ツール(アクセサリ?)のようなモノがあるのかを知りたいのです。
あるいは、そうしたことができる時計を安価&簡単につくるサービスを提供しているところがあるのかを知りたいのですが。
適当にストップウォッチアプリケーションを作成して、マクロからSendMessageを飛ばせば、できそうです。
http://blog.so-net.ne.jp/mima_test/2008-01-12
環境によっては動いたり、動かなかったりするかもしれませんが、参考程度に。
方法としてですが、
アプリケーション間でデータをやり取りするには、
DDE(DynamicDataExchange)
というやり方や
ActiveX EXE
があります。
簡単につくるには、VisualBasic6.0での作成方法ですが、
が参考になると思います。
私的には、マクロ作業中の経過時間を判断するのであれば、外部アプリに頼るのではなく、同マクロ内で処理させます。汎用的に作るのであればクラス化(クラスモジュールで作成)して作ります。
ありがとうございます。現在、UserFormを利用してある処理を利用者に求めるマクロを作っているのです。そのとき利用者の操作時間(経過時間)を画面上で表示したいのです。利用者の操作経過時間は、チェンジイベントなどで測れるのですが、利用者がPC画面上(現在はUserForm上)で、時間の経過、切迫度?を目視できるようにしたいと思っています。現在は、Application.OnTimeを1秒後にセットして、時間経過を表示すると同時に、再度Application.OnTimeを1秒後にセットするような方法をとっています。この間に利用者の操作に基づいて、マクロで画像等の処理したりしているので、あまり良い方法とは思えません。とりあえず初期値残20秒からカウントダウンしたり、あるいはあるイベントからの経過時間を1秒間隔でカウントしたりはできているのですが、他の操作や処理にPCの手間が掛かったりする場合のことを考えると、Application.OnTimeで経過時間をUserFormに表示させるのはやめて、他の方法を探すべきではないかと思いました。(できれば、1秒よりも短い間隔で時間経過を示したい気持ちもあります。現在の方法ではちょっとまどろっこしいのと、タイミングによっては画面がぎくしゃくするので、時間経過だけを(マクロの処理や利用者のイベントとは別個に・勝手に)時計表示だけは他の方法でやれて、なおかつ時計のスタート・ストップ・リセット・経過時間情報をマクロ側で利用できるようなものを探しているのです。
クラスモジュールは、この利用者の操作を処理するために使ってはいるのですが、理解せずに使っている状態なので、………
http://www.surveytec.com/prog/vb/kouza2/chap1.html を見せていただきましたが、今の私には簡単には理解できません。
初心者なので、初歩的なところからしかわからないのですが、アドバンスいただければ幸いです。
窓の杜やベクターにも時計はたくさんあるのですが、それをマクロから操作できる方法があるのかもわからず、はてなでお助けをお願いしています。
適当にストップウォッチアプリケーションを作成して、マクロからSendMessageを飛ばせば、できそうです。
http://blog.so-net.ne.jp/mima_test/2008-01-12
環境によっては動いたり、動かなかったりするかもしれませんが、参考程度に。
とてもありがとうございます。私の意図は、ご理解いただいたとおりです。ブログに作成添付してだいたStopWatch.exeは
私の環境では動きました。
execlのマクロで、
スタート=リセットスタート
Sub tokei1()
Dim wt As New clsStopWatch
wt.StartTimer
End Sub
ストップ=スタートからストップまでの経過時間表示・同取得&リセットできました。
Sub tokei3()
Dim wt As New clsStopWatch
Cells(10, 5).Value = wt.StopTimer
End Sub
CやC++は全く知らないので、エクセルのマクロだけで次のコードを書きました。
Sub tokei0()
Dim asdf As Variant
Dim wt As New clsStopWatch
asdf = Shell(ThisWorkbook.Path & "\StopWatch.exe", vbNormalFocus)
wt.StartTimer
End Sub
これで、StopWatch.exeを起動させ、スタートできるのですが、
tokei3()を実行させても、1回目ではストップが効きません。2度目でストップします。
なぜでしょうか。tokei3()1度でストップさせるには、どうすれば良いでしょうか。
勝手なお願いになりますが、StopWatchの画面上のスタートストップボタン表示をなくして、
計時の数値フォントだけを大きくしたものを作る方法がありましたら、教えてください。
画像データの処理などを並行するのなら
余計にリソース圧迫しないように全てVBA内のみで処理する事をお勧めします。
経過時間を表示するだけなら、単純にユーザフォームをモードレスにして、反映し続けるので良いかと。
まんまコピペはできないですが、下記にサンプル作ってみました。
サンプルの「CommandButton1_Click」だけはユーザーフォームのプロシージャです。
流れとしては、
ユーザフォームを表示
→無限ループでユーザフォームに経過時間を反映し続ける
→ユーザフォームの入力完了ボタンを押したら
無限ループを中断して後処理を実施(Public変数でフラグ変数を用意しておく)
'後処理用の変数をPublicで定義 Public BL1 As Boolean Public Sub テスト() '変数定義 Dim DT1 As Date 'ユーザフォームをモードレスで開く Load UserForm1 UserForm1.Show vbModeless 後処理用の変数を初期化 BL1 = False '開始時刻取得 DT1 = Now 'ユーザフォームに経過時間を表示 Do UserForm1.Label1.Caption = Format(Now - DT1, "h:mm:ss") & " 経過" 'ユーザフォームの実行ボタンを押していたら 'ユーザフォームを終了させて後続処理を実施 DoEvents If BL1 = True Then Unload UserForm1 Exit Do End If Loop 'ここから後処理実施 End Sub '実行ボタンをクリックしたら後処理用の変数にフラグ立てる Private Sub CommandButton1_Click() BL1 = True End Sub
サンプルで分かりにくそうなのなものについてはリンクを貼っておきます
ありがとうございます。
私が全く誤解していました。無限ループをこしらえたら、どうにもならないと思っていました。
頂いたものをコピペして、ユーザフォームをこしらえ、フォームの切り替えや、タイマーの設定
テキストボックスへの入力をやっても、エクセルシートの操作、グラフ作成、式の入力などを
やっていても、経過時間の表示やストップがうまく同時並行でできました。
とてもありがとうございます。私の意図は、ご理解いただいたとおりです。ブログに作成添付してだいたStopWatch.exeは
私の環境では動きました。
execlのマクロで、
スタート=リセットスタート
Sub tokei1()
Dim wt As New clsStopWatch
wt.StartTimer
End Sub
ストップ=スタートからストップまでの経過時間表示・同取得&リセットできました。
Sub tokei3()
Dim wt As New clsStopWatch
Cells(10, 5).Value = wt.StopTimer
End Sub
CやC++は全く知らないので、エクセルのマクロだけで次のコードを書きました。
Sub tokei0()
Dim asdf As Variant
Dim wt As New clsStopWatch
asdf = Shell(ThisWorkbook.Path & "\StopWatch.exe", vbNormalFocus)
wt.StartTimer
End Sub
これで、StopWatch.exeを起動させ、スタートできるのですが、
tokei3()を実行させても、1回目ではストップが効きません。2度目でストップします。
なぜでしょうか。tokei3()1度でストップさせるには、どうすれば良いでしょうか。
勝手なお願いになりますが、StopWatchの画面上のスタートストップボタン表示をなくして、
計時の数値フォントだけを大きくしたものを作る方法がありましたら、教えてください。