前回(はじめてのプログラミング#002)の投稿では、EXCELでオブジェクトの名称と開発環境・開発画面について説明しました。
早速、プログラミングを始めてみましょう。
なお、このブログの解説動画をYoutubeに用意していますので、あわせてご確認ください。
プログラムが突然動き出すことはありません。「〇〇したとき」が動きだすタイミングです。
これをイベントと言います。
など、Excelには様々なイベントがあります。
プログラムの基本は、オブジェクトとイベントです。オブジェクトの状態が変化したときにイベントが発生して、プログラムが実行される。まずは、この概念をしっかり理解しましょう。
開発画面を見ると、初期状態で「Sheet1」「Sheet2」「Sheet3」「ThisWorkBook」があります。これは、「このブック」に「3つのシート」があるからです。
「ブックを開いたとき」「ブックを閉じたとき」など、イベントを発生させたオブジェクトが「ブック」の場合は、「ThisWorkBook」にプログラムを記述します。
「セルA1に値を入力した(=シートの内容が変わった)」「カーソルをセルA1からB1に移動した(=選択範囲が変わった)」などシートの状態が変化したことによりイベントが発生した場合は、「Sheet1」「Sheet2」「Sheet3」いずれかの対象のシートにプログラムを記述します。
ブックオブジェクト、シートオブジェクトには数多くのイベントが用意されています。
詳細は、マイクロソフト社が公開しているドキュメントを参照してください。
初心者にとっては難しい内容かもしれませんが、ドキュメントやマニュアルを読み解く力も重要になります。
それでは、プログラミングを行い、イベントを体験してみましょう。
これから作るプログラムは、「シートでカーソルを移動したときに、カーソルがあるセルを表示する」というものです。
上記の手順を進めると
Private Sub Worksheet_SelectionChange(Byval Target As Range)
End Sub
このようなプログラムが表示されます。このプログラムを詳しく解説していきます。
1行目に書かれている「Private」の部分をアクセス修飾子と言います。Excelでは、主に Private と Public の2種類があります。
このアクセス修飾子は、他のオブジェクトから使えるかどうか です。「Privateは使えない」「Publicは使える」となります。
次に1行目に書かれている「Sub」の部分です。これをプロシージャと言います。Excelでは、主に Sub と Function の2種類があります。
このプロシージャは、プログラムの実行結果をお知らせするかどうか です。「Subはお知らせしない」「Subはお知らせする」となります。
3行目の「End Sub」とセットで使います。(Functionの場合はEnd Function)
次に1行目に書かれている「Worksheet_SelectionChange」の部分がプロシージャ名です。
任意で命名することもできますがExcelでは、オブジェクトでイベントが発生した時のプロシージャ名はオブジェクト名_イベント名 が決まりとなります。
次に1行目に書かれている「Byval Target As Range」の部分がパラメータ(引数)です。
パラメータについては、後々詳しく説明しますが、Excelではイベントにおけるプロシージャに対するパラメータは決まっています。
「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情報を取り出しています。
Sheet1でカーソルを移動すると、今カーソルがある位置がセルA1に表示されていることが確認できます。
「$A$1」「$B$2」「$B$4」と表示されていますが、これを$なしにする場合は、
Target.Address(False,False)とします。
詳しくは、Addressプロパティを参照してください。
上記プログラムは別の書き方もできます。
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」になります。
今回は、
を解説し、実際にプログラムを記述、実行してみました。
次回以降も、実例をもとに解説していきます。
- PR -
Google Adsense
- PR -
Google Adsense