エンジニア転職10日目

こんにちは、コリーです。

10日目の今日は、

VBAの配列
VBAの復習

をやりました。

動的配列ReDim

配列には列挙体とユーザー定義型(構造体)があり、さらには静的配列と動的配列があります。

よく使われるものは動的配列のReDimということで、おさらいです。

Dimで宣言された空の配列は、要素数の再定義が可能です。その際に使うのが「ReDim」です。というか、動的配列を作るために空の配列を用意すると言ったほうが正しいかもしれません。

Dim Colli() As Long

ReDim [preserve] Colli (2)

→要素数が未定だった配列Colliは、ReDimによって要素数3の配列Colliに生まれ変わりました。このとき、preserveを省略すると、生まれ変わるタイミングでそれまでに格納していた要素が全て消えてしまいます。

「動的」は、「可変的」と言い換えられそうです。配列の要素数が、必要に応じて変化していくため、インデックスを把握するのが難しくなります。そこで使われるのが、LBound関数とUBound関数の2つです。
LBoundは、“最小のインデックス”、UBoundは、“最大のインデックス”を返してくれます。なので、インデックスの両端を利用したいときは、アクティブセルの最終行を取得したときと同じイメージで、

for i = LBound(Collie) To UBound(Collie)

Next

と挟みこめばいいことになります。

ちなみに、配列の要素数を減らすための関数はないそうで、もし減らしたいときは、

ReDim preserve Collie (UBound(Collie) - 1)

として、要素数を減らした配列を再定義するようです。

VBAの復習

Left + Instr

Range(“A1”) = “東京都(とうきょうと)”
name = Left(Range(“A1”), Instr(Range(“A1”), “(”) - 1)

→name = 東京都
Instrで“(”が文字列の何番目に当たるかをチェックした上で、“(”以前の文字列のみを出すため、Left関数でInstrから-1した数を使っている。

初期クリア

ws2.Range(“A2”).CurrentRegion.Offset(1, 1).ClearContents

→「ワークシート2のセルA2を含むアクティブセル(連続してデータが入っている)領域を指定し、そのエリアをそのサイズのまま1行1列ずつズラしたところに該当するセルの値を全て消す。」

VBAのこれまでにやってきたことは、解説を聞いて納得はできていたのですが、いざ自分の手を動かそうとするとなかなか知識が引き出せずもどかしい思いをしました。
また、自力で書いたコードが正確ではあるけれど汚い!特殊性が高く、汎用性に欠ける!回答例を見ると“ほへぇ”と唸ってしまいます。まだまだですね。

気持ちと身体を連動させるには日が掛かりそうです。

おわり