【初心者向け】動かして学ぶExcel VBA入門(7)

Excel VBA

こんにちは。ECF Tech担当
Michiharu.Tです。

Excel VBA入門の第7回です。

今回はVBAプログラミングの基礎として、オブジェクトとプロシージャを深堀りして学んでいきたいと思います。本格的にVBAを学ぶ上でとても重要なキーワードですので、ぜひしっかり押さえておきましょう!どうぞよろしくお願いします。

本連載の目次は下記よりご覧頂けます。

【初心者向け】動かして学ぶExcel VBA入門
Excel VBAを動かしながら学べる連載をお送りしています。講座目次第1回Excel VBAとはExcelマクロを動かしてみようExcelマクロの保存第2回セルに値を設定セルの削除オブジェクト、プロパティ、メソッド第3回ワークシートの指定...

オブジェクトとは

第2回のおさらいになりますが、「オブジェクト」は操作対象となるモノのことです。Excel VBAにおいてワークシート、セル、ブック、セル範囲などは「オブジェクト」として扱われます。

プログラム内でオブジェクトと評価される表現は様々です。たとえば、これまでの学習内容で登場した下記のような表現は、ワークシートを表すオブジェクトであると評価されます。

  • ActiveSheet
  • Worksheets("Sheet1")

ワークシートを表すオブジェクトは、実際にはWorksheetという正式名称が定義されており、RangeCellsなどのプロパティを持っています。これらのプロパティを使って、下記のようなプログラムを書くことができます。

Sub useSheetProperty()
    'アクティブシートのA1にこんにちはをセット
    ActiveSheet.Range("A1").Value = "こんにちは"
    'Sheet1のD3にこんばんはをセット
    Worksheets("Sheet1").Cells(3, 4).Value = "こんばんは"
End Sub

学習済みの内容ですが、もう1歩踏み込んで説明します。上のプログラムのうちActiveSheet.Range("A1")Worksheets("Sheet1").Cells(3, 4)の部分は、いずれもRangeと呼ばれるオブジェクトであると評価されます。「特定のセル範囲」を表すオブジェクトです。RangeオブジェクトはValueというプロパティを持っているので、これを使ってセルの値を取得したり、設定したりすることができます。

このように、Excel VBAでは「操作したい対象=オブジェクト」として表現しています。ワークシートそのもの(Worksheetオブジェクト)やセル範囲(Rangeオブジェクト)など、オブジェクトは実際のExcelの要素と対応しています。どの記述がどのようなオブジェクトと評価されるかを知ることで、プログラムの書き方の幅を広げることができます。

評価について

プログラム中の表現が何らかの値やオブジェクトと判断されることを、評価(英語ではevaluation)と言います。プログラム中の記述が、何らかの値やオブジェクトに置き換わると考えると良いでしょう。上のプログラムを例にすると下図のようなイメージになります。

評価について

オブジェクトと変数

オブジェクトは変数に代入して使用することができます。プログラムの中で何度も同じオブジェクトを参照したい場合や、複雑な処理を行う場合はオブジェクトを変数に代入して使うと便利です。

前節で登場したWorksheetRangeという正式なオブジェクト名は、変数の型としても使うことができます。オブジェクトを代入する変数を宣言する場合は、これらを使用する必要があります。実際のプログラム例をご紹介します。

Sub useObjectVariable()
    Dim ws As Worksheet  ' Worksheet型のオブジェクト変数を宣言
    Set ws = Worksheets("Sheet1")  ' オブジェクトを変数に代入

    ' 変数wsを使ってシート内のセルに値を設定
    ws.Range("A1").Value = "こんにちは"
    ws.Cells(2, 1).Value = "おはようございます"
End Sub

いくつかのポイントを解説します。

  • この例では変数wsを用意し、ws = Worksheets("Sheet1")の記述によってオブジェクトを代入しています。
  • 変数宣言時はDim ws As Worksheetのように、変数の型をオブジェクト名(この場合はWorksheet)にします。
  • オブジェクトを変数に代入する際は、Set ws = Worksheets("Sheet1")のように、代入文の冒頭にSetを記述する必要があります。
  • wsはWorksheetオブジェクトですので、wsを使ってRangeやCellsのプロパティを使用することができます。

このようにオブジェクトを変数に代入することで、Worksheets("Sheet1")のような長い記述を何度も書く必要がなくなります。

上記のプログラムでは変数の型を明示的に指定していますが、型を省略することもできます。上記の場合はDim wsと宣言できます。この時、変数の型はVariant型となります。Variant型は、オブジェクトを含め、どのような値でも代入できますので、正式なオブジェクト名がわからない場合は、型名を省略して変数宣言しても良いでしょう。

プロシージャの活用

プロシージャとは、処理のまとまりのことです。VBAにはSubプロシージャとFunctionプロシージャの2種類があります。ここでは、2種類のプロシージャの違いや活用を学びます。

Subプロシージャ

これまでSub マクロ名() ~ End Subのように書いてきたSubから書き始めるプロシージャを、Subプロシージャと呼びます。例えば次のようなものです。

Sub greeting()
    MsgBox "こんにちは"
End Sub

プロシージャの利用

Subプロシージャを利用する方法には、主に次の2つがあります。

  • マクロとして実行する
  • 別のプロシージャから利用する。

このうち「マクロとして実行する」は、下図のようにこれまで実行してきた方法です。

マクロの実行

ここではもう1つの「別のプロシージャから利用する。」についてご紹介します。別のプロシージャから利用するためには「プロシージャを呼び出す」必要があります。「呼び出す」とは、「このプロシージャを実行して!」とプログラムに命令することです。

プロシージャの呼び出しは、Callステートメントを使って次の記述で行ないます。

Call プロシージャ名

プログラム例をご紹介します。

Sub main()
    Call greeting
    Call greeting
End Sub

Sub greeting()
    MsgBox "こんにちは"
End Sub

mainプロシージャをマクロとして実行してみましょう。実行すると、「こんにちは」と表示されたメッセージボックスが2回表示されます。

mainプロシージャを実行すると最初にCall greetingが実行されます。これは「greetingプロシージャを呼び出して!」という意味です。これによりgreetingプロシージャが実行され、「こんにちは」のメッセージボックスが表示されます。

呼び出したプロシージャの処理が終わると、mainプロシージャに処理が戻ります。戻って、もう1つのCall greetingが実行されます。再度greetingプロシージャが呼び出され、メッセージが表示されます。

下図はプログラムの一連の流れのイメージです。mainプロシージャから2回greetingプロシージャが呼び出されています。

サブプロシージャコール

プロシージャの呼び出しを活用することで、複雑なプログラムを効率的に記述することができます。

プロシージャに引数を渡す

次はプロシージャに 引数(値) を渡して、より便利に活用する例をご紹介します。プロシージャに引数を渡すことで、呼び出し元から値を受け取って処理内容を変えたり、結果を出力したりすることができます。

引数を使用するプロシージャの定義方法は次のようになります。

Sub プロシージャ名(引数名1 as 型名, 引数名2 as 型名, ...)
    '何らかの処理
End Sub
  • 引数名 as 型名の記述を,を使っていくつも並べることができます。
  • 引数名は自由につけることができます。

実際のプログラムを見てみましょう。

Sub main()
    Call greetUser("太郎")
    Call greetUser("花子")
End Sub

Sub greetUser(name As String)
    MsgBox "こんにちは、" & name & "さん!"
End Sub

greetUserというプロシージャを作成しました。引数に該当するのはname As Stringの部分です。このプログラムをmainプロシージャをマクロとして実行すると、次のような結果となります。

mainプロシージャを実行すると最初にCall greetUser("太郎")が実行されます。("太郎")は、「太郎」の文字列をgreetUserに引数として渡すことを意味しています(下図)。

引数

greetUserではMsgBox "こんにちは、" & name & "さん!"が動作します。nameにはmainプロシージャから渡された太郎が代入されていますので、「こんにちは、太郎さん!」というメッセージが表示されます。

mainプロシージャの次の処理Call greetUser("花子")も同様に動作します。引数として"花子"が渡されていますので「こんにちは、花子さん!」というメッセージが表示されます。

このように、引数を使うことで、同じプロシージャでも異なる値に応じた動作をさせることができます。

Functionプロシージャ

次にFunctionプロシージャの紹介です。FunctionプロシージャはSubプロシージャと異なり、処理や計算の結果を呼び出し元に返すことができます。Functionプロシージャは次のように書きます。

Function プロシージャ名(引数 As 型) As 戻り値の型
    '処理
    プロシージャ名 = 戻す値
End Function
  • 戻り値の型は、呼び出し元に返す値の型名を記述します。
  • プロシージャ名 = 戻す値は、一連の処理の最後に記述します。

実際のプログラムを使って動作を確認してみましょう。

Function tasizan(a As Integer, b As Integer) As Integer
    'a + bの結果を返す
    tasizan = a + b
End Function

tasizanという名前のプロシージャを定義しました。整数型の引数a, bを定義しています。1行目最後のAs Integerは、戻り値として整数を返すことを表しています。

tasizan = a + bは、aとbを加算した結果を戻り値として返すことを表しています。次にこのtasizanプロシージャを呼び出すmainプロシージャを定義しましょう。

Sub main()
    Dim ans As Integer
    ans = tasizan(5, 8)
    MsgBox "結果は" & ans & "です。"
End Sub

ans = tasizan(5, 8)がtasizanプロシージャを呼び出す部分です。実行されると58が引数として渡された上で、tasizanプロシージャが呼び出されます。tasizanプロシージャからは、5+8の結果が戻り値として返されます。返された戻り値は変数ansに代入されます(下図)。

Functionプロシージャ

mainプロシージャをマクロとして実行してみましょう。実行すると下のように「結果は13です。」とメッセージボックスに表示されます。

Functionプロシージャを使うことで、Excel関数のような複雑な処理をしてくれる機能を作ることができます。たとえば次のような処理です。

  • セル範囲を指定すると、値の合計を返す。
  • セル範囲と値を指定すると、セル範囲の中に値があるかを検索する。

というわけで本日はここまでとさせて頂きたいと思います。最後までお読み頂き、ありがとうございました。次回も様々なプログラムをご紹介したいと思います。ひきつづき、よろしくお願いいたします。

タイトルとURLをコピーしました