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

【VBAスタンダード対策】Select Caseによる「数値範囲」の分岐構造を攻略!

複数の条件で綺麗に分岐させたいときに便利な Select Case。単一の値だけでなく、「〇〜〇の間」や「〇より大きい」といった数値の範囲を判定する際の、VBA特有の構文構造と判定の優先順位をマスターしましょう。

1. 問題:数値範囲の指定と境界値の判定

【 問題 】 下記のコードを実行して JudgeScore(10) を呼び出した際、メッセージボックスに表示される文字列として正しいものはどれでしょうか?

Sub Test()
    Call JudgeScore(10)
End Sub

Sub JudgeScore(score As Integer)
    Select Case score
        Case 1 To 5
            MsgBox "ランクC"
        Case 5 To 10
            MsgBox "ランクB"
        Case Is > 10
            MsgBox "ランクA"
        Case Else
            MsgBox "対象外"
    End Select
End Sub

① 「ランクB」が表示される
② 「ランクA」が表示される
③ 「ランクB」が表示された後、「ランクA」も表示される
④ 構文エラー(コンパイルエラー)が発生する

2. 正解:Select Case の範囲判定に関する正解

正解: ① 「ランクB」が表示される

3. 解説:「上から順に、最初に一致した場所だけ」動く構造

Select Case の範囲指定には、文法ルールと処理の流れ(フロー)に関する重要な構造的特徴が3つあります。

[ Select Case の構造ルール ]

1. 〇〜〇の範囲は「To」を使う
Case 1 To 5 のように記述します。このとき、開始値と終了値(1と5)のどちらも条件に含まれる(以下・以上)という構造になります。そのため、5 To 10 には「10」もピッタリ含まれます。

2. 不等号を使うときは「Is」が必要
「10より大きい」を表現する場合、単に Case > 10 と書くとエラーになります。必ず Is キーワードを補って Case Is > 10 と書くのがVBAの絶対ルールです。(※Isは検査対象の変数を指す身代わり構造です)

3. 最初に一致した Case だけが実行される
【超重要】 もし JudgeScore(5) を呼び出した場合、5は「1 To 5」と「5 To 10」の両方に合致してしまいますが、VBAは上から順に判定し、最初に一致した段階でSelect Case全体を脱出する構造になっています(結果はランクCになります)。

ここが試験に出る!: スタンダード試験では、不等号を使うときに Is を書き忘れていないか、また Case 1, 2, 3 のような「カンマ区切り(いずれかに一致)」と To による「範囲指定」が正しく使い分けられているかが厳しく問われます。


4. まとめ

「範囲はTo、不等号はIs、一致したら即脱出」。この3つの構造ルールを頭に入れておけば、複雑な多方向分岐もすっきりと読みやすいマクロに落とし込むことができます。If文の連打に頼らない、スマートな条件分岐を構築しましょう。


PR

【VBAスタンダード対策】Exit For 脱出時の「カウンタ変数」の値を構造的に見抜く!

ループ処理を途中で強制終了する Exit For。しかし、途中で脱出した瞬間、ループの回数を数えていた「カウンタ変数」の中身がいくつになっているか、正確に把握できていますか? 試験で狙われる変数の内部構造を解き明かします。

1. 問題:Exit For を実行した直後の変数の中身

【 問題 】 下記のコードを実行して LoopTest プロシージャを呼び出した際、メッセージボックスに表示される数値はいくつでしょうか?

Sub LoopTest()
    Dim i As Integer

    For i = 1 To 10
        If i = 5 Then
            Exit For
        End If
    Next i

    MsgBox i
End Sub

① 4
② 5
③ 6
④ 11

2. 正解:ループ脱出時の変数状態に関する正解

正解: ② 5

3. 解説:途中で抜けた時と、最後まで回った時の「違い」

Forループにおけるカウンタ変数 i の値は、「どこで処理が中断されたか」によって、その後の構造的な値が全く異なります。

[ Forループ内のタイムライン構造 ]

・i = 1, 2, 3, 4 ── 順調に処理
・i = 5 になった!
  │
  ├── If i = 5 Then が成立
  └── Exit For が実行される

★ 途中で脱出した場合(今回)
Exit For は、Next i(値を+1する処理)に到達する前に、ループの外へジャンプする構造です。そのため、変数 i5 のまま保持されます。

★ 比較:もし途中で抜けずに「完走」した場合
10回目(i=10)の処理が終わり、Next i を通ることで iは 11 に増えます。そこで初めて「10を超えたから終了」と判定されるため、完走時の最終値は 11 になる構造を持っています。

1. ここが試験に出る!: スタンダード試験では、「Exit Forで抜けた時はその時点の値(5)」になり、「最後まで完ソウした時は上限+ステップ値(11)」になるという、カウンタ変数の最終的な数値の違いを確実に突いてきます。メッセージボックスがどこで実行されているかを落ち着いて読み解きましょう。
2. エンジニアの視点: Java 17などの `for (int i=1; i<=10; i++)` 内で `break;` する構造と同じですが、VBAの `Next` は「値を増やして判定に戻る」という明確なステップ構造を意識しやすいのが特徴です。実務において、ループを抜けた後に「データが見つかって途中で抜けた(i<=10)」のか、「最後まで見つからなかった(i=11)」のかを判定するスマートな理系NEO設計によく使われます。


4. まとめ

「Exit ForはNextを通らないから、その時の値のまま」。このループ構造の仕組みを理解しておけば、条件に合致したデータが何番目に見つかったかを正確に捉えることができます。変数の変化を頭の中でシミュレーションして、完璧なアルゴリズムを構築しましょう。


【VBAスタンダード対策】プロシージャを強制終了する「Exit Sub」の制御構造を攻略!

プログラムを実行中、エラーや特定の条件が発生した時点で、それ以降の処理をスキップしてプロシージャを終了させたい場合があります。その際に使用する Exit Sub の仕組みと、処理の流れる構造を正しく理解しましょう。

1. 問題:Exit Sub 実行時の処理の流れ

【 問題 】 下記のコードを実行して Main プロシージャを呼び出した際、メッセージボックスに表示される文字列はどれでしょうか?

Sub Main()
    Call CheckValue(10)
    MsgBox "完了"
End Sub

Sub CheckValue(num As Integer)
    If num > 5 Then
        Exit Sub
    End If
    MsgBox "チェック通過"
End Sub

① 「チェック通過」が表示された後、「完了」が表示される
② 「完了」だけが表示される
③ 「チェック通過」だけが表示される
④ 何も表示されずにマクロ全体が終了する

2. 正解:Exit Sub の制御フローに関する正解

正解: ② 「完了」だけが表示される

3. 解説:呼び出し元へ処理を戻す構造

Exit Sub の最も重要な構造的特徴は、「マクロ全体を終了させるわけではなく、呼び出されたプロシージャだけを終了して、呼び出し元に制御を戻す」という点にあります。

[ 処理のコントロール構造図 ]

Sub Main()
│ Call CheckValue(10) ───┐ 処理を移す
│ │
│ (戻ってきた!) ↓
MsgBox "完了" Sub CheckValue(num)
End Sub │ If 10 > 5 Then
Exit Sub ── 途中で脱出!
│ End If
MsgBox "チェック通過" (実行されない)
End Sub

1. ここが試験に出る!: スタンダード試験では、マクロ全体を終了させる End ステートメントと、そのプロシージャだけを抜ける Exit Sub の違いを突いてきます。今回のケースでは、CheckValue は途中で終了しますが、呼び出し元である Main の次の行(MsgBox "完了")に処理が戻る構造をしっかりと見極める必要があります。
2. エンジニアの視点: Java 17などの言語における `return;`(戻り値なしの即時復帰)と全く同じ構造です。実務において、不適切なデータ(事前条件の不一致)をプロシージャの最初でチェックして弾く手法を「ガード節(Guard Clause)」と呼びます。深くネスト(インデント)されたIf文を作らないための、理系NEOなスマートな設計パターンですね。


4. まとめ

「Exit Subは、その部屋(Sub)から出るだけで、元いた場所(Main)には戻る」。この構造を知っておけば、複雑なプロシージャ連携のデバッグも怖くありません。適切な脱出処理を組み込んで、無駄のない洗練された制御フローを構築しましょう。


【VBAスタンダード対策】文字列連結演算子「&」と「+」の構造的違いを攻略!

VBAで文字列を結合する際、&(アンパサンド)と +(プラス)のどちらでも繋げられるように見えます。しかし、この2つは内部の処理構造が全く異なります。データの型が混ざったときに起きるVBA特有の挙動を解き明かしましょう。

1. 問題:型が混在する場合の連結演算子の挙動

【 問題 】 下記のコードを実行した際、メッセージボックスに表示される結果の組み合わせとして正しいものはどれでしょうか?

Sub OperatorTest()
    Dim val1 As String
    Dim val2 As Integer
    
    val1 = "100"
    val2 = 200
    
    ' --- (1) & 演算子で結合 ---
    Dim result1 As String
    result1 = val1 & val2
    
    ' --- (2) + 演算子で結合 ---
    Dim result2 As String
    result2 = val1 + val2
    
    MsgBox result1 & " / " & result2
End Sub

① result1: "100200" / result2: "100200"
② result1: "100200" / result2: 型違いによるエラー(または 300)
③ result1: 300 / result2: "100200"
④ result1: 型違いによるエラー / result2: 300

2. 正解:演算子の優先順位と型変換に関する正解

正解: ② result1: "100200" / result2: 型違いによるエラー(または 300)

3. 解説:強制結合の「&」と、足し算優先の「+」

VBAにおいて、この2つの演算子は「何を目的として作られたか」という根本的な構造の設計が異なります。

[ 演算子の構造的特徴 ]

■ & 演算子(文字列結合の専門職)
右と左のデータが何であれ、「すべて文字列に強制変換してくっつける」という構造を持っています。文字列の "100" と 数値の 200 なら、200を文字に変えて "100200" にします。エラーが起きにくく安全です。

■ + 演算子(本来は足し算の専門職)
片方が「数値型」である場合、VBAは構造的に「これは足し算(算術演算)だな」と解釈しようとします。そのため、もう片方の "100" も数値の 100 に自動変換して「100 + 200 = 300」として計算しようとします。

★ ここがトラップ!:
もし、val1 = "VBA" のように数値に変換できない文字だった場合、"VBA" + 200 は足し算が不可能なため、「型が一致しません(Runtime Error 13)」というエラーではじかれます。

1. ここが試験に出る!: スタンダード試験では、「文字列結合は & を使う」というのが大原則として問われます。+ を使ったコードを提示し、データ型が混ざったときに計算されてしまう挙動や、エラーになる危険性を指摘させる問題が定番です。
2. エンジニアの視点: Java 17などの現代的な言語では `+` 演算子が文字列結合として安全にオーバーロード(多重定義)されていますが、VBAは古い仕様を引き継いでいるため、四則演算のプラスと明確に区別する「理系NEO」な厳密さが必要です。実務でバグを生まないためにも、文字列の結合には **100% `&` を使う** のがプロの暗黙の了解です。


4. まとめ

「文字を繋ぐなら四の五の言わずに『&』」。この構造ルールを徹底するだけで、データの型に振り回されるバグは一掃できます。演算子ひとつにも明確な役割を与えること。それが、美しく堅牢なマクロの設計図を描くための基本です。


【VBAスタンダード対策】オブジェクトのクリア「Nothing」と状態判定の構造!

オブジェクト変数に格納された「実体への参照(リモコン)」は、使い終わったら明示的にクリアすることが推奨されます。また、変数が空っぽ(未設定)の状態であるかどうかを正確に判定する構造をマスターしましょう。

1. 問題:Nothingによるクリアと状態判定の文法

【 問題 】 オブジェクト変数 myWB に割り当てられたワークブックの参照をクリアし、その後、正しくクリアされたかどうか(Nothingであるか)を条件分岐で確認したい。空欄 ( A )( B ) に入る正しいキーワードの組み合わせはどれでしょうか?

Sub ClearTest()
    Dim myWB As Workbook
    Set myWB = Workbooks.Open("C:\Test.xlsx")
    
    ' --- (1) 参照をクリアする ---
    Set myWB = ( A )
    
    ' --- (2) クリアされたか判定する ---
    If myWB ( B ) Nothing Then
        MsgBox "変数はクリアされています。"
    End If
End Sub

① (A) Empty (B) =
② (A) Nothing (B) =
③ (A) Empty (B) Is
④ (A) Nothing (B) Is

2. 正解:オブジェクトのクリアと判定に関する正解

正解: ④ (A) Nothing (B) Is

3. 解説:Nothingという概念と「Is」演算子

オブジェクト変数を「何も指していない状態」にするキーワードと、その状態を比較する演算子には、VBA独自の構造ルールがあります。

[ Nothingの構造的メカニズム ]

1. クリアは「Set 変数 = Nothing」
Nothing は「どこも指していない無の状態」を表す特殊なキーワードです。通常の変数でいう 0 や空文字("")のような役割ですが、オブジェクト変数なので代入時には必ず Set が必要です。これによりメモリ上の参照(紐付け)が完全に切断されます。

2. 判定には「=」ではなく「Is」を使う
【超重要】 オブジェクトが Nothing かどうかを判定するとき、If myWB = Nothing と書くと実行時エラーになります。値の比較ではなく「同じ対象を指しているか(参照の比較)」を行うため、構造的に Is 演算子 を使用しなければなりません。

1. ここが試験に出る!: スタンダード試験では、あえて If myWB = Nothing という誤ったコードを提示し、エラーになる原因を答えさせる問題が頻出します。オブジェクトの比較は必ず Is(または否定の IsNot ではなく Not ... Is Nothing)を使うという構造を叩き込んでください。
2. エンジニアの視点: Java 17などでは `if (myWB == null)` のように共通の比較演算子を使いますが、VBAは「値の比較(=)」と「参照の比較(Is)」を厳密に区別する理系NEOな設計になっています。大規模なマクロでメモリリーク(メモリが解放されずに重くなる現象)を防ぐためにも、プロシージャの最後で `Set 変数 = Nothing` を明示する癖をつけるのがプロの構造化プログラミングです。


4. まとめ

「オブジェクトを消すならSet = Nothing、確かめるならIs Nothing」。このセットを完璧に理解していれば、オブジェクト変数の制御で迷うことはありません。メモリ空間を綺麗に保ち、エラーのないスマートなマクロを構築しましょう。