Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
Do Until Loopの疑問です
投稿日時: 17/07/17 17:16:42
投稿者: hisayanxp

B3のセルには50、C3のセルには20が入力されています。
下記の記述を実行するとMsgBoxに49から1つずつ減って19まで表示されます
 
Sub sample2()
    Do Until Range("B3").Value < Range("C3").Value
    Range("B3").Value = Range("B3").Value - 1
    MsgBox Range("B3").Value
    Loop
End Sub
 
しかし上記の記述の
MsgBox Range("B3").Valueを省いて下記の記述になるとB3には即座に19が表示されます。
 
Sub sample2()
    Do Until Range("B3").Value < Range("C3").Value
    Range("B3").Value = Range("B3").Value - 1
    Loop
End Sub
 
 
B3のセルの値が1つずつ減って19が表示される記述にするにはどうしたら良いのでしょうか?
全く考えつきません。
お分かりになる方、よろしくお願いいたします。

回答
投稿日時: 17/07/17 18:18:26
投稿者: WinArrow
投稿者のウェブサイトに移動

>19が表示される19が表示される
どのように表示させたいのでしょうか?
 
おそらく、
MSGBOX のOKをクリックする手間を減らしたいのではないかと・・・・

回答
投稿日時: 17/07/17 18:18:53
投稿者: mattuwan44

Waitメソッドを検索してみてください。
 
Sub sample2()
    Do Until Range("B3").Value < Range("C3").Value
        Range("B3").Value = Range("B3").Value - 1
        Application.Wait [Now() + "0:00:01.5"]
    Loop
End Sub

回答
投稿日時: 17/07/17 18:55:09
投稿者: hatena
投稿者のウェブサイトに移動

処理がはやすぎて表示が追い付かない状態ですね。
 
ですので、処理を適当な時間、待機すればいいですね。
 
Waitメソッドで待機させるのも一つの方法ですね。
 
ただし、Waitメソッドだと、カウントダウン中のユーザー操作は受け付けませんね。
 
もし、カウントダウン中もユーザー操作を受け付けたいなら、標準モジュールに下記のコードを記述するといいでね。
 

Sub StartCountDown()
    If Range("B3").Value < Range("C3").Value Then Exit Sub
    Range("B3").Value = Range("B3").Value - 1
    Application.OnTime Now + TimeValue("00:00:01"), "StartCountDown"
End Sub

回答
投稿日時: 17/07/17 23:42:38
投稿者: WinArrow
投稿者のウェブサイトに移動

この機能は、どのような目的でしょうか?
 
セルC1とB1の差が、大きくなればなるほど、
時間が掛かることになります。
政治では、MAXが50ですから
Application.Waitでも
OnTimeでも同じですが
MAX50秒かかります。
「処理の進捗を見せる」
という目的でしたら、
Sleep(API)
を使い、ステータスバーに表示する方法もあります。
数値ではなく、□□を並べるとか・・・いろんなことが考えられます。
Sleepは1/1000秒の指定ができます。

回答
投稿日時: 17/07/17 23:50:17
投稿者: hatena
投稿者のウェブサイトに移動

方法はいろいろあります。
 
が、結局、何のためにそのようなことをするのか、その目的と背景の説明がないので、どれが適切なのか、は、回答者には判断のしようがありません。あるいは、他に目的に合致した適切な方法があるのかもしれません。
 
なんのためにそのようなことをしたいのか、の説明が必要ですね。
 

回答
投稿日時: 17/07/18 07:01:48
投稿者: WinArrow
投稿者のウェブサイトに移動

入力ミスがありましたので、訂正します。
 
>政治では、MAXが50ですから

掲示の内容では、MAXが50ですから

回答
投稿日時: 17/07/18 21:01:27
投稿者: MMYS

hisayanxp さんの引用:

B3には即座に19が表示されます。
B3のセルの値が1つずつ減って19が表示される記述にするには

上記のプログラムでも、値が1つずつ減って表示します。
ただし、そのスピードは0.01秒で完了します。
 
超人の動体視力持ちでもない限り、人間には確認不可能です。
つまり、早すぎるのが問題なので、なんらかの方法で動作を遅くします。
 
MsgBoxを押す。これも遅くする手法の一つです。
 
 
WinArrow さんの引用:

> Sleep(API) を使い、

hisayanxpさんの過去の発言からAPI関数の紹介は時期早々と思いますけど。
Windows限定ですか、VBAのみでも1秒以下のウエイトは可能です。
 
     nextTime = Timer + 0.1
     Do Until Timer > nextTime
         DoEvents
     Loop

※ 実用には午前0時をまたぐ時の対策が必要
 
ちなみに、ウエイトとは待ち時間という意味です。
プログラムにおいて意図的に待たせるコードを言います。
 

投稿日時: 17/07/20 17:27:21
投稿者: hisayanxp

皆様へ ありがとうございました。
この疑問は純粋な興味からでした。
 
Application.Wait [Now() + "0:00:01.5"]

Sub AlarmMsg()
    MsgBox "お時間です", vbExclamation, "お知らせ"
End Sub
Sub SetAlaram2()
 Application.OnTime Now + TimeValue("00:00:15"), "AlarmMsg"
End Sub
上もうまくいきました。
 
ところがやっている途中、ある一定の時刻になったらAlarmMsgが実行できるような説明があったので、下記の記述をやってみましたが、その時刻になってもマクロが動作しませんでした。
 
Sub SetAlarm()
    Application.OnTime TimValue("17:20:00"), "AlarmMsg"
End Sub
 
この記述のどこに問題があるのでしょうか?

回答
投稿日時: 17/07/20 20:06:07
投稿者: mattuwan44

>その時刻になってもマクロが動作しませんでした。
 
セル内の編集中は、マクロを起動できません。
そういうことではないのかなぁ。。。。

回答
投稿日時: 17/07/20 20:15:15
投稿者: WinArrow
投稿者のウェブサイトに移動

>この記述のどこに問題があるのでしょうか?
 
記述は間違ってません。
 
元のマクロは何時に起動したんですか?
 
 

投稿日時: 17/07/21 07:21:01
投稿者: hisayanxp

みなさんへ、いつもありがとうございます。
 
 
Sub AlarmMsg()
    MsgBox "お時間です", vbExclamation, "お知らせ"
End Sub
 
Sub SetAlarm()
    Application.OnTime TimValue("07:18:00"), "AlarmMsg"
End Sub
 
上記の1分前から待っていても出ません。編集画面は閉じています。

回答
投稿日時: 17/07/21 08:12:53
投稿者: WinArrow
投稿者のウェブサイトに移動

このコードは、どこ(どこのモジュール)に記述していますか?

回答
投稿日時: 17/07/21 09:02:23
投稿者: ちゃこ

hisayanxp さんの引用:
みなさんへ、いつもありがとうございます。
 
 
Sub AlarmMsg()
    MsgBox "お時間です", vbExclamation, "お知らせ"
End Sub
 
Sub SetAlarm()
    Application.OnTime TimValue("07:18:00"), "AlarmMsg"
End Sub
 
 
上記の1分前から待っていても出ません。編集画面は閉じています。

 
 Application.OnTime TimValue("07:18:00"), "AlarmMsg"
                      ↑
                    TimeValue
                    じゃないですか?

投稿日時: 17/07/21 12:02:44
投稿者: hisayanxp

ちゃこさん、ありがとうございます。TimeValueに直しました。
WinArrowさん、このコードは標準モジュールに書いています。
Application.OnTime TimeValue("07:18:00"), "AlarmMsg"

回答
投稿日時: 17/07/21 13:01:45
投稿者: めんたん

それで直した結果はどうだったのですか?

回答
投稿日時: 17/07/21 13:53:08
投稿者: hatena
投稿者のウェブサイトに移動

hisayanxp さんの引用:
WinArrowさん、このコードは標準モジュールに書いています。
Application.OnTime TimeValue("07:18:00"), "AlarmMsg"

 
ひょっとして、書いただけで、実行してないとか。
まさかね。

投稿日時: 17/07/21 15:02:08
投稿者: hisayanxp

皆さんへ
 
実行したのに駄目だったんですが、今回改めて実行したらうまくいきました。
 
いろいろとお騒がせしました。
ありがとうございました。