コード生成グループ「動的コード生成」の解説
- yuji fukami
- 10月18日
- 読了時間: 3分
概要
書籍「Excel VBA開発を超効率化するプログラミングテクニック」の特典であるIkiKaiso2.xlamのリボン登録マクロの解説のための特設ページです。
出版社の書籍のページ⇒https://gihyo.jp/book/2024/978-4-297-14023-6
リボン登録マクロ全体解説ページ⇒https://www.softex-celware.com/post/ikikaiso2
本ページではIkiKaiso2.xlamの「コード生成」グループの「動的コード生成」ボタンの使い方を解説します。

解説
用途
シート上の表範囲を自動的に取得して二次元配列または一次元配列として返すコードを自動生成する
使い方(二次元配列の取得コード自動生成)
例えば次のような表がシート上に入力してあるとして、ヘッダーを除いたセル範囲を二次元配列として取得したいとします。

その取得用のコードは「動的コード生成」ボタンで次の動画ように自動生成します。
実際に生成されたコードは次のようなものです。

シート内の表を二次元配列として取得するコードは1つのプロシージャとして構築して次のようになります。

別記事の「基準セルから表範囲セルを自動取得する(GetCellArea)」でも説明していますが、列数は基本的に固定するので、GetCellAreaの第2引数のColCountは今回の表をもとにすれば8と指定します。
GetCellArea → https://www.softex-celware.com/post/getcellarea

ちゃんと二次元配列が取得できたかどうかをDPAを利用して、「Get_名簿」の中身を表示すると次のようになります。ちゃんと二次元配列が取得できているのが確認できます。
DPAは配列をイミディエイトウィンドウに見やすく表示するプロシージャで次の記事で解説しています。

ちなみに、別のボタンの「Enum作成」を利用してヘッダーの項目名をEnumで定義しておいて、指定する列数で利用するとより可読性の高いコードにすることができます。

上記の様に筆者は普段Enumの各要素に「M01_番号」の「M01」のように番号を打って、入力候補で順番通りに並ぶようにしていますが、番号を振らない場合は次のようになります。ヘッダーの項目数(列数)が多い(だいたい20以上)の場合はEnumの要素に番号を振ったほうが入力候補で探す手間が省けますが、項目数が少ない場合は番号を振らないほうがメリットが多くなります。使い分けです。

使い方(一次元配列の取得コード自動生成)
次に一次元配列の取得の場合です。
「動的コード生成」は途中で表示されるメッセージで「はい」なら二次元配列ですが、「いいえ」なら一次元配列の取得に分岐します。
一次元配列は次のような図のように縦一列の場合です。

二次元配列同様に動画で動きを見てみると次のようになります。
手順はほぼ二次元配列の説明と被るので割愛しますが、生成されるコードについて解説します。
実際に上記例で作成されたコードは次のようなものです。
解説も加えています。

ちなみにDPAを利用して中身を確認するとちゃんとセル範囲が一次元配列として取得できているのが確認できます。

二次元配列の場合はGetCellAreaの第2引数のColCountはヘッダーの項目数(列数)を指定するように上記で説明しましたが、一次元配列の場合は列数は1で最初から固定しています。
次にGetArray2DFromCellを利用している理由です。
通常セル範囲から配列取得は「Rangeオブジェクト.Valueプロパティ」で行いますが、下記の様に取得範囲の行数が1行しかない場合は単一の値になってしまいます。これを回避する処理をGetArray2DFromCellで行っています。
・GetArray2DFromCell → https://www.softex-celware.com/post/getarray2dfromcell

次にTransposeN1toArray1Dを使っている部分ですが、こちらは「Rangeオブジェクト.Valueプロパティ」で取得した二次元配列を一次元配列に変換している処理です。
TransposeN1toArray1D → https://www.softex-celware.com/post/transposen1toarray1d
ちなみに、縦一列の(N x 1)の二次元配列はWorksheetFunction.Transpose関数で簡単に一次元配列に変換できますが、様々な欠陥があるので利用せずに専用の汎用プロシージャとしてTransposeN1toArray1Dを使用するようにしています。
Transpose関数の欠点(Excel VBA)→ https://www.softex-celware.com/post/transpose-issues-excel-vba



コメント