[Excel VBA] イベント処理 <確認問題>
以下は、Excel VBAのイベント処理に関する理解度チェック問題です。
初級レベルの方向けの内容になっています。問題は5問あります。挑戦してみましょう。
【問題1】Workbook_Openイベント
次のコードは、ブックを開いたときにメッセージボックスを表示するものです。コードを正しく動作させるためには、どこに記述すればよいでしょうか?
1 2 3 |
Private Sub Workbook_Open() MsgBox "ブックが開かれました!" End Sub |
- 任意の標準モジュール(Module1など)
- Sheet1 (シート1) のコードウィンドウ
- ThisWorkbook のコードウィンドウ
- ExcelのVBAエディターには記述せず、シートのセルに入力
正解:
3) ThisWorkbook のコードウィンドウ
(解説) Workbook_Open イベントは ThisWorkbook に記述する必要があります。ThisWorkbookは自分自身(マクロファイル)のことを指します。
【問題2】Worksheet_Changeイベント
Worksheet_Change イベントを使うと、どのようなタイミングで処理が実行されますか?
- セルの値が変更されたとき
- シートが選択されたとき
- セルの書式が変更されたとき
- ブックが開かれたとき
正解:
1) セルの値が変更されたとき
(解説) Worksheet_Change は、セルの値が変更されたときに発生します。
【問題3】Worksheet_SelectionChangeイベント
次のコードを実行したとき、どのような動作をしますか?
1 2 3 4 5 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 1 Then MsgBox "Hello World!" End If End Sub |
- ワークシートが開かれたときにメッセージが表示される
- A列のセルを選択するとメッセージが表示される
- セルの値を変更するとメッセージが表示される
- マクロを実行しないとメッセージは表示されない
正解:
2) A列のセルを選択するとメッセージが表示される
(解説) Worksheet_SelectionChange イベントは、セルが選択されるたびに発生します。
「シートの選択範囲」がイベントの対象となるので、こちらのコードはSheet1などのシートオブジェクトモジュールに記述します。
【問題4】Workbook_BeforeCloseイベント
次のコードを実行すると、どのような動作をしますか?
1 2 3 4 5 6 7 8 |
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim result As VbMsgBoxResult result = MsgBox("本当に閉じますか?", vbYesNo) If result = vbNo Then Cancel = True End If End Sub |
- ブックを閉じるたびにメッセージが表示され、No を選択すると閉じるのをキャンセルできる
- ブックを閉じた後にメッセージが表示される
- ブックを閉じると強制的にExcelが終了する
- 何も起こらない
正解:
1) ブックを閉じるたびにメッセージが表示され、No を選択すると閉じるのをキャンセルできる
(解説) Workbook_BeforeClose イベントで Cancel = True にすると、ブックの閉じる動作をキャンセルできます。このイベントプロシージャはブックに対するものなのでThisWorkbookに記述します。
【問題5】シートの変更を検出
Worksheet_Change イベントを使って、セルA1に「完了」と入力されたらメッセージを表示するコードはどれでしょうか?
1.
1 2 3 4 5 |
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Value = "完了" Then MsgBox "タスク完了!" End If End Sub |
2.
1 2 3 4 5 |
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Target.Value = "完了" Then MsgBox "タスク完了!" End If End Sub |
3.
1 2 3 4 5 |
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" And Target.Value = "完了" Then MsgBox "タスク完了!" End If End Sub |
4.
1 2 3 4 5 |
Sub CheckCompletion() If Range("A1").Value = "完了" Then MsgBox "タスク完了!" End If End Sub |
正解:
2)
(解説)
Worksheet_Change ⇒対象のセルの値が変わったときに発生する。
Target.Address = “$A$1″ ⇒A1セルのみを対象にする。
2)と3)の違いについて
2)はWorksheet_Changeイベントで、プロシージャはシートモジュールに記述されます。
3)はWorkbook_SheetChangeイベントで、プロシージャはブックモジュールに記述されます。こちらはブック全体が対象のため、シートに依らずイベントが発生するとプロシージャが実行されます。
今回の問題では「Worksheet_Change イベントを使って」となっているため3)は×となりますが、処理内容は2)と3)で同じです。
ディスカッション
コメント一覧
まだ、コメントがありません