Home » エクセルマクロ・Excel VBAの使い方 » 配列 » セル範囲から配列作成時の要素数

セル範囲から配列作成時の要素数

動作検証バージョン:Windows版Excel(バージョン1810 ビルド11001.20074)

「vba variant 2次元配列 要素数」
「excel vba variant 配列 要素数」
といった検索キーワードで、このサイト『インストラクターのネタ帳』へアクセスがあることに気付きました。

Excel VBAではVariant型の変数に、セル範囲の値を代入すると2次元配列を作れます。この2次元配列の、要素数を取得するにはどうすればいいのか、探していらしたのでしょうか。

セル範囲から作成した2次元配列の中身を確認しよう

セル範囲から作成した2次元配列の中身を、まずは確認しておきましょう。

A1:E2セルに何らかのデータを入力して、

以下のSubプロシージャを実行してください。


Sub セル範囲から作成した2次元配列の中身を確認する()
 Dim arr() As Variant
 arr() = Range("A1:E2").Value
 Stop
End Sub

Stopステートメントで中断モードになりますから、メニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示して、変数arrの中身を確認しましょう。

変数名の前に表示される[+]をクリックして展開すると、下図のように配列変数の各要素に格納されているデータを確認することができます。

このとき「型」欄の「Variant(1 to 2, 1 to 5)」が、配列のインデックスの最小値と最大値を表しています。

Variant(1 to 2, 1 to 5) の「1 to 2」が1次元目のインデックス最小値と最大値で、
Variant(1 to 2, 1 to 5) の「1 to 5」が2次元目のインデックス最小値と最大値です。

セル範囲から作成した配列のインデックスは「1」から始まる

Variant型変数に、セル範囲の値を代入することで作られる配列のインデックスは、必ず「1」から始まります。

「Option Base 0」を記述している場合でも、下図のとおりインデックスの最小値は「1」であることを確認できます。

セル範囲から配列作成時の要素数はUBoundで取得できる

通常VBAで配列の要素数は「UBound(配列) - LBound(配列) + 1」で、取得できますが、Variant型変数にセル範囲の値を代入して作られる配列のインデックスは必ず「1」から始まるのですから、「UBound(配列) - 1 + 1」となり、要素数はUBound関数で取得できるインデックスの最大値と同じです。


Sub セル範囲から作成した2次元配列の要素数を確認する()
 Dim arr() As Variant
 arr() = Range("A1:E2").Value

 Dim n1 As Long, n2 As Long
 n1 = UBound(arr(), 1)
 n2 = UBound(arr(), 2)
 Stop
End Sub

上記のSubプロシージャを実行してローカルウィンドウを表示すれば、

変数n1には配列変数arrの1次元目の要素数、
  n1 = UBound(arr(), 1)
変数n2には配列変数arrの2次元目の要素数が、
  n2 = UBound(arr(), 2)
それぞれ格納されていることを確認できます。

イミディエイトウィンドウよりローカルウィンドウ

VBEのローカルウィンドウを紹介しているExcel VBAの入門書籍は、決して多数派ではないように私には思えます。一方ローカルウィンドウには触れていないけれど、イミディエイトウィンドウを紹介しているExcel VBA入門書は割とあると感じています。

しかし以上のような確認を、イミディエイトウィンドウで行おうとしたら、自分で何らかのコードを書くしかありません。

ローカルウィンドウの場合、追加のコードを書かなくても、上述のとおり確認できますから、拙著『いちばんやさしいExcel VBAの教本』では、特に初心者向けのデバッグ機能としておすすめしています。

最終更新日時:2018-11-16 00:19

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » セル範囲から配列作成時の要素数

TrackBack:0

TrackBack URL

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » セル範囲から配列作成時の要素数

「配列」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.