|
おはようございます。
MS社のHelpは私もわかりづらい記述だと思っています。
(というより、ソフトウェアのマニュアルって全体的にわかりづらいよね)
特に勉強をやりはじめだと殊にそう感じると思います。
よって、自分が記述する時は「もっとわかりやすく記述しよう」
という気になりますよね!!
DoEvents 制御をWindowsに戻すフロー制御関数とあります。
Windowsに制御を戻した事による結果は、その時の処理によってケースバイケースです。
例1
新規ブックの標準モジュールに
Sub test1()
Cells.Clear
Range("A1").Select
SendKeys "aaa" & Chr(13)
Range("A2").Value = Range("A1").Value
End Sub
'上記のコードセルA1を選択してSendkeysステートメントで文字を送っています。
'その後A1の内容をA2に移行する、よってセルA2にも「aaa」と表示される
'ことを想定していますが、A2は空白のままですよね?
Sub test2()
Cells.Clear
Range("A1").Select
SendKeys "aaa" & Chr(13)
DoEvents
Range("A2").Value = Range("A1").Value
End Sub
'上記のようにDoeventsを入れると想定どおり、セルA2にも「aaa」と表示される
’Sendkeysは、Windowsに制御は移らないと実行されません。つまり、test1では、
'test1の実行が終了後にSendkeysが実行されます。
'test2では、Doeventsを入れることで制御フローを変更しています。
例2 極簡単なストップウォッチを作ります
新規ブックのSheet1に「コントロールツールボックス」のコマンドボタンを
二つ配置してください(セルA1にボタンを重ねないこと)
Commandbutton1 --- セルA1に時刻を表示し続ける
Commandbutton2 --- 時刻を表示を中止する
Sheet1のモジュールに
'==========================================================
Option Explicit
'=================================================================
Private stop_ev As Boolean
Private Sub CommandButton1_Click()
stop_ev = False
Range("a1").NumberFormatLocal = "hh:mm:ss.00"
Do Until stop_ev = True
Range("a1").Value = [Now()]
DoEvents
Loop
End Sub
'==================================================================
Private Sub CommandButton2_Click()
stop_ev = True
End Sub
上記のCommandButton1_Clickでループ中にDoeventsがあることで
時刻が表示中でもCommandbutton2をクリック可能になっています。
Doeventsを抜いて、動作の違いを確認してください。
|
|