【VBAスタンダード対策】配列リバース(逆順入れ替え)の論理構造を攻略!
配列の要素を逆順に並べ替える処理は、アルゴリズムの基礎です。ReDim で確保した領域の中で、どのように値を入れ替えるのか。ループの範囲設定と、データ消失を防ぐための「一時変数」の役割を理解しましょう。
1. 問題:配列の要素を入れ替えるアルゴリズム
【 問題 】 5つの要素を持つ配列 myAry の中身を逆順(myAry(0)と(4)、myAry(1)と(3)を入れ替え)にしたい。空欄 ( A ) に入る最も適切なコードはどれでしょうか?
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まで回る)。・一時変数 tmp:
myAry(i) = myAry(n-i) とした瞬間に、元の myAry(i) は消えてしまいます。あらかじめ tmp に退避させておくのが、構造的なデータ保護の鉄則です。1. ここが試験に出る!: 試験では「tmpを使わずに直接代入しようとしていないか」「ループ回数が多すぎて元に戻っていないか」という論理ミスを突いてきます。UBound \ 2 という「半分で止める」感覚を身につけましょう。
2. エンジニアの視点: Java 17などの `Collections.reverse()` を使えば一発ですが、VBAで自作する場合は「メモリ上の値をどう移動させるか」を意識します。この「端と端を順番に入れ替えていく」構造は、並べ替え(ソート)アルゴリズムにも通ずる非常に重要な考え方です。
4. まとめ
「リバースは半分で止める。上書き前に退避する」。この2点を守るだけで、配列操作の正確性は格段に向上します。データの位置を構造的に把握し、制御できるようになれば、VBAエキスパートへの道もぐっと近づきます。