【Excel VBA】If Elseとは違う条件式(Select Case)について
エンジニアのIMMRです。Excel VBAの条件式には、以前に説明したExcel VBA 条件式(If Else)とこれから説明するSelect Caseの二つあります。1.従来のIf Else条件式If Elseは条件に合った時は処理Aを、条件に合わなかったら処理Bを実行します。では、下記のようなデータがあり、複数の条件があるとします。If Elseを使用して作成すると2種類の方法が浮かぶと思
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
こんにちは。IMMRです。
以前に「For Nextを使用して、複数のセルを参照することが出来る」と説明しました。
以前に説明した「同じ処理を繰り返し行う」
もし、下記のようなデータがあるとします。
図1 ブック(データの最大値が15)

これに売り上げ数が10個以上なら判定欄に〇を
9個以下なら×をつけるプログラムを作成するとこのようになります。
Dim i As Long
For i = 4 To 15
    If Cells(i, 2) >= 10 Then
        Cells(i, 3) = "〇"
    Else
        Cells(i, 3) = "×"
    End If
Nextでは、同じプログラムで下記のデータを使用します。
図2 ブック(データの最大値が14)

セルの範囲は、4~15行です。一応、全てのデータに対して処理をすることが出来ますが
何も値の入っていない14行目と15行目にも処理を行ってしまいます。
つまり、無駄な処理を行ってしまいます。
同じプログラムでまた、異なる下記のデータを使用します。
図3 ブック(データの最大値が16)

今度は、処理のセルの範囲が4~15行に対して、16行目が存在します。
これでは、16行目のデータが存在するにもかかわらず、15行目で処理が終了してしまいます。
データによっては、データ数つまり、行の変化があるものもあります。
そうなると無駄な処理をしてしまったり、全てのデータを処理出来なかったりします。
データ数に応じて、処理の行数を変更しなくてはいけません。
リテラル値にしてしまうと毎回、処理の実行前にFor Next文の最大値(For i=1 To Max)の箇所を変更する必要があります。
処理の度に変更するのは、手間がかかりますし、修正時に他の箇所をいじってしまう恐れもあります。
そのために毎回、処理実行前にデータの行を確認して、その行数をFor NextのMaxに自動で設定されるようにすればよいのです。
その方法を説明します。
For Nextで最大値が自動で設定される方法の前にエクセルの[Ctrl] + 矢印キーをご存じですか。
セルの最終行を確認する方法として、
エクセルの右側にあるスクロールバーがあります。
例えば、下記データがあるとします。
図4 ブック(データが記載されている)

そして、右側にあるスクロールバーを下まで移動すると
図5 ブック(スクロールバーでデータが入力されている最大行を確認)

これによって、最終行が4744 であることがわかります。
この方法では、わざわざスクロールをしないといけませんので手間がかかってしまいます。
もっと、手軽に確認する方法があります。
それは、[Ctrl] + 矢印キーです。
行のヘッダー箇所を選択します。
図6 ブック(実行前)
![「[Ctrl] + ↓」で最終行を選択する方法:行のヘッダー箇所の選択](https://forward-soft.co.jp/admin/assets/upload/blog/250ae0ced1848c54c1261c8fab80426b.png)
この状態で[Ctrl] + ↓ を押すと
図7 ブック([Ctrl] + ↓の実行結果)
![「[Ctrl] + ↓」で最終行を選択する方法:「[Ctrl] + ↓」の実行結果](https://forward-soft.co.jp/admin/assets/upload/blog/abcb3499d79cc7e5256065664607ab78.png)
キーボタン一つで最終行のところまで飛ぶことが出来ます。
この方法は同様に、下から上 左から右 右から左も出来ます。
この方法によって最終行のところまで行くことが出来ますが
おすすめとしては、上から下 よりも 下から上です。
なぜかというと
もし、データ内にブランク行が1つ含んでいるとします。
図8 ブック(39行目にブランクが含んでいる)
![途中に空白行があるときの「[Ctrl] + ↓」の挙動:行のヘッダー箇所の選択](https://forward-soft.co.jp/admin/assets/upload/blog/eff6536025d35a17c6dce7cd92df30f3.png)
そして、さきほどのようにヘッダーにカーソルを合わせてから上から下で行うと
図9 ブック(実行前)
![途中に空白行があるときの「[Ctrl] + ↓」の挙動:「[Ctrl] + ↓」の実行結果](https://forward-soft.co.jp/admin/assets/upload/blog/09d6c60688300f8346d7b6133ab6f251.png)
図10 ブック([Ctrl] + ↓の実行失敗)
![途中に空白行があるときの「[Ctrl] + ↓」の挙動:「[Ctrl] + ↓」の実行結果](https://forward-soft.co.jp/admin/assets/upload/blog/f10bac47be0f601ab5ad21aa6fd60b56.png)
先ほどのブランクのあった39行目の一つ上の行で止まってしまいます。
つまり、本来なら40行目以降にもあるデータがあるにもかかわらず、最終行が38行目となってしまいます。
これでは、全てのデータに対して処理を行うことが出来ません。
しかし、下から上の方法([Ctrl] + ↑)で行えば、そのようなことはなくなります。
先ほどと同じ39行目がブランクのものを使用します。
今度は、ヘッダーでは、なく最終行より下(絶対にこれ以上のデータはない)の行をカーソルに当てます。
ここでは、5000行目にカーソルを置きます。
図11 ブック(実行前)
![「[Ctrl] + ↑」で最終行を選択する方法:5000行目の選択](https://forward-soft.co.jp/admin/assets/upload/blog/de8c4d0b6606d8fa47de943812fc8773.png)
そして、この状態で、[Ctrl] + ↑ と押すと
図12 ブック([Ctrl] + ↑の実行結果)
![「[Ctrl] + ↑」で最終行を選択する方法:「[Ctrl] + ↑」の実行結果](https://forward-soft.co.jp/admin/assets/upload/blog/0a45954b01ad80cf2d75425bd9f97f61.png)
データの最終行に飛ぶことが出来ます。
この方法を使えばデータ数が変化してもそれぞれの最終行を調べることが出来ます。
For Nextで最大値が自動で設定される方法はマクロで行うと以下のようになります。
上から下
Range("セル場所").End(xlDown).Row下から上
MsgBox Range("セル場所").End(xlUp).Row左から右
MsgBox Range("セル場所").End(xlToRight).Column右から左
MsgBox Range("セル場所").End(xlToLeft).Column下記、データで行うと
図13 ブック(データが記載されている)
![[Ctrl] + 矢印」を使ったマクロの説明用サンプルデータ](https://forward-soft.co.jp/admin/assets/upload/blog/258aa3c82313ed02aadccab42f5ee8f2.png)
それぞれの最終行は
Range("A3").End(xlDown).Row ⇒ 14
Range("A20").End(xlUp).Row ⇒ 17
Range("A3").End(xlToRight).Column ⇒ 3
Range("G3").End(xlToLeft).Column ⇒ 5
となります。
For Nextで最大値が自動で設定されるかサンプルコードを説明します。
図14 ブック(実行前)
![[Ctrl] + 矢印」を使ったマクロを実行する前の画面](https://forward-soft.co.jp/admin/assets/upload/blog/86a19814a6508369fd9893178ccdd275.png)
上記のような文字列が記載されているブックを用意して
売り上げ数が10個以上の場合は、判定欄にOKを 9~1個の場合はNGを ブランクには何も記載しない。
サンプルコード
Sub Test7()
Dim i As Long
    For i = 4 To Range("A30").End(xlUp).Row
        If Cells(i, 2) > 0 Then
            If Cells(i, 2) >= 10 Then
                Cells(i, 3) = "OK"
            Else
                Cells(i, 3) = "NG"
            End If
        End If
    Next i
End Sub上記のサンプルコードを使用して、For Nextで最大値が自動で設定されか確認を行います。
実行結果は以下のようになります。
図15 ブック(上記コード実行後)
![[Ctrl] + 矢印」を使ったマクロの実行結果](https://forward-soft.co.jp/admin/assets/upload/blog/b04b5f457949c8e626d09a95b6f57810.png)
途中ブランクがあっても最終行まで処理が出来ていることが確認できます。
繰り返し処理(For Next)の最大値を毎回手作業にて入力しないで済みました。
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート