ワクワクV056回目配列完全解説2回目(2021-09-11)

1
ほえほえ@スプシマン @hoehoe1234

これを簡単にレンジと同じ出力順とするにはTranspose関数が使えます。Transposeすることにより配列の行列が入れ替えられますので結果としてレンジのfor eachと同じ出力順となります。これがbbbb3関数の出力からわかります。

2021-10-05 00:49:53
ほえほえ@スプシマン @hoehoe1234

配列の内部的な話を少しします。配列は前に書いたように①静的配列、②動的配列、③バリアントバインド配列の3つの種類があります。そしてそれぞれの種類に応じて初期設定が異なります。 pic.twitter.com/6nJXycjGEB

2021-10-05 00:55:47
拡大
ほえほえ@スプシマン @hoehoe1234

配列の実態はSAFEARRAYという構造体で管理されています。図中Aの部分です。Aの下のBの部分は配列の次元数に応じた下限と要素数を管理する可変長の部分があります。Cの部分はAの管理構造体からポイントされた実際のデータの存在する部分になります。 pic.twitter.com/jZfH4wCVkJ

2021-10-05 00:58:51
拡大
ほえほえ@スプシマン @hoehoe1234

以後「配列の実態」と言った場合にはこのA~Cの部分全体を指すことにします。管理構造体と表現した場合にはAとBを指すことにします。A、Bを個別に指定する場合は管理構造体固定部分、管理構造体可変部分という表現にします。この図からわかるように配列は実は実装はオブジェクトと同じ参照型です。

2021-10-05 01:01:12
ほえほえ@スプシマン @hoehoe1234

静的配列、動的配列、バリアントバインド配列のいづれもVBAから見える変数には配列の実態を指す参照(アドレス値)が入っています。32ビット環境でいえば静的配列、動的配列は4バイト長、バリアントバインド配列は16バイト長の変数から配列の実態を参照していることになります。

2021-10-05 01:02:52
ほえほえ@スプシマン @hoehoe1234

ただし、バリアント型は「型をバインドして使う変数」なので、バリアント変数の前半にある型部分には「配列である」とう情報が、後半の実際の値部分の4バイトに参照値(アドレス)が設定されています。それでは初期値を確認していきましょう。

2021-10-05 01:04:05
ほえほえ@スプシマン @hoehoe1234

静的配列では宣言時に図の赤い部分、すなわち配列の実態も割り当てられます。静的に割り当てますので後からredimで変更することはできません。動的配列とバリアントバインド配列は宣言時にはこの配列の実態が割り当てられていません。なので宣言時には下限/上限を取ることができません。 pic.twitter.com/IhgvvKWCWz

2021-10-05 01:16:45
拡大
ほえほえ@スプシマン @hoehoe1234

②の動的配列と③のバリアントバインド配列の違いは変数の型になります。②は配列と宣言されていますので実態を割り当てる(redim)前でもisArray(dyn_arr)はTrueとなりますが、③はバリアント変数が初期化されていないのでFalseとなります。

2021-10-05 01:19:44
ほえほえ@スプシマン @hoehoe1234

これら3つの配列の種類の違いをそのデータモデルのイメージを持っておくと、配列に対する組み込み関数の挙動を理解する助けになると思います。一見わかりにくい配列と配列用の組み込み関数の挙動を理解する助けになると思います。

2021-10-05 01:33:55
ほえほえ@スプシマン @hoehoe1234

個別に図示するとこのようになります。3つの種類の配列においてそれぞれ初期状態の違いがわかると思います。 pic.twitter.com/gErXMi9BAc

2021-10-05 01:36:06
拡大
ほえほえ@スプシマン @hoehoe1234

既に解答は投稿していますが演習8です。配列の情報表示演習です。 pic.twitter.com/u2we6xHI6i

2021-10-05 01:37:12
拡大
ほえほえ@スプシマン @hoehoe1234

Jag配列と二次元配列のイメージです。Jag配列は1次元配列で要素も配列になっています。双方の配列に1~8の数字を入れてあります。Jag配列の利点は「一次元配列として扱える」というところになります。また、各要素である配列の要素数を変えることもできます。列要素配列を取り出すのも簡単です。 pic.twitter.com/ag824avhXI

2021-10-05 02:23:12
拡大
ほえほえ@スプシマン @hoehoe1234

Jag配列が1次元配列であることのメリットは、たとえばソートなどの1次元配列を扱うロジックがそのまま使えるところです。2次元配列のソート問題はSortBy関数で根本的に解決しましたので、以前比べJag配列の重要度は減ったとは思いますがデータ構造の引き出しは多いほうがよいですね。

2021-10-05 02:25:53
ほえほえ@スプシマン @hoehoe1234

演習11です。evaluate関数とそのショートカットである鉤括弧をつかって配列定数を作る演習です。この手法では数値と文字列の配列しか作成できませんが(あってますか?)、テスト用に配列を作る場合に重宝します。また、鉤括弧記法を利用してSortBy関数の基準配列を作成したりもできます。 pic.twitter.com/fZwiZ6kpyd

2021-10-05 02:29:18
拡大
ほえほえ@スプシマン @hoehoe1234

記法は ①全体を鉤括弧([...])で囲む ②内側に配列定数式({....})を書く ③各要素は、カンマで区切ると横、セミコロンで区切ると縦となります。いずれも下限1となります。 図中、それぞれ ①1次元配列(3要素) ②2次元配列(3行1列) ③2次元配列(2行3列) となります。

2021-10-05 02:33:06
ほえほえ@スプシマン @hoehoe1234

スピルと新関数の登場により配列数式の重要性が高まっているように思います。スピルすることによりシート上で容易に結果が確かめられます(視認性の向上)。 今後はVBAを含めて配列の理解と使いこなしがますます重要になってくるように思います。 おしまい。

2021-10-05 02:35:28
ほえほえ@スプシマン @hoehoe1234

スティーブプログラミング塾。エクセルとグーグルスプレッドシートを利用したシステム構築および実践的な講義を提案しています。企業のグループ研修と新人研修などに最適です。オンライン集団研修は1時間1万円で請け負っております(MAX15人程度)。

https://t.co/Nfsb8OZbG7