Excel VBA入門1問1答 2/2

元ネタ:ネット
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv214.html#8-1
http://excel.usefulhp.com/excel-macro/excel-macro37.html
https://msdn.microsoft.com/ja-jp/library/office/ff193220.aspx
ほか。
ありがとうございます。

問題



問1
変数の宣言を強制するにはどうするか。
答1



問2
ボタンを押したら5秒後に「5秒たったよ」とメッセージを出す
方法を述べよ。
答2



問3
ボタンを押したら2秒置きにA列のセルを順番にラベルに表示していく
ただし、セルに何もなければやめる、という方法を述べよ。
答3



問4
問3と同じ動作で、別のボタンを押すと、途中でも表示が終わる
方法を述べよ。
答4



解答



問1
モジュールの最初に以下のコードを書く。
Option Explicit



問2
標準モジュールに次のようなプロシージャを書く。
Sub MyTime()
MsgBox "5秒たったよ"
End Sub
フォームにボタンを貼り付け、次のようなコードを書く。
Private Sub CommandButton1_Click()
Application.OnTime Now + TimeValue("00:00:05"), "MyTime"
End Sub
呼び出すプロシージャをフォームのコードと一緒に書く方法がわからない。
そもそもVBAの構造化の慣習がわからない。
が、まあ、とりあえず。



問3
標準モールを次のようにする。
Option Explicit
Dim line As Integer

Sub MyTime()
UserForm1.Label1.Caption = Worksheets("Sheet1").Cells(line, 1).Value
line = line + 1
If Worksheets("Sheet1").Cells(line, 1).Value <> "" Then
Application.OnTime Now + TimeValue("00:00:02"), "MyTime"
End If
End Sub

Sub MyHello()
line = 1
UserForm1.Show
End Sub

フォームにはラベルとボタンを貼り付けて、ボタンのコードを次のようにする。
Private Sub CommandButton1_Click()
MyTime
End Sub



問4
標準モールを次のようにする。
Option Explicit
Dim line As Integer
Dim sd As Date

Sub MyTime()
UserForm1.Label1.Caption = Worksheets("Sheet1").Cells(line, 1).Value
line = line + 1
If Worksheets("Sheet1").Cells(line, 1).Value <> "" Then
sd = Now + TimeValue("00:00:02")
Application.OnTime sd, "MyTime"
End If
End Sub

Sub MyTimeStop()
If Now > sd Then
Exit Sub
End If
Application.OnTime sd, "MyTime", , False
End Sub

Sub MyHello()
line = 1
UserForm1.Show
End Sub

ボタンをもう1つ貼り付けてそのコードを次のようにする。
Private Sub CommandButton2_Click()
MyTimeStop
End Sub
あと、一応次のコードをフォームに足してみた。
役に立つかどうかはわからない。
Private Sub UserForm_Terminate()
MyTimeStop
End Sub

しかし、OnTimeの動作がよくわからない。
特に、ダブって命令してしまったときの処理が不安定な気がする。
つまり、ボタンを連打したりするとハングアップする。
しかし、OnTimeの進行状況を見る方法を私は知らないので、
きちんと対処する方法がない。
今言えることは、「OnTimeを連打するな」である。