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

【VBAスタンダード対策】配列リバース(逆順入れ替え)の論理構造を攻略!

配列の要素を逆順に並べ替える処理は、アルゴリズムの基礎です。ReDim で確保した領域の中で、どのように値を入れ替えるのか。ループの範囲設定と、データ消失を防ぐための「一時変数」の役割を理解しましょう。

1. 問題:配列の要素を入れ替えるアルゴリズム

【 問題 】 5つの要素を持つ配列 myAry の中身を逆順(myAry(0)と(4)、myAry(1)と(3)を入れ替え)にしたい。空欄 ( A ) に入る最も適切なコードはどれでしょうか?

Sub ReverseArray()
    Dim myAry() As Variant
    Dim tmp As Variant
    Dim i As Long, n As Long

    myAry = Array("A", "B", "C", "D", "E") '要素数5(0 to 4)
    n = UBound(myAry)

    For i = 0 To ( A )
        tmp = myAry(i)
        myAry(i) = myAry(n - i)
        myAry(n - i) = tmp
    Next i
End Sub

① n
② n - 1
③ n \ 2
④ n / 2

2. 正解:ループ回数の決定に関する正解

正解: ③ n \ 2

3. 解説:入れ替え処理の「折り返し地点」

配列を逆順にする際、最も間違いやすいのが「ループを最後まで(nまで)回してしまう」ことです。構造的な仕組みを図解で確認しましょう。

[ 入れ替えの構造図 ]

対象:(0) (1) (2) (3) (4) ※n=4

1回目(i=0):(0) と (4-0=4) を入れ替え
2回目(i=1):(1) と (4-1=3) を入れ替え
ここで終了!

もし、さらに i=3 まで回すと、(3)と(1)を再び入れ替えてしまい、「元に戻ってしまう」 という現象が起きます。

★ 理系NEOなポイント:
n \ 2:整数除算演算子 \ を使い、中心で止めます(4 \ 2 = 2。i=0から2まで回る)。
一時変数 tmpmyAry(i) = myAry(n-i) とした瞬間に、元の myAry(i) は消えてしまいます。あらかじめ tmp に退避させておくのが、構造的なデータ保護の鉄則です。

1. ここが試験に出る!: 試験では「tmpを使わずに直接代入しようとしていないか」「ループ回数が多すぎて元に戻っていないか」という論理ミスを突いてきます。UBound \ 2 という「半分で止める」感覚を身につけましょう。
2. エンジニアの視点: Java 17などの `Collections.reverse()` を使えば一発ですが、VBAで自作する場合は「メモリ上の値をどう移動させるか」を意識します。この「端と端を順番に入れ替えていく」構造は、並べ替え(ソート)アルゴリズムにも通ずる非常に重要な考え方です。


4. まとめ

「リバースは半分で止める。上書き前に退避する」。この2点を守るだけで、配列操作の正確性は格段に向上します。データの位置を構造的に把握し、制御できるようになれば、VBAエキスパートへの道もぐっと近づきます。


PR

【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」という原点を含んでいるのです。


【VBAスタンダード対策】配列の多様な宣言構造を攻略!

VBAの配列には、宣言時に要素数を固定する「静的配列」と、後からサイズを変更できる「動的配列」があります。それぞれの宣言文法と、インデックス(添字)の構造的な決まりを整理しましょう。

1. 問題:配列の宣言方法と要素数の関係

【 問題 】 下記のA~Dの宣言のうち、VBAの文法として誤っているもの、または実行時にエラーとなる可能性が高い構造はどれでしょうか?

A: Dim List(5) As String
B: Dim List() As Integer
C: Dim List(1 To 10) As Double
D: Dim List(X) As Variant ' ※Xは変数とする

① A:要素数が5つの静的配列として宣言されている
② B:後でReDimが必要な動的配列として正しく宣言されている
③ C:添字の下限を1、上限を10として正しく宣言されている
④ D:宣言時に変数を使ってサイズを指定することはできない

2. 正解:配列宣言の制約に関する正解

正解: ④ D(および ① の解釈)

3. 解説:静的と動的、それぞれの宣言ルール

VBAの配列構造において、最も注意すべきは「Dimによる宣言時に変数を使えるか」という点です。

[ 配列宣言の構造ルール図 ]

■ A:静的配列 Dim List(5)
実は要素数は 6つ です(0,1,2,3,4,5)。試験では「5」と書くと0番目を含めて6つになる構造がよく問われます。

■ B:動的配列 Dim List()
カッコの中を空にするのが動的配列の構造です。この時点ではメモリは確保されず、後で ReDim を使ってサイズを決定します。

■ C:範囲指定 Dim List(1 To 10)
「1から始まる」とはっきり指定する構造です。Option Base 1 を使わずに下限を固定できるため、実務で推奨される書き方です。

■ D:変数による指定 Dim List(X)
【重要】 Dimステートメントで要素数を指定する際、変数を使うことはできません。変数の値に応じてサイズを決めたい場合は、一度「B」の形で宣言し、その後 ReDim List(X) とする必要があります。

1. ここが試験に出る!: スタンダード試験では「静的配列の宣言に変数を使っていないか」「動的配列なのにカッコの中に数字を書いていないか」といった、DimとReDimの使い分けが厳格に問われます。
2. エンジニアの視点: Java 17などの言語では `int[] list = new int[x];` のように変数での初期化が当たり前ですが、VBAは「コンパイル時にサイズが決まるもの(Dim)」と「実行時に決まるもの(ReDim)」を構造的に区別しています。この「理系NEO」な厳密さを理解すると、メモリ管理のミスが減りますね。


4. まとめ

「Dimで変数は不可、サイズ変更はReDim」。この配列宣言のルールを守ることで、実行時のエラー(「定数式が必要です」など)を未然に防ぐことができます。配列もまた、宣言という「設計図」を正しく書くことで、初めて大量のデータを安全に格納する器として機能するのです。