VBAの名前付き引数に使う「:=」について

VBAのコードの中で「:=」という記号を使う場合がある。たとえば、VBAエキスパート公式テキスト(Excel VBA ベーシック)には次の例が載っている。

ActiveCell.Delete shift:=xlUp

「これってイコールを使うのでは?」と疑問持つ人もいると思うが、「=」を使うと正常に動作しない。コンパイルエラーが発生する。

スポンサーリンク

「:=」を使うケース

どういうときに「=」ではなく「:=」を使うのかというと、それは名前付き引数を利用するときだ。それ以外では使わない。

では、名前付き引数とは一体何なのだろうか。少し遠回りかもしれないが、まずは、普通の引数について考えてみる。

次のサンプルコードAを見てほしい。Subプロシージャ「Test1」と「Test2」が定義されている。「Test1」を実行すると、「Test2」が呼び出される。その結果、指定されたセルのフォントサイズが変わる(セルB2のフォントサイズが40になる)。

◆サンプルコードA

Sub Test1()
    Call Test2("B2", 40) '①
End Sub

'指定されたセルのフォントサイズを変更する
Sub Test2(cellAddress As String, fontSize As Integer)
    Range(cellAddress).Font.Size = fontSize
End Sub

①の行では、セルのアドレスとフォントサイズを「Test2」に渡している。これは普通の引数の使い方だ。

このサンプルコードAを、名前付き引数を使って書きなおすと次のようになる。

◆サンプルコードB

Sub Test1()
    Call Test2(cellAddress:="B2", fontSize:=40) '②
End Sub

Sub Test2(cellAddress As String, fontSize As Integer)
    Range(cellAddress).Font.Size = fontSize
End Sub

「Test2」の内容は何も変わっていない。「Test1」の②の行だけ変更している。②の行では、引数名と値をセットで書いている(cellAddress:="B2" と fontSize:=40)。引数名も指示するのが名前付き引数の使い方だ。このときに、引数名と値を「=」ではなく「:=」で結ぶ必要がある。

× Call Test2(cellAddress = "B2", fontSize = 40)
○ Call Test2(cellAddress:="B2", fontSize:=40)

名前付き引数を使うと可読性が上がる

サンプルコードAとサンプルコードBで、実行結果は何も変わらない。しかし、両者にはそれぞれ特徴がある。

サンプルコードAのように、引数の値だけ書くコードは簡潔だ。冗長になりにくい。

それに対して、サンプルコードBのように名前付き引数を使う場合、コードが長くなる。しかし、可読性が上がるというメリットがある。それは、次の2つを見比べると分かると思う。

A. Call Test2("B2", 40)
B. Call Test2(cellAddress:="B2", fontSize:=40)

Aのほうは「40」という数値が何を表しているのか分からない。
(プロシージャ「Test2」の内容を見れば分かるが)

Bのほうは「fontSize:=40」と書かれている。そのため、フォントサイズを渡しているんだな、ということは一目瞭然だ。引数の名前が、可読性をあげるための情報になっている。

さらに、もう一つ例を挙げる。次のプロシージャは、ワークシートを追加するプロシージャだ。

Sub Test()
    Worksheets.Add Sheet1
End Sub

Sheet1の前に新しいシートを追加するのか、それとも後ろに追加するのか……分かりにくいと思う。こういう場合に名前付き引数を使う。そうすれば、Sheet1の前に新しいシートを追加することが明確に伝わる。

Sub Test()
    Worksheets.Add before:=Sheet1
End Sub
名前付き引数を使うかどうかは、自分のコーディングスタイルや、職場でのコーディング規則との兼ね合いになると思う。私自身は、自分で定義したプロシージャに引数を渡すときには、名前付き引数を使ってない。
(さきほど例に出した、セルのフォントサイズを変えるような自作のプロシージャの場合)

練習問題

アクティブセルを削除して上方向にシフトするマクロを作成した。正しく動作するものはどれか。次の中から1つ選択しなさい。

  1. Sub Lesson()
    ActiveCell.Delete shift::xlUp
    End Sub
  2. Sub Lesson()
    ActiveCell.Delete shift=:xlUp
    End Sub
  3. Sub Lesson()
    ActiveCell.Delete shift:=xlUp
    End Sub
  4. Sub Lesson()
    ActiveCell.Delete shift = xlUp
    End Sub

正解を見る

3

コメント