【簡単エクセルマクロ・VBA】Select Case ステートメント|条件分岐 #002

アフィリエイト広告を利用しています。
【QRコード】PC<--->スマホの切り替えにご利用ください
運営者・ポテ

いつもありがとうございます。

これは、ノンプログラマー向けのエクセルマクロ・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使用経験 約20年
  • Python 3 エンジニア認定基礎試験 合格
    一般社団法人Pythonエンジニア育成推進協会によって運営・認定されている民間資格で、経済産業省が定めたガイドライン「ITスキル標準(ITSS)」において、職種:ソフトウェアディベロップメント、専門分野:応用ソフトのレベル1に掲載されています。

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プログラミングスキルアップのための参考情報

ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。

VBAプログラミングのスキルアップ

学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。



入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるより、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。

私は、迷った場合は、インプレス社の「いちばんやさしい」シリーズを購入することが多いです。

>>Amazon で VBA の書籍をでチェックする

>>楽天市場 で VBA の書籍をチェックする

>>Yahoo!ショッピングでVBAの書籍をチェックする


VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

【QRコード】PC<--->スマホの切り替えにご利用ください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です