質問: エクセル(Excel)マクロのイベントプロシージャについての質問です。 シートモジュールの Private Sub Worksheet_SelectionChange(ByVal Target As Range) の (ByVal Target As Range)の部分の意味がわかりません。 どうしてこのような記述が必要となるのでしょうか お教えいただければ幸いです。
回答: 結論を先に言うと、ユーザー(プログラマ-)が気にする必要はありません。 イベントプロシージャーは、あるイベント(出来事)が起こった時に、Excelが自動的に実行するプロシージャーです。SelectionChangeプロシージャーは、選択されているセルが変わった時に実行されるイベントプロシージャーの一種です。 しかし、ユーザー(プログラマー)はどのセルが選択されるかを予め知っているわけではありません。そこで、Excelはセルが選択された時にどのセルが選択されたかという情報をユーザーに渡してくれます。その情報を入れる入れ物がTargetという変数です。 このようにプロシージャーが実行されるときに「渡される」変数のことを特に「引数」と呼びます。 もし引数がなかったら、ユーザー(プログラマー)はどのセルが選択されたかという情報を知る由がありません。引数があるおかけで、「TargetがA列の場合はこういう処理をする」「Targetの値に10%をかける」などというプログラムが書けるわけです。 情報の渡し方には2種類あります。一つは参照渡し(ByRef)というものです。 例えばプロシージャーAが変数 hoge As Integer に 1を入れたとします。 次にその変数を引数としてプロシージャーBに渡したとします。 プロシージャーBの中でhoge = 2にしたとします。するとプロシージャーAの中で再びhogeを使おうとしたときには、hoge の中身は1ではなく2になっています。例えるなら、渡された回覧板にサインして返す(または次の人に渡す)ようなイメージです。 もう一つは値渡し(ByVal)です。これはプロシージャーBの中でhogeをどのように書き換えてもプロシージャーAの中で使うhogeには影響がありません。 例えるなら、回覧板の内容をコピーしてもらうような感じです。もらったコピーに何を書き込んでも原稿は変わらないですよね。 ちなみに引数がRange型の場合は、プロシージャーAからプロシージャーBにhoge As Rangeを値渡しにしても、プロシージャーB内でhoge.Value = 1などを書き換えるとプロシージャーA内のhoge.Valueも1になります。 Range型での参照渡しと値渡しの違いは、プロシージャーBで参照先を変更した時に表れます。下のコードは値渡しです。実行するとセルの番地は従前のまま"$A$1"と表示されます。これをByRefに書き換えると"$B$1"と表示されます Sub プロシージャーA() Dim r As Range Set r = Range("A1") Call プロシージャーB(r) Msgbox r.Address ’結果 => $A$1 End Sub Sub プロシージャーB (ByVal r As Range) Set r = Range("B1") End Sub Worksheet_SelectionChange の引数が値渡し(ByVal Target As Range)である理由は詳しくは知りませんが、プロシージャー内で勝手に参照先を書き換えられては都合が悪いのでしょう。