和風スパゲティのレシピ

日本語でコーディングするExcelVBA

配列(Array)

WorksheetFunctionに一次元配列を渡すと配列が欠損する

WorksheetFunction(以下WF)に渡せる一次元配列には上限があり、65,537を超える件数の一次元配列を正しく受け取れません。二次元配列やRangeオブジェクトを渡せば正しく動くので一次元配列のみお気を付けください。

Collectionを配列(Array)に変換する

Collectionを配列に変換する方法を解説します。標準機能にはないため、愚直に全要素を配列へ出力して変換します。CollectionはFor文で回すと非常に遅い性質があるため、配列への代入はForEach文で行ってください。

配列が空(初期状態・要素数が0)であるか判定する

配列が空であるかを判定する方法を解説します。空の配列には「要素代入前」「変数代入前」「動的配列ReDim前」「Split("")やArray()」「ParamArray省略時」の5パターンがあるため、それぞれ適した判定を用いてください。

動的配列が初期化(ReDim)されているか判定する

動的配列が初期化されているか判定する方法を解説します。Uboundがエラーになる仕様を利用してOn Error Resume Nextを用いる方法と、ビット演算を用いた(Not Not 配列)を判定する方法の2つがあります。

空の配列Array()の仕様と活用方法

Array()やParamArrayの省略時に「空の配列」が生成されます。この空の配列は要素数が0でFor/ForEachをノーエラースキップできるため、配列を受け取る関数と相性がよく、汎用関数の返り値に活用することができます。

「Collection&Dictionary」配布資料&配信アーカイブ

第5回 和風スパゲティ勉強会「Collection&Dictionary」の配布資料と配信アーカイブを共有します。前回の配列(Array)に続いてExcelVBA配列トリオを一挙に解説しました。復習にお役立てください。

ParamArrayが省略されたか判定する - IsMissing

引数の数を任意にできるParamArrayキーワードを使用した際、その配列が空=引数自体が省略されたかを判定するにはIsMissing関数を使用します。また空の配列はUboundが-1なので、こちらで判定も可能です。

「配列(Array)入門」配布資料&配信アーカイブ

第4回 和風スパゲティ勉強会「配列(Array)入門」の配布資料と配信アーカイブを共有します。配列をまだ使ったことがない方向けに配列の使いどころから基本コードまでを解説しました。復習にお役立てください。

8/25(月)21:00~ 第4回 和風スパゲティ勉強会「配列(Array)入門」

和風スパゲティ勉強会 第4回のテーマは「配列(Array)入門」ということで、ExcelVBAにおける配列の使い方を基本コードから徹底解説します!是非とも今回の講座で配列の基本をマスターしていってください!

Dictionary内の配列は要素の書き換えが出来ない

Dictionary内の配列は要素の書き換えが出来ません。Dictionary内の配列に代入した値が反映されない、Dictionary×配列によるクロス集計の結果が0になってしまうなどにお悩みの方はこの罠を疑ってください。

For Each文の中身を途中でいじるとどうなるか

今日はFor Eachステートメントで遊んでみようと思います。For Eachステートメントの変数を途中で変更したり、対象のCollectionを追加・削除して、それがForEachのループに影響するか試してみます。

Dictionaryの要素(Key/Item)をセルに出力する

Dictionaryの要素をシートに出力する方法を解説します。For Each文で1要素ずつセルへ出力していく方法と、要素を配列を介して一括でセル範囲に出力する方法の2つがあります。状況に応じて使い分けてください。

Dictionaryを用いたデータ集計 - Itemに配列版

Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに一次元配列を格納」パターンを紹介します。

配列を新規シートに出力して中身を確認する

配列をマクロに利用する際、中身を確認するのにひと手間かかるのですが、「新規シートに配列を出力する」マクロを用意することで対策ができます。フィルターを設置することでデバッグ作業の効率が上がります。

ジャグ配列(配列の配列)を二次元配列に変換する

配列の中に配列が入っている、いわゆるジャグ配列を、ただの二次元配列に変換するコードを紹介します。DictionaryのItemに配列を入れた際、Itemsで生成されるジャグ配列をセルに一括出力するなどに活用できます。

Transpose関数と愚直な配列代入の速度比較

Transpose関数と、同じ処理を愚直にFor文で代入する方法の速度比較を行いました。結果は愚直に代入した方が早かったですが、両方とも十分高速なため、よほどの規模を相手にしない限りは誤差の範囲と思ってよいようです。

0,1始まりでない配列(Array)をセルに出力する

例えば「インデックスが2~5の配列」を全然違う番地のセル範囲に吐き出してみても、特にはありません。両者の大きささえ一致していれば、配列インデックスとセル番地は一致している必要はありません。

Transposeは65,537番以降を無告知で破棄する

Transpose関数は配列の要素数が65,537を超えると要素をエラーもなく破棄してしまう仕様があります。配列をセルに出力したときなぜか#N/Aエラーになる現象などはこの仕様による不具合を疑ってください。

配列をセル範囲(Range)に一括出力する

配列をセル範囲に一括で出力する方法を紹介します。横方向に出力する場合はRange.Value=配列、縦方向に出力する場合はRange.Value=Transpose(配列)、二次元配列の場合はRange.Value=二次元配列で実行できます。

配列の要素数を取得する - Ubound・Lbound関数

配列の要素数を求める方法を解説します。最大要素番号を求めるUbound関数と、最小要素番号を求めるLbound関数を用いて、「Ubound - Lbound + 1」で求めます。二次元配列の場合は各次元を第2引数で指定します。

配列の開始番号を設定する - Option Base 1

配列を何番始まりにするかを設定するOption Base ステートメントを解説します。ただしこのステートメントは「配列を取得するほとんどの関数・メソッドに無視される」ため、あまり使用はおすすめできません。

クラスのメンバーに配列(Array)を定義する

クラスモジュールのメンバーに配列(Array)を定義する方法を解説します。Variant変数で定義することはできますが、そのままでは要素の書き換えが出来ないため、入出力用のPropertyプロシージャを作成して対応します。

IsArray(Range)は.Valueを省略してもTrue

IsArray関数は変数などが配列かを調べる関数ですが、Rangeオブジェクトに対してもTrueを返すという性質があります。IsArrayがTrueなのにUbound/Lboundがエラーになるなどにお悩みの方はこの仕様を疑ってください。

変数が配列(Array)かどうか判定する - IsArray関数

変数が配列か調べるには、IsArray関数を使用します。この関数は変数に限らず、関数の返り値や、配列を取得するプロパティも判定してくれます。一点、Rangeに対してもTrueになる点だけ注意して使ってください。

配列(Array)の次元数を取得する

配列の次元数を取得する方法を紹介します。GetDimensionのような一発で取得する組込関数、プロパティはありませんので、Uboundがエラーを出すまで次元数をループして上げてみるという方法で取得します。

3/18(土)20:00~ VBA勉強会「配列入門!Array&Collection&Dictionary欲張りセット」

3/18(土)20:00~ Zoom勉強会に登壇します。「配列入門!Array&Collection&Dictionary欲張りセット」と題し、まだ配列を使ったことがない方、CollectionやDictionaryに触れてみたい方、3つの特長と使い分けポイントを整理したい方に向けた講座を行います。

Dictionary.Keys(i) .Items(i)と書いてはいけない

DictionaryのKeys/Itemsメソッドは全key/itemを1次元配列にして返すメソッドです。つまりKeys(i)はKeysの「引数i」ではなく、Keysが返す配列の「添字i」ということです。Keys(i)を使用したコードは都度配列を生成するため非常に遅くなります。

Dimを省略していきなりReDimを書いてもいい?

動的配列において、要素数を設定/変更するときには、ReDimステートメントを使用しますが、実はこのときDimステートメントは省略できます。しかし「変数の宣言を強制」問題と同じデメリットがあるため、動的配列のDimはしっかり書きましょう。

セル範囲や複数セルから1次元配列を生成する

セル範囲などRangeオブジェクトを格納した1次元配列を生成する方法を解説します。すべてのセルをForEach文でArrayに格納していくコードです。空セルを除外するなど条件を付ける場合は、ReDimPreserveを利用して要素数を動的に処理します。