忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】動的配列を定義する「ReDim」の基本構造を攻略!

サイズが決まっていない「動的配列」は、そのままでは使えません。ReDim ステートメントを使ってメモリ上に領域を確保する際のルールと、実行時に中身がどう変化するかという構造的特徴を確認しましょう。

1. 問題:ReDimによる配列の再定義と初期化

【 問題 】 下記のコードを実行した際、最後のメッセージボックスで表示される値として正しいものはどれでしょうか?

Sub ArrayTest()
    Dim myAry() As Integer ' --- (1) 動的配列の宣言
    
    ReDim myAry(2) ' --- (2) サイズを3つ(0-2)に決定
    myAry(0) = 10
    myAry(1) = 20
    
    ReDim myAry(5) ' --- (3) サイズを6つ(0-5)に変更
    
    MsgBox myAry(0)
End Sub

① 0
② 10
③ 20
④ エラー(実行時エラー)が発生する

2. 正解:ReDimによる初期化に関する正解

正解: ① 0

3. 解説:ReDimは「箱の作り直し」である

動的配列を使う上で、ReDim がメモリに対してどのような操作を行っているか、その構造的な動きを理解することが重要です。

[ ReDimの構造的プロセス ]

1. 宣言時:Dim myAry()
「動的配列を使うよ」という名前だけの登録です。中身は空っぽで、このまま myAry(0) = 1 と書くとエラーになります。

2. 初回ReDim:ReDim myAry(2)
ここで初めてメモリ上に 0, 1, 2 の3つの箱が作られます。

3. 二度目のReDim:ReDim myAry(5)
【重要】 単なる ReDim は、既存の配列を一度破棄し、新しいサイズの配列をゼロから作り直します。
そのため、それまでに代入していた「10」や「20」といったデータはすべて消え去り、数値型なら「0」にリセット(初期化)されます。

1. ここが試験に出る!: 試験では「ReDimをすると既存のデータはどうなるか?」という点がストレートに問われます。「作り直し = 初期化」という構造を即座にイメージできるようにしましょう。
2. エンジニアの視点: 「とりあえず大きく確保し直せばいいだろう」という安易な ReDim は、データ消失のバグを生みます。もしデータを残したいなら、次の次の問題で扱う Preserve キーワードが必要になりますが、まずは「ReDim = リセット」という基本構造を叩き込むのが理系NEOな学習順序です。


4. まとめ

「ReDimは、新しい箱への完全な取り替え」。このルールがあるからこそ、配列のサイズを自由に変えられる柔軟性が生まれます。データが消えるというリスクを正しく把握して初めて、動的配列という強力な武器を使いこなせるようになるのです。


PR

【BI技術者認定試験対策】バラバラに受け継がれる!「独立の法則」を攻略

メンデルの法則の3つ目。異なる形質(例えば「種子の形」と「種子の色」)が、お互いに干渉することなく、独立して次世代に伝わる仕組みを整理しましょう。

1. 問題:異なる形質の遺伝

【 問題 】 メンデルの法則のうち、2組以上の対立形質に注目した際、それぞれの対立遺伝子が互いに影響を及ぼすことなく、独立して配偶子の中に分配されるという法則を何と呼ぶでしょうか?

① 優性の法則(顕性の法則)   ② 分離の法則   ③ 独立の法則   ④ 連鎖の法則

2. 正解:遺伝の基本原則に関する正解

正解: ③ 独立の法則

3. 解説:形質の組み合わせは自由自在

「丸い種子」か「しわの種子」かという情報と、「黄色」か「緑色」かという情報は、別々のサイコロを振るように独立して決まります。

[ 独立の法則のポイント ]
前提条件:それぞれの遺伝子が「異なる染色体」の上にある場合に成り立ちます。
表現型の比:2つの形質についてヘテロ同士(AaBb × AaBb)を交配させると、表現型は 9:3:3:1 の比率で現れます。
例外:もし2つの遺伝子が同じ染色体上の近い場所にあると、一緒に動いてしまう「連鎖」という現象が起こり、独立の法則は成り立ちません。

1. 試験のポイント: メンデルの三法則(優性・分離・独立)をセットで覚えましょう。「分離の法則」は1組の対立遺伝子のペアが分かれること、「独立の法則」は2組以上のペアが互いに干渉しないことを指します。
2. バイオインフォの視点: 実際のゲノム上では、全ての遺伝子が独立しているわけではなく、多くの遺伝子が「連鎖不平衡」という状態で存在しています。特定の病気のリスク遺伝子を探す際、どの範囲の遺伝子がセット(ハプロタイプ)として遺伝しやすいかを統計的に解析するのは、バイオインフォマティクスの非常に重要な手法です。


4. まとめ

「別々の特徴は独立して遺伝する=独立の法則」です。この法則があるおかげで、親の様々な特徴がシャッフルされ、多様な個性を持つ子供たちが生まれてくるのですね!


【VBAスタンダード対策】Split関数と配列ループの構造を攻略!

文字列を特定の文字で切り分ける Split 関数。この関数が生成する配列には、独自の構造ルールがあります。上限と下限を関数で動的に取得する、安全なループ処理の書き方をマスターしましょう。

1. 問題:Split関数が生成する配列のループ処理

【 問題 】 カンマ区切りの文字列を Split 関数で分割し、その全要素をメッセージボックスで表示したい。空欄 ( A ) に入る最も適切なコードはどれでしょうか?

Sub Sample()
    Dim buf As String
    Dim myAry As Variant
    Dim i As Long

    buf = "VBA,Standard,Exam"
    myAry = Split(buf, ",")

    For i = ( A )
        MsgBox myAry(i)
    Next i
End Sub

① 1 To 3
② 0 To 2
③ LBound(myAry) To UBound(myAry)
④ 1 To UBound(myAry)

2. 正解:配列の境界を取得する関数に関する正解

正解: ③ LBound(myAry) To UBound(myAry)

3. 解説:Split関数の「絶対ルール」と動的処理

Split 関数を使用する際、実務や試験で絶対に外せない構造的ポイントが2つあります。

[ Split関数の構造的特徴 ]

1. 下限(LBound)は必ず「0」
たとえ Option Base 1 を設定していても、Split 関数が作る配列の下限は強制的に 0 になります。そのため、開始を 1 にしてしまうと最初の要素(VBA)を読み飛ばすことになります。

2. 要素数はデータによって変わる
分割元が "A,B,C" なら上限は 2、"A,B" なら上限は 1 になります。上限を「3」などの定数で固定すると、データが少ない時に「インデックスが範囲外です」というエラーを招きます。

★ 理系NEOな解決策:
LBound(配列):最小の添字(Splitなら常に0)を返す
UBound(配列):最大の添字を返す
このペアを使うことで、データの個数が変わっても**構造的にエラーが出ないループ**が完成します。

1. ここが試験に出る!: スタンダード試験では、Split の戻り値を受け取る変数が Variant 型、または String()(動的配列)であること、そしてループの開始が 0(またはLBound)になっているかどうかが厳しくチェックされます。
2. エンジニアの視点: Java 17などの `String.split()` は配列オブジェクトを返しますが、VBAの Split も同様に「メモリ上に一時的な配列構造」を構築します。個数を数える `Count` プロパティが存在しないため、UBound を使うのがVBA流のサイズ確認構造です。


4. まとめ

「Splitの出口は常に0から。サイズはUBoundに聞く」。この構造を徹底すれば、どんなに長いCSVデータが来ても、一文字たりとも漏らさず処理できます。データの「始まり」と「終わり」を関数に判定させる柔軟なコードこそ、堅牢なマクロの基盤となるのです。


【VBAスタンダード対策】下限と上限を指定する配列宣言の構造を攻略!

VBAでは Dim 配列名(下限 To 上限) という形式で、インデックスの開始番号と終了番号を自由に指定できます。この宣言方法を使うことで、「0番目問題」を回避し、データの構造を直感的に表現できるようになります。

1. 問題:指定された範囲から要素数を導き出す

【 問題 】 下記のように宣言された配列 Score に格納できる「要素の数」として正しいものはどれでしょうか?

Dim Score(10 To 20) As Integer

① 10個
② 11個
③ 20個
④ 21個

2. 正解:要素数の計算に関する正解

正解: ② 11個

3. 解説:「上限 - 下限 + 1」の公式

配列の要素数を数えるとき、単純に「20 - 10 = 10個」と考えてしまうのが最も多いミスです。開始番号(下限)もカウントに含める必要があるため、構造的に必ず 「+ 1」 を忘れてはいけません。

[ 配列のインデックス構造 ]

Dim Score(10 To 20)
・Score(10) ← 1つ目
・Score(11) ← 2つ目
...
・Score(20) ← 11つ目

★ 理系NEOな計算式:
要素数 = 上限(20) - 下限(10) + 1 = 11

[ この宣言構造のメリット ]
意味の明確化:例えば出席番号が1番から始まるなら (1 To 30) と書くことで、プログラムと現実の数字を一致させ、0番目の誤使用を防げます。
オフセットの排除:他言語のように「n番目のデータは n-1 のインデックス」という引き算を頭の中でする必要がなくなり、可読性が劇的に向上します。

1. ここが試験に出る!: 試験では LBound (下限を返す関数) と UBound (上限を返す関数) を使ったループ For i = LBound(Score) To UBound(Score) が頻出します。このループが「何回回るか」を答える際、この +1 の構造が鍵を握ります。
2. エンジニアの視点: Java 17などの現代的な言語では下限は常に0と決まっていますが、VBAのように「下限を自由に決められる」構造は、古い会計システムや科学技術計算のロジックを移植する際に非常に強力な武器になります。ただし、混乱を避けるためにプロジェクト内では「常に0から」か「常に1から」か、ルールを統一しておくのがプロの設計です。


4. まとめ

「配列のサイズは、引き算に1を足したもの」。このシンプルな構造ルールを脳内にインストールすれば、どんな範囲指定が来ても迷うことはありません。下限と上限を明示する To の使いこなしこそ、配列操作の精度を高める「構造化プログラミング」への第一歩なのです。


【VBAスタンダード対策】配列の要素数「カッコの中の数字」の正体を攻略!

配列を Dim XX(3) と宣言したとき、使える箱は3つだと思っていませんか? 実はVBAの標準的な構造では、指定した数字は「最大インデックス(添字)」を意味します。ここにある「+1」の法則を正しく理解しましょう。

1. 問題:Dim XX(3) で作成される要素の範囲

【 問題 】 Dim XX(3) As Integer と宣言した場合、この配列で使用可能な要素(インデックス)の組み合わせとして正しいものはどれでしょうか?(※Option Baseなどの特殊な設定はしていないものとします)

① XX(1), XX(2), XX(3) の計3つ
② XX(0), XX(1), XX(2) の計3つ
③ XX(0), XX(1), XX(2), XX(3) の計4つ
④ XX(0), XX(1), XX(2), XX(3), XX(4) の計5つ

2. 正解:配列の要素範囲に関する正解

正解: ③ XX(0), XX(1), XX(2), XX(3) の計4つ

3. 解説:カッコ内の数字は「上限値」を指す

VBAの配列宣言 Dim XX(n) において、カッコ内の数字 n は要素数ではなく、使用可能な最大インデックスを構造的に指定しています。

[ 配列の物理構造イメージ ]

Dim XX(3) と書いた場合:
箱 [0] : XX(0)
箱 [1] : XX(1)
箱 [2] : XX(2)
箱 [3] : XX(3) <-- ここまで使える!

結果として、全部で 4つ の要素が作られます。

[ なぜ勘違いが起きるのか? ]
他の言語との違い:Java 17やC言語では int a[3] は「3つの要素(0, 1, 2)」を作りますが、VBAは「上限が3(0, 1, 2, 3)」を作るという独自の構造を持っています。
1から始めたい場合:もし XX(1) から XX(3) の3つだけを使いたいなら、構造的に Dim XX(1 To 3) と宣言するのが「理系NEO」な安全な書き方です。

1. ここが試験に出る!: 試験では For i = 0 To UBound(XX) のようなループが出た際、要素がいくつあるかを正確にカウントできるかが問われます。UBound 関数は上限値(この場合は3)を返すため、ループは4回回ることになります。
2. エンジニアの視点: 「0番目を使うか使わないか」はVBA開発者の永遠のテーマですが、配列のサイズを求める際は 上限 - 下限 + 1 という計算式が常に成立します。この「+1」を忘れないことが、インデックス範囲外エラー(Runtime Error 9)を防ぐための鉄則です。


4. まとめ

「カッコの中の数字は、最後に使える番号」。この構造を理解していれば、配列の要素数を数え間違えることはありません。細胞分裂の回数と細胞の数が n+1 になる関係のように、VBAの配列もまた、指定した番号までの道筋の中に、常に「0」という原点を含んでいるのです。