連載
» 2015年04月01日 05時00分 UPDATE

VBA/マクロ便利Tips:配列を使うのに役立つ4つの関数――Array、LBound、UBound、Splitの使い方

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、配列を返すArray、配列のインデックス番号の最小値/最大値を返すLBound/UBound、要素ごとに区切られた文字列から配列を作るSplitなどの使い方について解説。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回のTipsも関数の使い方について解説する。今回は、「Array」「LBound」「UBound」「Split」という「配列」に関する4つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。


配列が格納されたバリアント型の値を返すArray

 「Array」関数は、配列が格納されたバリアント型の値を返す関数だ。

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
リスト1 Array関数の配列の値をセル上に表示するコード

 まず、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列」に氏名が表示される。

ExcelVBATips_01.png 図1 「B列」に氏名が表示された

 「B列」にはあらかじめExcelのメニューから「書式」と「文字サイズ」を指定している。

指定された次元の配列で使える、インデックス番号の最小値を返すLBound関数

 「LBound」関数は、指定された次元の配列で使用できる、インデックス番号の最小値を返す。「LBound」は、「UBound」と組み合わせて、配列のサイズを調べるため使用するのが普通だ。インデックス番号の最大値を調べるには、「UBound」関数を使用する。「UBound」関数については後述する。

LBound関数の書式

LBound(arrayname,dimension)


 「arrayname」には、配列変数の名前を指定する。

 「dimension」は、配列の指定した次元で使うことのできるインデックス番号の最小値を返す。最初の次元なら「1」、2番目の次元なら「2」というように指定する。「dimension」を省略すると、「1」が使用される。

 「LBound」という新しいシートを追加し、その中に図2のように、データを表示させるセルと「実行」ボタンがあったとする。

ExcelVBA6Tips_03.png 図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 「LBound」関数で配列内の氏名を表示するコード

 まず、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の用に表示される。

ExcelVBA6Tips_04.png 図3 「LBound」関数を使って「氏名」を表示させた

指定された次元の配列で使える、インデックス番号の最大値を返すUBound関数

 「UBound」関数は、配列で指定したインデックス番号の最大値を返す関数だ。

UBound関数の書式

UBound(arrayname,dimension)


 「arryname」は必須項目で、配列変数の名前を指定する。

 「dimension」は省略可能で、インデックス番号の最大値を調べる、配列の整数を指定する。

 「UBound」関数は、「LBound」関数と組み合わせて、配列のサイズを調べるため使用されることが多い。

 コードサンプルや使い方については、「Array」「LBound」のサンプルを参照してほしい。

要素ごとに区切られた文字列から、ゼロベースの1次元配列を作成するSplit関数

 「Split」関数は、要素ごとに区切られた文字列から、ゼロベースの1次元配列を作成する関数だ。

Split関数の書式

Split(expression,delimiter,count,compare)


 「expression」は必須項目で、文字列と区切り文字を含んだ文字列式を指定する。

 「delimiter」は省略可能で、文字列の区切りを識別する文字を指定する。delimiterを省略すると、区切り文字に「スペース」が使用される。

 「count」は省略可能で、返す配列の要素数を指定する。

 「compare」は省略可能で、文字列式を評価するときに使用する文字列比較のモードを指定する。「バイナリモード」で比較する場合は「vbBinaryCompare」、「テキストモード」で比較する場合は、「vbTextCompare」を指定する。

 「Split」という新しいシートを追加し、その中に図4のように「カンマで区切られた文字」を入力するセルと、「分割表示」という値を入力するセルを作成し、「実行」ボタンを配置しておく。

ExcelVBA11Tips_05.png 図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
リスト3 「Split」関数を使って「カンマで区切られた文字」を「分割表示」するコード

 まず、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だ。

ExcelVBA11Tips_06.png 図5 カンマ区切りのデータを「Split」関数で、分割表示した

 「分割表示」列にカンマで区切られたデータが分割して表示された。

まとめ

 今回は「Array」「LBound」「UBound」「Split」の4つの関数についての使い方を解説した。

 「LBound」関数は単体で使う場合はほとんどない。「UBound」関数と組み合わせて使うと、使い道は見えてくるのではないだろうか。

 「Split」関数は、かなり使い道があると思う。データの受け渡しにカンマで区切ってデータを渡し、受け取った側で、「Split」関数を使って任意のセルにデータを表示させることができる。アイデア次第でいろいろな使い道があると思う。

 次回も引き続き、関数について解説する予定だ。お楽しみに。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

kuniyasu.jpg

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。