はじめてのプログラミング#003

  • SYSTEM
  • 2022年06月13日 21時00分

前回(はじめてのプログラミング#002)の投稿では、EXCELでオブジェクトの名称と開発環境・開発画面について説明しました。
早速、プログラミングを始めてみましょう。

なお、このブログの解説動画をYoutubeに用意していますので、あわせてご確認ください。

目次

  1. プログラムはイベントで動作を開始する
  2. どこにプログラムを記述するのか
    1. イベントを発生させるオブジェクト毎にプログラムを記述する
    2. イベントの一覧
  3. イベントを体感してみよう
    1. オブジェクトとイベントの選択
    2. 目的のプログラムを書いてみる
    3. 実行してみよう
    4. もう1つの書き方
  4. まとめ

1.プログラムはイベントで動作を開始する

プログラムが突然動き出すことはありません。「〇〇したとき」が動きだすタイミングです。
これをイベントと言います。

  • ブックを開いとき
  • 選択場所が変わったとき
  • シートの値が変わったとき

など、Excelには様々なイベントがあります。

プログラムの基本は、オブジェクトイベントです。オブジェクトの状態が変化したときにイベントが発生して、プログラムが実行される。まずは、この概念をしっかり理解しましょう。

2.どこにプログラムを記述するのか

開発画面を見ると、初期状態で「Sheet1」「Sheet2」「Sheet3」「ThisWorkBook」があります。これは、「このブック」に「3つのシート」があるからです。

2-1.イベントを発生させるオブジェクト毎にプログラムを記述する

「ブックを開いたとき」「ブックを閉じたとき」など、イベントを発生させたオブジェクトが「ブック」の場合は、「ThisWorkBook」にプログラムを記述します。

「セルA1に値を入力した(=シートの内容が変わった)」「カーソルをセルA1からB1に移動した(=選択範囲が変わった)」などシートの状態が変化したことによりイベントが発生した場合は、「Sheet1」「Sheet2」「Sheet3」いずれかの対象のシートにプログラムを記述します。

2-2.イベントの一覧

ブックオブジェクト、シートオブジェクトには数多くのイベントが用意されています。
詳細は、マイクロソフト社が公開しているドキュメントを参照してください。

Workbook オブジェクト (Excel) ー イベント

Worksheet オブジェクト (Excel) ー イベント

初心者にとっては難しい内容かもしれませんが、ドキュメントやマニュアルを読み解く力も重要になります。

3.イベントを体感してみよう

それでは、プログラミングを行い、イベントを体験してみましょう。

これから作るプログラムは、「シートでカーソルを移動したときに、カーソルがあるセルを表示する」というものです。

3-1.オブジェクトとイベントの選択

  1. Sheet1 を選択
  2. (General) から WorkSheet を選択
  3. (Declarations) から SelectionChange を選択

上記の手順を進めると

Private Sub Worksheet_SelectionChange(Byval Target As Range)

End Sub

このようなプログラムが表示されます。このプログラムを詳しく解説していきます。

1行目に書かれている「Private」の部分をアクセス修飾子と言います。Excelでは、主に PrivatePublic の2種類があります。
このアクセス修飾子は、他のオブジェクトから使えるかどうか です。「Privateは使えない」「Publicは使える」となります。

次に1行目に書かれている「Sub」の部分です。これをプロシージャと言います。Excelでは、主に SubFunction の2種類があります。
このプロシージャは、プログラムの実行結果をお知らせするかどうか です。「Subはお知らせしない」「Subはお知らせする」となります。
3行目の「End Sub」とセットで使います。(Functionの場合はEnd Function)

次に1行目に書かれている「Worksheet_SelectionChange」の部分がプロシージャ名です。
任意で命名することもできますがExcelでは、オブジェクトでイベントが発生した時のプロシージャ名オブジェクト名_イベント名 が決まりとなります。

次に1行目に書かれている「Byval Target As Range」の部分がパラメータ(引数)です。
パラメータについては、後々詳しく説明しますが、Excelではイベントにおけるプロシージャに対するパラメータは決まっています。

3-2.目的のプログラムを書いてみる

「3-1.オブジェクトとイベントの選択」で「シートの選択場所が変わった時」を設定しました。これでシート上でカーソルを動かすと、ここに書いたプログラムが実行されるようになります。

今回のプログラムは「カーソルのある場所を表示する」が目的となります。この「カーソルのある場所」がパラメータ「Target」に保存されています。これをシート1のセルA1に表示してみましょう。

Private Sub Worksheet_SelectionChange(Byval Target As Range)
    ActiveSheet.Range("A1") = Target.Address
End Sub

このプログラムを日本語で表現すると
「シートの選択場所が変わった時に、アクティブなシートのセルA1に選択されている場所を入れる」
となります。1つ1つポイントを解説します。

Private Sub

先述の通り「アクセス修飾子」と「プロシージャ」です。
Privateを指定していますので、Sheet1だけで動作します。Sheet2やSheet3からこのプログラムは見えませんし動きません。
また、ExcelVBAのイベントを処理するプロシージャは、「Sub」を指定する決まりになっています。

Worksheet_SelectionChange

プロシージャ名です。WorksheetでSelectionChange(選択場所が変わった時)のイベントを意味します。ExcelVBAには、プロシージャ名の命名規則があり、プロシージャ名を変更すると、動作しません。

Byval Target As Range

引数またはパラメータです。「Targetの中にRangeの情報が入っています」を意味します。
このTargetの部分を変数、Rangeの部分をと言います。

ActiveSheet

アクティブなシート、今選択されているシートを意味します。

Range(“A1”)

A1セルを意味します。前回説明の通り、Rangeは範囲です。A1だけを指定していますので1つのセルと同じになり、Cells(1,1)と記述しても同じ意味になります。Cellsの後ろに行番号、列番号を指定します。セルB4の場合は、Cells(4,2)となります。列番号がアルファベットではなく数字であることに注意してください。

Target.Address

Targetは先述の通り、パラメータ変数です。Targetの中に今選択されている範囲の情報が入っています。このTargetからAddress情報を取り出しています。

3-3.実行してみよう

Sheet1でカーソルを移動すると、今カーソルがある位置がセルA1に表示されていることが確認できます。

「$A$1」「$B$2」「$B$4」と表示されていますが、これを$なしにする場合は、
Target.Address(False,False)とします。

詳しくは、Addressプロパティを参照してください。

3-4.もう1つの書き方

上記プログラムは別の書き方もできます。

Private Sub Worksheet_SelectionChange(Byval Target As Range)
    ThisWorkbook.Worksheets("Sheet1").Range("A1") = Target.Address
End Sub

ThisWorkbook

このブックを指定しています。Activesheetと書くこともできます。

Worksheets(“Sheet1”)

Sheet1を指定しています。ブックの中には複数のシートが存在していますのでWorksheetsとなり「s」が付きます。その後ろに()でシートを指定します。シート名またはシート番号で指定することが可能です。シート名で指定する場合は、”Sheet1″ のようにダブルクォーテーションで囲ってシート名を指定します。シート番号で指定する場合は、Worksheets(1)と数字で指定します。
ここで注意が必要です。シート名「Sheet1」がシート番号「1」にならない場合があります。左から数えて何番目のシートなのかを指定します。シートの並びが「Sheet2」「Sheet3」「Sheet1」となっている場合、Sheet1のシート番号は「3」になります。

4.まとめ

今回は、

  • イベントがプログラム実行開始の合図
  • オブジェクトとイベントでプログラムを記述する場所が決まる

を解説し、実際にプログラムを記述、実行してみました。

次回以降も、実例をもとに解説していきます。