人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: hathi
●カテゴリ:コンピュータ ゲーム
✍キーワード:Excel pc VBA アクセサ コマンド
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● F-15X
●27ポイント

方法としてですが、

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

DDE(DynamicDataExchange)

というやり方や

ActiveX EXE

があります。


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

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

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


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

◎質問者からの返答

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

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

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


2 ● mima3
●60ポイント ベストアンサー

適当にストップウォッチアプリケーションを作成して、マクロから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の画面上のスタートストップボタン表示をなくして、

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


3 ● 黒ひよこ
●85ポイント

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

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

◎質問者からの返答

ありがとうございます。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ