ワクワクV058回目配列完全解説4回目(2021-09-26)

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

ワクワクV058回目 2021-09-26 配列完全解説4回目 復習から始めます。次元数、次元ごとの下限/上限、次元ごとの要素数は混乱しやすので整理しておぼえてください。 pic.twitter.com/ecSI5TQcc8

2021-10-07 00:50:39
拡大
ほえほえ@スプシマン @hoehoe1234

次元数取得関数を使って次元ごとの要素数を取得します。演習なのでデバックプリントしていますが、共通関数として利用するのであれば関数IFの工夫が必要になります(お時間あれば考えてみてください)。 pic.twitter.com/KaV6diZWBz

2021-10-07 01:24:04
拡大
ほえほえ@スプシマン @hoehoe1234

第3回目で説明しましたとおり、関数を「データ変換」と捉えると、仮引数が入力、戻り値が出力となります。配列を扱う場合はこのどちらもが配列となります。特別の事情がなければ「仮引数は参照型バリアント」を使用してください。この理由の理解が関数IFで配列を使う上で重要です。

2021-10-07 01:26:40
ほえほえ@スプシマン @hoehoe1234

配列への挿入です。演習のため先頭限定挿入にしています。インプレース実装例です。配列はデータ構造から最後に追加は容易ですが途中に挿入するとデータの移動が必要になります。上書きしないように後ろからデータをずらしていきます。 pic.twitter.com/s8RrlampDy

2021-10-07 01:33:30
拡大
ほえほえ@スプシマン @hoehoe1234

スクショをわすれましたがもう一つの、インプレースでない、今までの成果を生かした簡易的な実装があります。 sub insert(a_arr, a_value) dim a: a = array(a_value) call extend(a, a_arr) insert = a とてもシンプルですね。参照型仮引数の利点を生かして配列をすり替えています。

2021-10-07 01:37:52
ほえほえ@スプシマン @hoehoe1234

呼び出し元が具象配列であっても、バリアントバインド配列であって実引数の配列はすり替えられます。実引数が具象配列の場合は仮引数は実引数へのポインタとして機能しますので書き換えができるですね。 pic.twitter.com/3c5cQ4MOSE

2021-10-07 02:01:07
拡大
ほえほえ@スプシマン @hoehoe1234

講義の範囲外になるので解説はしませんがご興味のある方は解析してみてください。たしかに配列の実態がすり替わっていますね。 pic.twitter.com/iGJS0l5T9Q

2021-10-07 02:04:09
拡大
ほえほえ@スプシマン @hoehoe1234

配列に限らず、VBAでは代入がオブジェクトか値かで構文が異なります。これはデフォルトプロパティの裏返し(副作用)だと思われるのですが、とにかく不便です。ですからこのような関数(プロパティ)を用意するとよいと思います。 pic.twitter.com/qMyXG7bxhk

2021-10-07 02:09:27
拡大
ほえほえ@スプシマン @hoehoe1234

一連のツイ全てに言えることですが、私が開発、発見したように書いているのは、言わばそのように表現したほうがわかりやすいからであり、実際はツイッター、サイト、書籍諸賢から得た知識であります。もちろんこのプロパティ方式も同様であります。

2021-10-07 02:11:09
ほえほえ@スプシマン @hoehoe1234

検証の通り、LetプロパティとSetプロパティのどちらが起動されるかは「構文」により決まります。set代入であればsetプロパティが、let代入であればletプロパティが起動されます。引数がオブジェクトか値かは関係ありません。この性質を生かしてオブジェクト/値設定用の関数(プロパティ)を作ります。 pic.twitter.com/IzfRzpxCPB

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

作成途中なので中途半端なコードですが、シートの範囲を一気に配列に取得し、配列を操作してサイドシートの範囲に戻す手法があります。cells(i,j)は相当に遅いのでこれが原因でマクロの実行に時間がかかる場合に有効です。 pic.twitter.com/Gj1tZCJD0N

2021-10-07 02:21:38
拡大
ほえほえ@スプシマン @hoehoe1234

範囲(レンジ)と2次元配列はとても似ています。レンジは実際には値を持たないのでcells(i,j)で取得すると都度エクセル切り替わると思われ、時間がかかります。配列に一気に取得すればそのようなオーバヘッドはなくなります。また、範囲と2次元配列の実質的な違いはfor eachの順番ぐらいでしょうか?

2021-10-07 02:23:54
ほえほえ@スプシマン @hoehoe1234

新関数の式(たとえばfilter関数)をVBAからセルに代入しスピルさせるにはformura2を使用します。しかし、配列をシート上に反映させるにはレンジの調整が必要になります。都度リサイズしてもいいですし、設定用の共通関数を作るのもよいでしょう。

2021-10-07 02:26:27
ほえほえ@スプシマン @hoehoe1234

演習16。Insert関数です。配列の先頭に要素を追加します。演習ですので簡単なインタフェースにしていますが、実際には任意の箇所に挿入できるように作成するとよいと思います。 pic.twitter.com/vRe3xDAYTC

2021-10-07 02:28:34
拡大
ほえほえ@スプシマン @hoehoe1234

ピンぼけしていますが、先頭に要素を追加する場合は次の要素から最後の要素まで一つづつ移動する必要がります。データモデルのイメージに沿ったループを書くと良いと思います。 pic.twitter.com/Sksw8MyH6q

2021-10-07 02:30:06
拡大
ほえほえ@スプシマン @hoehoe1234

これで配列完全解説4回目は終了です。まだまだ解説していないことが多いですね。配列はエクセルVBA全般に関わり、かつ、とても便利なので一気に、すべて理解してしまうのがお得だと思います。 おしまい。

2021-10-07 02:31:33