【簡単エクセル/Excel VBA マクロ】Select Case ステートメントで部分一致を実装する方法|条件分岐 #003



いつもありがとうございます。
ノンプログラマー向け「Excel VBA マクロ 解説シリーズ」へようこそ。
Select Case ステートメントは、プログラムに条件分岐を設定する方法です。基本的な使い方は、こちらの記事で紹介しております。
本稿では、Select Case ステートメントの条件に"部分一致"を実装する方法を解説いたします。
VBAにおける条件分岐処理の全体像
VBAにおける「条件分岐処理」には、大きく分けて「If...Then...Else ステートメント」 と 「Select Case ステートメント」の2つの方法があります。「条件分岐処理」の全体像は以下の記事で解説しております。
本稿では「条件分岐処理」の一部である「Select Case ステートメント」において、条件に"部分一致"を実装する方法を解説いたします。
VBAの「Select Case ステートメント」で部分一致を実装する方法

Select Case ステートメントの基本構文を以下に示します。
' Select Case ステートメント開始
Select Case 条件式
' 条件 A が条件式を満たす場合の処理
Case 条件A
処理1
' 条件 B が条件式を満たす場合の処理
Case 条件B
処理2
' 条件 C が条件式を満たす場合の処理
Case 条件C
処理3
' 上記すべての条件が偽(False)である場合の処理
Case Else
処理4
' Select Case ステートメント終了
End Select
それに対して、Select Case ステートメントで"部分一致"を実装する方法は以下のような構文になります。後のセクションで詳述しますが、部分一致は Instr 関数で実現しています。
' 変数宣言
Dim str as String
' 変数に値を代入
str = "your string"
' Select Case ステートメント
Select Case True
Case Instr(str, "検索対象文字列1") > 0
' "検索対象文字列1"が含まれている場合の処理
Case Instr(str, "検索対象文字列2") > 0
' "検索対象文字列2"が含まれている場合の処理
Case Else
' 上記にいずれも当てはまらない場合の処理
End Select
具体例を示します。
このコードは、以下のような構造になっています。
- Do While ループでシートのA列を走査
- Select Case ステートメントでA列の値を評価
- 評価結果に応じた処理を行う
Sub sample()
' 変数宣言
Dim str As String
Dim wb As Workbook
Dim ws As Worksheet
Dim row_idx As Long ' 行番号変数
' ワークブックとワークシートを変数として取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
' 行番号変数に初期値を代入
row_idx = 1
' Do While ステートメントでA列を走査
Do While ws.Cells(row_idx, 1) <> ""
' 変数 str に値を代入
str = ws.Cells(row_idx, 1)
' 各 Case の条件式が True であるかどうかを評価する Select Case ステートメントを開始
Select Case True
' 評価対象に"基本"が含まれている場合の処理
Case InStr(str, "基本") > 0
ws.Cells(row_idx, 2) = "基本"
' 評価対象に"応用"が含まれている場合の処理
Case InStr(str, "応用") > 0
ws.Cells(row_idx, 2) = "応用"
' 上記のいずれの条件にも当てはまらない場合の処理
Case Else
ws.Cells(row_idx, 2) = "N/A"
End Select
'行番号変数に1を加え、次の行に進む
row_idx = row_idx + 1
' Do While ステートメントの最初に戻り、同じ処理を繰り返す
Loop
End Sub


解説します。
変数の宣言
' 変数宣言
Dim str As String
Dim wb As Workbook
Dim ws As Worksheet
Dim row_idx As Long ' 行番号変数
冒頭の部分は変数を宣言しています。
Dim 変数 As データ型 の構文で宣言します。
これによって各変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、"Workbook"はワークブック、"Worksheet"はワークシート、"Long"は整数を格納するためのデータ型を意味しています。
ワークブックとワークシートをオブジェクト変数として取得
' ワークブックとワークシートを変数として取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
次に、ワークブックを開くと同時にオブジェクト変数として取得しています。合わせてワークシートもオブジェクト変数として格納しています。
wb.Worksheets(1)のカッコ内の数値1は、ワークブック内の1番目のワークシート、つまり左端のワークシートを意味しています。
Do While ステートメントでA列を走査
' 行番号変数に初期値にを代入
row_idx = 1
次に Do While ステートメントでA列を走査していきます。まずはじめに行番号変数に初期値を代入しています。
' Do While ステートメントでA列を走査;A列の値が空欄でない間ずっと処理を繰り返す
Do While ws.Cells(row_idx, 1) <> ""
次に、Do while ステートメントを開始します。
これは、A列のセルが空欄でない間はずっと処理を繰り返しなさい、という命令です。論理演算子 <> は「等しくない」という意味を表します。つまり、この場合の <>"" は「空欄に等しくない」、即ち「空欄ではない」という意味です。
尚、Do While ステートメントの使い方は、こちらの記事で解説しています。
Select Case ステートメントを用いて条件分岐処理を実装
' 各 Case の条件式が True であるかどうかを評価する Select Case ステートメントを開始
Select Case True
各 Case の条件式が True であるかどうかを評価する Select Case ステートメントを開始しています。
' 評価対象に"基本"が含まれている場合の処理
Case InStr(str, "基本") > 0
ws.Cells(row_idx, 2) = "基本"
' 評価対象に"応用"が含まれている場合の処理
Case InStr(str, "応用") > 0
ws.Cells(row_idx, 2) = "応用"
' 上記のいずれの条件にも当てはまらない場合の処理
Case Else
ws.Cells(row_idx, 2) = "N/A"
各 Case の条件式と、条件式が True だった場合の処理を記述です。"部分一致"は、ここで登場する Instr 関数で実現しています。Instr 関数は、被評価文字列の中に、検索対象文字列が最初に現れる"位置"を返す関数です。つまり、">0" が True であれば指定した文字列があるということを意味しますので、部分一致は True とみなすことができます。
尚、Instr 関数の基本構文は以下のようになっています。
Instr([start], "被評価文字列", "検索対象文字列", [compare])
' start(オプション):検索を開始する位置
' compare(オプション):文字列の比較方法。
' 指定しない場合は vbBinaruCompare(大文字・小文字、全角・半角を区別あり、完全一致)
' 単純にテキスト比較を行う場合は vbTextCompare(大文字・小文字、全角・半角区別なし)
次の行の解説に進めます。
End Select
Select Case ステートメントを終了します。
' 行番号変数の値に1を加え、次の行に進む
row_idx = row_idx + 1
行番号変数の値に1を加えて、次の行に移動します。
Loop
Do While ステートメントの最初に戻り、繰り返し同じ処理を実行します。
以上が、Select Case ステートメントの Case に部分一致を実装する方法です。
おわりに


ご覧いただきありがとうございました。
今回の記事では、「条件分岐処理」の中の「Select Case ステートメント」において部分一致を実装する方法を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
関連記事
本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。
- 【簡単エクセル/Excel VBA マクロ】Excel VBA マクロの全体像 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】通常使用編目次 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】ワンポイントテクニック編目次 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】アプリ事例編目次 | みんなの実用学 (jitsuyogaku.com)
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。
