業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、配列を返すArray、配列のインデックス番号の最小値/最大値を返すLBound/UBound、要素ごとに区切られた文字列から配列を作るSplitなどの使い方について解説。
今回のTipsも関数の使い方について解説する。今回は、「Array」「LBound」「UBound」「Split」という「配列」に関する4つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。
「Array」関数は、配列が格納されたバリアント型の値を返す関数だ。
Array(ArgList)
「ArgList」は省略可能で、値のリストをカンマ区切りで指定する。ArrayListに格納される配列のインデックスは0から開始する。戻り値はバリアント型(Variant)になる。
「Array」関数に格納された値をExcel上に表示してみよう。VBE(Visual Basic Editor)を起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト1のコードを記述する。
Option Explicit Sub Array関数の使い方() Dim myArray As Variant Dim i As Integer myArray = Array("薬師寺国安", "夏目団子", "栗餡子", "愛媛蜜柑", "阪神虎雄") For i = 0 To UBound(myArray) Cells(i + 1, 2) = myArray(i) Next End Sub
まず、3〜4行目でバリアント型の変数「myArray」を、Integer型の変数「i」を宣言する。次に、5行目で変数「myArray」を、カンマで区切った氏名のデータで初期化する。
6〜8行目では、変数「i」を、変数「myArray」に格納した配列の、最大添え字の数だけ繰り返す。配列の最大の添字はUBound関数で取得できる。「UBound」関数については、別の回で後ほど解説する。
7行目では、「Cells(i+1,2)」で、行が「i行目」で「2列目」である「B列」にmyArray変数が格納している配列から、変数「i」に対応する値を表示していく。「i+1」としているのは、変数「i」が0から開始するため、行数を1行目から開始させるためには「+1」をする必要があるからだ。
VBEメニューの[実行]→[Sub/ユーザーフォームの実行]と選択して実行すると図1のように「B列」に氏名が表示される。
「B列」にはあらかじめExcelのメニューから「書式」と「文字サイズ」を指定している。
「LBound」関数は、指定された次元の配列で使用できる、インデックス番号の最小値を返す。「LBound」は、「UBound」と組み合わせて、配列のサイズを調べるため使用するのが普通だ。インデックス番号の最大値を調べるには、「UBound」関数を使用する。「UBound」関数については後述する。
LBound(arrayname,dimension)
「arrayname」には、配列変数の名前を指定する。
「dimension」は、配列の指定した次元で使うことのできるインデックス番号の最小値を返す。最初の次元なら「1」、2番目の次元なら「2」というように指定する。「dimension」を省略すると、「1」が使用される。
「LBound」という新しいシートを追加し、その中に図2のように、データを表示させるセルと「実行」ボタンがあったとする。
「LBound」関数で、配列に格納した「氏名」をセル「B2」から「B9」に表示させるコードはリスト2になる。
Sub LBound関数の使い方() Dim i As Integer Dim 名前 As Variant 名前 = Array("薬師寺国安", "夏目団子", "愛媛蜜柑", "阪神虎雄", "佐々木小次郎", "宮本武蔵", "服部半蔵", "織田信長") For i = LBound(名前) To UBound(名前) Cells(i + 2, 2) = 名前(i) Next End Sub
まず、2〜3行目で、Integer型の「i」変数を宣言する。バリアント型の「名前」変数を宣言する。次に、4行目で変数「名前」にArray関数を使って、カンマ区切りで「氏名」データの配列を格納しておく。
5〜7行目では、変数「i」を、「LBound」関数を使って、「名前」変数のインデックスの「最小値」から、「UBound」関数を使って、「氏名」変数のインデックスの「最大値」まで繰り返し処理を行う。「UBound」関数については後述する。
6行目では「Cells(i+2,2)」で、「i+2」行目の、「B列」の列番号「2」に対して、変数「名前」の格納している配列から変数「i」に対応する値を取得して表示する。「i+2」としているのは、「B列の2行目」からデータを表示させるために「+2」をしている。
リスト2のマクロを「実行」ボタンに関連付け、実行すると図3の用に表示される。
「UBound」関数は、配列で指定したインデックス番号の最大値を返す関数だ。
UBound(arrayname,dimension)
「arryname」は必須項目で、配列変数の名前を指定する。
「dimension」は省略可能で、インデックス番号の最大値を調べる、配列の整数を指定する。
「UBound」関数は、「LBound」関数と組み合わせて、配列のサイズを調べるため使用されることが多い。
コードサンプルや使い方については、「Array」「LBound」のサンプルを参照してほしい。
「Split」関数は、要素ごとに区切られた文字列から、ゼロベースの1次元配列を作成する関数だ。
Split(expression,delimiter,count,compare)
「expression」は必須項目で、文字列と区切り文字を含んだ文字列式を指定する。
「delimiter」は省略可能で、文字列の区切りを識別する文字を指定する。delimiterを省略すると、区切り文字に「スペース」が使用される。
「count」は省略可能で、返す配列の要素数を指定する。
「compare」は省略可能で、文字列式を評価するときに使用する文字列比較のモードを指定する。「バイナリモード」で比較する場合は「vbBinaryCompare」、「テキストモード」で比較する場合は、「vbTextCompare」を指定する。
「Split」という新しいシートを追加し、その中に図4のように「カンマで区切られた文字」を入力するセルと、「分割表示」という値を入力するセルを作成し、「実行」ボタンを配置しておく。
「実行」ボタンをクリックして、「カンマで区切られた文字」を「分割表示」するコードであるリスト3を記述する。
Sub Split関数の使い方() Dim データ() As String Dim i As Integer If Range("C2").Value = "" Then MsgBox "カンマで区切ってデータを入力してください。" Exit Sub Else データ = Split(Range("C2").Value, ",") For i = 0 To UBound(データ) Cells(i + 5, 2) = データ(i) Next End If End Sub
まず、2〜3行目で、文字列型の配列変数「データ」、Integer型の変数「i」を宣言する。4行目では、セル「C2」が未入力なら、警告を発して処理を抜ける(5〜6行目)。それ以外は8〜11行目の処理を行う。
8行目では、「Split」関数で、カンマで区切られた、「C2」のセルに入力された値を、配列変数「データ」に格納する。
9〜11行目では、変数「i」で、0から配列変数「データ」に格納されている要素の数だけ、繰り返し処理を行う。
繰り返し処理の過程の10行目では、「i+5」列の、「2列目(B列)」に、変数「i」に対応する、配列変数「データ」の値を表示していく。「i+5」と「5」をプラスしているのは、「B列の5行目」からデータを表示させるために、「5」をプラスしている。
このリスト3のマクロを「実行」ボタンに関連付け実行した結果が図5だ。
「分割表示」列にカンマで区切られたデータが分割して表示された。
今回は「Array」「LBound」「UBound」「Split」の4つの関数についての使い方を解説した。
「LBound」関数は単体で使う場合はほとんどない。「UBound」関数と組み合わせて使うと、使い道は見えてくるのではないだろうか。
「Split」関数は、かなり使い道があると思う。データの受け渡しにカンマで区切ってデータを渡し、受け取った側で、「Split」関数を使って任意のセルにデータを表示させることができる。アイデア次第でいろいろな使い道があると思う。
次回も引き続き、関数について解説する予定だ。お楽しみに。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.