2022/07/23

二次元配列の切り出し

まず、二次元配列内の1つの要素を取り出すには「配列名(行インデックス番号 , 列インデックス番号)」とします。
図1のような配列Aが存在するときは、例えば「A(0,2)」とすることで、「き」という値が取り出せます。
配列から要素取り出し
図1


これを別な方法で、図1の下側の式のようにIndex関数を使い「WorksheetFunction.Index(A,1,3)」とすることで、同様に要素を取り出す事が出来ます。「A(0,2)」の場合は引数には「インデックス番号」を与えたのに対し、Index関数の場合は「WorksheetFunction.Index(配列名 ,行の番号 ,列の番号)」とします。行・列の番号とは、配列内で何番目の行・列かを表す番号です。

もともとワークシート上で使用するINDEX関数は2つに分かれています。第一引数に「セル範囲」を指定する場合の「セル範囲形式」と、「配列定数」や「テーブル名」を指定する場合の「配列形式」です。
同様にVBAで使用するワークシート関数のIndexメソッドの第一引数にも、「セル範囲」の他に「配列」等が指定できます。

この「WorksheetFunction.Indexメソッド」の行の番号・列の番号に「ゼロ」を指定することで、図2のように「列全体」「行全体」を取得することが可能です。
配列の行全体・列全体の取得が可
図2


但し、この配列の行・列の切り出しを行う時には、いくつかの注意点があります。
まず、二次元配列を「WorksheetFunction.Index(配列名 ,行の番号 ,0)」で「行の切り出し」を行った場合(図2の右上)には、切り出した配列は「一次元配列」となります。

一方、二次元配列を「WorksheetFunction.Index(配列名 ,0 ,列の番号)」で「列の切り出し」を行った場合には、「二次元配列」または「一次元配列」になります。
図2のように元の二次元配列が「複数行」の場合には、図2の右下のように「二次元配列」になるのですが、図3のように「単一行の二次元配列」から切り出した場合は、図3の右下のように「一次元配列」になるのです。
なお「行の切り出し」の場合には、複数行の二次元配列でも単一行の二次元配列でも、同じ一次元配列となります。
単一行の二次元配列の場合
図3


では複数行×単一列の場合は、図4のように「行の切り出し」は他と同じく「一次元配列」、「列の切り出し」は複数行ですので「二次元配列」となります。
単一列の二次元配列の場合
図4


最後に「番号・列番号ともゼロを指定した場合」を図5に示します。
行番号・列番号ともゼロを指定した場合
図5


行全体×列全体を切り出すのですから、元の二次元配列の全てが切り出され?ます。
但し、元の二次元配列のインデックスがゼロから始まっていたとしても、切り出された配列(図5の右側)の行・列のインデックス番号は「1からスタート」します。元がゼロ始まりでは無く、例えば2始まりであったとしても、切り出し後は「1からスタート」です。
このインデックス番号は、図2以降で全て同じです。

アプリ実例

1行1データの表を複数行1データとして印刷する
設備の稼働状態記録とデータ集計
複数の備品を同時予約可能な貸出台帳

なお「複数の備品を同時予約可能な貸出台帳」では列の切り出しをしてるのですが、取得した行数により配列の次元数が変わるために「次元数をFor~Nextを使って一次元配列に揃える」作業をしています。但し今考えれば、Transposeで行列転換をしてから行切り出しをした方が良かったかもしれません。