VBAマクロの実行中に連動できる時計について

excelのVBAを使用して[ある作業をしている=マクロを実行中など]ときに、同じPCの画面上で、経過時間を表示したり、そのデータをマクロ側で利用したいのです。①VBAマクロから時計にコマンドを送ったり(時計をスタート、ストップさせる、0にリセットする)、②VBAのマクロで時計情報を得たりする方法があるのか、そうしたことができる時計ツール(アクセサリ?)のようなモノがあるのかを知りたいのです。
あるいは、そうしたことができる時計を安価&簡単につくるサービスを提供しているところがあるのかを知りたいのですが。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2008/01/08 22:35:54
  • 終了:2008/01/13 10:43:00

ベストアンサー

id:mima3 No.2

mima3回答回数1ベストアンサー獲得回数12008/01/12 14:21:55

ポイント60pt

適当にストップウォッチアプリケーションを作成して、マクロからSendMessageを飛ばせば、できそうです。

http://blog.so-net.ne.jp/mima_test/2008-01-12

環境によっては動いたり、動かなかったりするかもしれませんが、参考程度に。

id:hathi

とてもありがとうございます。私の意図は、ご理解いただいたとおりです。ブログに作成添付してだいた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の画面上のスタートストップボタン表示をなくして、

 計時の数値フォントだけを大きくしたものを作る方法がありましたら、教えてください。

2008/01/13 09:13:25

その他の回答(2件)

id:F-15X No.1

F-15X回答回数111ベストアンサー獲得回数132008/01/09 15:20:08

ポイント27pt

方法としてですが、

アプリケーション間でデータをやり取りするには、

DDE(DynamicDataExchange)

というやり方や

ActiveX EXE

があります。


簡単につくるには、VisualBasic6.0での作成方法ですが、

カンタンOLEサーバー (ActiveX EXE)

が参考になると思います。


私的には、マクロ作業中の経過時間を判断するのであれば、外部アプリに頼るのではなく、同マクロ内で処理させます。汎用的に作るのであればクラス化(クラスモジュールで作成)して作ります。

id:hathi

ありがとうございます。現在、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 を見せていただきましたが、今の私には簡単には理解できません。

初心者なので、初歩的なところからしかわからないのですが、アドバンスいただければ幸いです。

窓の杜やベクターにも時計はたくさんあるのですが、それをマクロから操作できる方法があるのかもわからず、はてなでお助けをお願いしています。

2008/01/09 23:20:58
id:mima3 No.2

mima3回答回数1ベストアンサー獲得回数12008/01/12 14:21:55ここでベストアンサー

ポイント60pt

適当にストップウォッチアプリケーションを作成して、マクロからSendMessageを飛ばせば、できそうです。

http://blog.so-net.ne.jp/mima_test/2008-01-12

環境によっては動いたり、動かなかったりするかもしれませんが、参考程度に。

id:hathi

とてもありがとうございます。私の意図は、ご理解いただいたとおりです。ブログに作成添付してだいた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の画面上のスタートストップボタン表示をなくして、

 計時の数値フォントだけを大きくしたものを作る方法がありましたら、教えてください。

2008/01/13 09:13:25
id:Dark1984B No.3

黒ひよこ回答回数17ベストアンサー獲得回数02008/01/13 04:51:09

ポイント85pt

画像データの処理などを並行するのなら

余計にリソース圧迫しないように全て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

サンプルで分かりにくそうなのなものについてはリンクを貼っておきます

http://support.microsoft.com/kb/408871/ja

http://cgi34.plala.or.jp/~seagate/vba11.html

id:hathi

ありがとうございます。

私が全く誤解していました。無限ループをこしらえたら、どうにもならないと思っていました。

頂いたものをコピペして、ユーザフォームをこしらえ、フォームの切り替えや、タイマーの設定

テキストボックスへの入力をやっても、エクセルシートの操作、グラフ作成、式の入力などを

やっていても、経過時間の表示やストップがうまく同時並行でできました。

2008/01/13 10:35:20
  • id:taknt
    http://72.14.235.104/search?q=cache:5CQwiLAqGJwJ:www.h3.dion.ne.jp/~sakatsu/Excel_Tips15.htm+VBA+%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC&hl=ja&ct=clnk&cd=1&lr=lang_ja

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません