Familiar with IT
Familiar with IT
  • ランキング
  • レビュー
  • 記事一覧
  • お問い合わせ
Famillit > 記事一覧 > プロダクト > Office製品 > Excel > 【VBA】複数のセルに対し共通処理を実装する方法について(Select Case/Do While)

【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つになります。

  1. 変数の初期値と代入
  2. Do Whileのループ処理の使い方
  3. Select Caseの使い方
  4. 順番にセルを移動する

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文を書いているため、かなり実用的なコードになっています。初めての頃はこういったコードをコピペして業務削減を出来れば十分だと思いますが、そのうち自分で色々書けるようになると便利な存在がマクロです。


Excel、Office製品

投稿ナビゲーション

前
【プロでも使う】商用利用可な無料で使える動画素材サイト6選
次
【要件定義】決済画面の文言・テンプレート
コメントは受け付けていません。
  • Adsense (1)
  • AI (3)
  • Analytics (1)
  • CRM (2)
  • Excel (2)
  • Google製品 (2)
  • IoT (2)
  • ISMS (1)
  • Office製品 (3)
  • PowerPoint (1)
  • VPN (7)
  • WordPress (3)
  • クリエイティブ (3)
  • コミュニケーション (1)
  • システム開発 (8)
  • スマートロッカー (2)
  • セールス・マーケティング (2)
  • セキュリティ (8)
  • テスト (1)
  • プロダクト (18)
  • ペーパーレス (1)
  • 動画制作 (1)
  • 決済機能 (1)
  • 生成AI (1)
  • 画像編集 (1)
  • 自然言語処理 (1)
  • 要件定義 (2)
  • 課題 (1)
  • 開発 (4)
運営会社| 個人情報保護方針| お問い合わせ

©Knowledge marketing LLC All rights reserved.