【簡単Excelマクロ・VBA】Select Case ステートメント|条件分岐 #002
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
Select Case ステートメントは、プログラムに条件分岐を設定する方法です。
例えば、Case A の場合は処理1を実行、Case B の場合は処理2を実行、Case C の場合は処理3を実行、のように Case によって異なる処理を実装することができます。
機械的に処理を実行するプログラムには限界があります。より効率的なマクロを作成するためには必ず条件分岐処理が必要になります。
本稿では、条件分岐の方法のひとつである「Select Case ステートメント」を、とても簡単な例を用いて解説いたします。
ことばの意味
- ノンプログラマー
プログラミングを主な仕事にしていない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。 - ステートメント
VBAの中で何らかの固有の働きをするものを定義したものの呼称です。VBAには、Ifステートメント、For...Next ステートメント、Withステートメント、Sub ステートメントなど、様々なステートメントがあります。例えば、Subステートメントは、コードの始まりを定義するステートメントです。
関連記事
VBAにおける条件分岐処理の全体像
VBAにおける「条件分岐処理」には、大きく分けて「If…Then…Else ステートメント」 と 「Select Case ステートメント」の2つの方法があります。「条件分岐処理」の全体像は以下の記事で解説しております。
本稿では「条件分岐処理」の一部である「Select Case ステートメント」を解説いたします。
「Select Case」と「If...Then...Else」ステートメントの使い分け
「Select Case」と「If...Then...Else」ステートメントは、どちらも条件分岐処理を行うステートメントです。どちらも同じような処理ができますが、以下のように使い分けると良いでしょう。
ただし、これらの選択肢はあくまで一般論であり、どちらの方法が良いかは状況によります。最も重要なのは、コードが読みやすく、理解しやすいことです。
If...Then...Else ステートメント
- 条件が少ない場合。目安として条件が2つまたはそれ以下の場合。
- 条件が複雑で、And や Or などの論理演算子を用いて複数の条件を組み合わせる場合。
ex) If 条件A Or 条件B Then
Select Case ステートメント
- 条件が多い場合。目安として3つ以上。
- 各条件が単純な場合。例えば、式の評価値が特定の値に等しいかどうかなど。
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
具体例を以下に示します。この例では単純に、評価式(ws.Cells(row_idx, 1).Value)の値が各Caseの値と等しい場合の処理を示します。
Sub sample()
' 変数の宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim row_idx As Long ' 行番号変数
' ワークブックを"Sheet1"をオブジェクト変数として取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
' 行番号変数に初期値を設定
row_idx = 1
' A列の値を判定し、B列に対応する値を書き込む
Do While ws.Cells(row_idx, 1) <> ""
' ws.Cells(row_idx, 1).Value を評価する Select Case ステートメントを開始
Select Case ws.Cells(row_idx, 1).Value
Case 100
ws.Cells(row_idx, 2) = "A"
Case 90
ws.Cells(row_idx, 2) = "B"
Case 80
ws.Cells(row_idx, 2) = "C"
Case Else
ws.Cells(row_idx, 2) = "D"
End Select
' 行番号変数の値に1を加え、次の行に進む
row_idx = row_idx + 1
Loop
End Sub
解説します。
変数の宣言
' 変数の宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim row_idx As Long ' 行番号変数
冒頭の部分は変数を宣言しています。
Dim 変数 As データ型 の構文で宣言します。
これによって各変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、"Workbook"はワークブック、"Worksheet"はワークシート、"Long"は整数を格納するためのデータ型を意味しています。
ことばの意味
- 変数
「値」や「オブジェクト」を入れておく箱のようなものです。変数はその名の通りコード内での指示によって値やオブジェクトを変えることができます。 - オブジェクト
VBAで操作する対象のことです。 - Long
-2,147,483,648から2,147,483,647までの範囲の整数値を格納することができる。尚、整数を扱うデータ型には Integer もあるが、これは-32,768から32,767までと、Long よりも扱える数が小さい。
ワークブックとワークシートをオブジェクト変数として取得
' ワークブックとワークシートをオブジェクト変数として取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
次に、ワークブックとワークシートを、オブジェクト変数として格納しています。
wb.Worksheets(1)のカッコ内の数値1は、ワークブック内の1番目のワークシート、つまり左端のワークシートを意味しています。
ことばの意味
- オブジェクト変数
「オブジェクト」を入れておく箱のようなものです。通常の変数が数値や文字列などを格納するのに対して、オブジェクト変数はオブジェクトを格納します。
Do While ステートメントでA列を走査
' 行番号変数に初期値にを代入
row_idx = 1
まずはじめに行番号変数に初期値を代入します。
' Do While ステートメントでA列を走査;A列の値が空欄でない間ずっと処理を繰り返す
Do While ws.Cells(row_idx, 1) <> ""
次に、Do while ステートメントを開始します。
これは、A列のセルが空欄でない間はずっと処理を繰り返しなさい、という命令です。論理演算子 <> は「等しくない」という意味を表します。つまり、この場合の <>"" は「空欄に等しくない」、即ち「空欄ではない」という意味です。
ことばの意味
- 論理演算子
条件を組み合わせて真偽値(True または False)を評価するために使用されます。例えば、"And" は両方の条件が True の場合に True を返し、"Or"は少なくとも一方の条件が True の場合に True を返します。
Select Case ステートメントを用いて条件分岐処理を実装
' ws.Cells(row_idx, 1).Value を評価する Select Case ステートメントを開始
Select Case ws.Cells(row_idx, 1).Value
ws.Cells(row_idx, 1).Value という式を評価するための Select Case ステートメントを開始します。
Case 100
ws.Cells(row_idx, 2) = "A"
Case 90
ws.Cells(row_idx, 2) = "B"
Case 80
ws.Cells(row_idx, 2) = "C"
Case Else
ws.Cells(row_idx, 2) = "D"
その下に4つの 各Case に応じた処理を記述しています。
例えば一番最初の条件 Case 100
は、A列の値が "100"だった場合に、B列に"A"を書き込むコードです。
最後の条件 Case Else
は、それまですべての条件に該当しない場合に、B列に"D"を書き込む処理です。
End Select
Select Case ステートメントを終了します。
' 行番号変数の値に1を加え、次の行に進む
row_idx = row_idx + 1
行番号変数の値に1を加えて、次の行に移動します。
Loop
Do While ステートメントの最初に戻り、同じ処理を繰り返します。
以上が、Select Case ステートメントの基本的な使い方です。
様々な Case の指定のしかた
上記の例は、単純に評価式の値と各Caseの値が"等しい"場合の書き方です。
例えば、Case 条件に"幅"を指定したい場合には、以下のように記述します。
Case 90 to 100
' 評価式の値が90から100だった場合の処理
Case の条件を "〇〇以上" としたい場合には以下のような記述します。
Case Is >= 90
' 評価式の値が90以上だった場合の処理
同様に、"〇〇以下" としたい場合には、以下のように記述します。
Case Is <= 90
' 評価式の値が90以下だった場合の処理
おわりに
ご覧いただきありがとうございました。
今回の記事では、「条件分岐処理」の中の「Select Case ステートメント」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
筆者の記事関連経験
- VBA使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。