2021年12月23日木曜日

もし、シェークスピアが使っていたのなら「IfにすべきかSelectにすべきか、それが問題だ」と言っただろう ー Select Case 文(VBA)

       
エクセルでVBAを使ってプログラム書くと、If文の条件分岐式をよく使います。
もし、何々だったらする/しないで条件を付けて処理行しますが、必要不可欠だ。

なので、この構文は覚える必要がありますが、他の条件分岐式も存在するんだ。
それが、Select Caseですが、これは条件を満たす場合が、複数の時に便います。

まあ、"Case 1 To 3,  Is >= 10"のように、範囲、以上をOrでつなげられるな。
こういった複雑な条件定義は便利ですが、ネスト(入れ子)のコードも容易ね。

つまり、もし何々ならば、そして何々であるのならこうせよといった論理展開。
条件分岐第一段階の下に、もう一度条件分岐が入るから入れ子なのででしょう。

それで、こういった複雑な条件付けで検索、抽出もできるのではとひらめいた。
3つくらい検索条件を掛けて抽出する式を考えてみましたがサンプルが必要だ。

たまさか、”E for Excel”というサンプルデータのサイトがあり、ダウンロード。
五十万行のセールスレコードを入手して、プログラムを書いたので紹介します。

検索の条件は、B列の”Japan”を見つけ、次にJ列の”単価”が100以上で300以下。
これを、Select CaseとIfの両方の条件分岐式で書きましたが、If文は初の試み。

どちらかと言うと、Slect Case文の方が書きやすいのと条件が複雑にできそう。
実をいうと、今までコマンドのFindとか配列を使った検索の手法を用いました。

だけど、使い方では、このような条件分岐式を使った検索でも応用できそうだ。
五十万行から千二百行の抽出に上記の条件で検索した結果、十数秒ほどだった。

というわけで、If文よりは記述しやすそうな、Select Case文はお勧めしたいな。
今回の投稿で、条件分岐式として””Select Case”を、どのようにまとめようかと悩んだのですが、複雑な条件づけがIf文より書きやすいのと、検索の条件設定などが、Findなどの検索コマンドより理解しやすいのに気が付いて、紹介することにしたのでした。

<参考コード>
※50万行のデーが、"Sheet1"にあり検索結果を"Sheet2"に書く条件とします。
Sub tmp() 'Select Case の参考コード
Dim i As Long, j As Long
Application.ScreenUpdating = False
j =  1
For i = 2 To Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row Step 1
Select Case Worksheets("Sheet1").Range("B" & i).Value
  Case "Japan"
    Select Case Worksheets("Sheet1").Range("J" & i).Value
       Case Is > 100
         Select Case Worksheets("Sheet1").Range("J" & i).Value
           Case Is < 300
             Worksheets("Sheet1").Range("A" & i & ":N" & i).Copy
             Worksheets("Sheet2").Range("A" & j).PasteSpecial
             j = j +1  ’シート2に書き込むとき、行番号を一つずつ増やす
         End Select ’入れ子の条件掘り下げに注意
    End Select
End Select
Next i
Application.ScreenUpdating = True
End Sub

Sub tmp() 'If Then文の参考コード(難しいな)
Dim i As Long, j As Long
Application.ScreenUpdating = False
j = 1
For i = 2 To Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row Step 1
If Worksheets("Sheet1").Range("B" & i).Value = "Japan" Then
    If Worksheets("Sheet1").Range("J" & i).Value > 100 Then
        if Worksheets("Sheet1").Range("J" & i) = < 300 Then 
             Worksheets("Sheet1").Range("A" & i & ":N" & i).Copy
             Worksheets("Sheet2").Range("A" & j).PasteSpecial
             j = j + 1 
         End If
    End If
End If
Next i
Application.ScreenUpdating = True
End Sub




いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿