【VBA】複数のセルに対し共通処理を実装する方法について(Select Case/Do While)
マクロ初心者が一日でも早くマクロを習得できるようにするため、役立つコンテンツを執筆しているFamillit編集部@マクロ班です。
今回は「後からでも見やすい!複数のセルに対し共通処理を実装する方法」についてご紹介していきます。
マクロを使う目的に「~の値が入ってきた場合には処理を中断したい(警告文を出す)」や「~の値が入ってきた場合には~の値を入れたい」という処理はかなり高頻度で出てくると思いますが、後からみても「何だっけこの処理?」となる様な書き方をしている方が多くいらっしゃいますので、今回はこの様なテーマにしてみました。
1.全体のコード概要
早速コードからみていきましょう!
データがキレイに並んでいればIF文でも結構見やすくかけるのですが、実際のデータはそこまでキレイに並んでいる訳ではありません。そういった場合には、Select Case文を使うことでかなりすっきりした見た目になることが分かっていただけると思います。
'************************************************************************************
' ◆機能
' 複数のセルに対し、同時にチェックや整形を行う処理
'************************************************************************************
Sub データチェック(ErrFlg)
Dim i As Long:i = 2 'i:行数 スタート行を2行目とする
Dim l As Long:l = 1 'l:列数 N行目に対し1列目~最終列までを処理する
Do While i <= MAXRow
Do While l <= MAXCol
Select Case l
'1, 2, 3, 10 列目の場合、空白文字を削除する
Case 1, 2, 3, 10
Cells(i, l).Value = Replace(Cells(i, l), " ", "")
Cells(i, l).Value = Replace(Cells(i, l), " ", "")
'4, 5, 7 列目が数値であるかチェックする
Case 4, 5, 7
If IsNumeric(Cells(i, l)) Then
Else
ErrFlg = 1
End If
'6, 8, 9 列目が日付形式であるかチェックする
Case 6, 8, 9
Cells(i, l).Value = Format(CStr(Cells(i, l).Value), "yyyy/mm/dd")
If IsDate(Cells(i, l).Value) Then
Else
ErrFlg = 1
End If
Case Else
End Select
l = l + 1
Loop
i = i + 1
Loop
End Sub
となります。皆さんが動かす際には、ErrFlgをグローバル変数で「Dim ErrFlg As Integer」の様に宣言してから使用するか、もしくはSubではなくFunctionなどにすればいいかと思います。
これを見て「あっ、これならすぐに使える!」という方はそのまま使っていただいて問題ありませんが、少しでも分からない部分があれば次の解説を読んでいきましょう!
2.コードの解説
今回のコードでポイントになるのが、次の4つになります。
- 変数の初期値と代入
- Do Whileのループ処理の使い方
- Select Caseの使い方
- 順番にセルを移動する
2-1.変数の初期値と代入
該当箇所は以下になります。
Dim i As Long:i = 2 'i:行数 スタート行を2行目とする
Dim l As Long:l = 1 'l:列数 N行目に対し1列目~最終列までを処理する
別に以下の様な書き方をしても全く問題はないのですが、それだと少し面倒なので上記の様な書き方を推奨しています。
Dim 変数名 As データ型名
変数名 = 値
変数の宣言はどこでも使いますので、是非覚えておいていただければ幸いです!
2-2.Do Whileループの使い方について
Do Whileループの書き方については次のようになります。
Do while 条件式
処理
Loop
Do Whileは条件式がTrueであれば、繰り返し処理を続けるループ文です。そのため、条件式が初めからFalseの場合は、ループ内の処理は1度も実行されずに、ループ外の次の処理に移行してしまいます。
だから、「エラーのフラグを立てて処理を続けたい」場合にはDo Whileが最適です。
ループ文はこれ以外にも多くありますので、少しずつでもいいから覚えていけるといいですね!
2-3.Select Caseの使い方について
Select Caseの書き方については次のようになります。
Select Case 数式(または文字列式も可能)
Case 値1, 値2, ...
' 条件式1が真の時
Case 値X, 値Y, ...
' 条件式2が真の時
Case Else
' 条件式1~Nが全て偽の時
End Select
使い方をまとめると、以下の様になります。
・あるCaseで条件を満たした場合は、そのCaseの中(ステートメント)まで実行した後、End Selectまで進みます。
・つまり、複数のCaseの条件に一致する場合は、最初に一致したCaseの中だけが実行されます。
・Case Elseは、どのCaseにも一致しない場合に実行されます。(必須ではありませんが、予期せぬ処理を実行することもありますので、異常系として基本は書いておきましょう)
・全てのCaseと一致せず、Case Elseもない場合は、何も処理することなくEnd Selectに進みますが、基本的にはCase Elseを書くように心がけましょう。
2-4.順番にセルを移動して値を書き込む
ループ時にカウントアップ用の変数に+1をし続けることで、順番にセルを移動しています。
l = l + 1
i = i + 1
こういった自動でカウントアップすることを、プログラムの世界では「インクリメント」というのが一般的になるため、今回はその言葉とやり方を覚えていただければと思います。
※他言語でインクリメントは「i+」や「i++」のように短縮した表現ができるものですが、残念ながらVBAではそういった記述は出来ません。
3.まとめ
今回はループ文と組み合わせてSelect Case文を書いているため、かなり実用的なコードになっています。初めての頃はこういったコードをコピペして業務削減を出来れば十分だと思いますが、そのうち自分で色々書けるようになると便利な存在がマクロです。