本とかコンピュータとか

10000冊プロジェクトに参加するため、ブログを立ち上げました。読んだ本の感想とか、つらつらあげます。

【ExcelVBA】Case文の話

お仕事であったしょうもない話題を一つ、備忘録として。

VBAって何?」な人は無視してください。

 
Excelにてあるツールを作成したとき、こんなこと⇩を書いていたのです。
 
===============================
'「対象」シートのA列に記述された文だけ判定し、各処理を実行
Do While ThisWorkbook.Sheets("対象").Cells(i, 1) <> ""
 Select Case Mid(ThisWorkbook.Sheets("対象").Cells(i, 1), 2, 2)
            Case ThisWorkbook.Sheets("参照先").Cells(1, 2).Value
               処理1
            Case ThisWorkbook.Sheets("参照先").Cells(2, 2).Value
               処理2
            Case ThisWorkbook.Sheets("参照先").Cells(3, 2).Value
               処理3
            Case ThisWorkbook.Sheets("参照先").Cells(4, 2).Value
               処理4
        End Select
 i = i + 1
Loop
===============================
実際のものとは当然違いますが、シートは⇩こんな感じ。

f:id:CHEROKEE:20180707013739p:plain

f:id:CHEROKEE:20180707013756p:plain

Case文って条件節にカンマ区切りで記述しても認識してくれるので、
参照先がカンマ区切りしてあるからできると思ったんですわ。

Case ThisWorkbook.Sheets("参照先").Cells(1, 1).Value
を、
Case AG,DA,KO
として判定してくれるだろう、みたいな。
「.Value」の部分を「.Text」にしてもうまくいかないです。
結局データ型に関係なく「AG,DA,KO」というひとかたまりと比較しているらしく、カンマ区切りされたセル内の要素を一つ一つ判定することはできません。
 
ちなみに、この時の正解はこれ。
===============================
'「対象」シートのA列に記述された分だけ判定し、各処理を実行
Do While ThisWorkbook.Sheets("対象").Cells(i, 1) <> ""
'「参照先」シートのB列に対象の文字列が1つ以上含まれていれば、該当処理実行。
 Select Case True
            Case InStr(ThisWorkbook.Sheets("参照先").Cells(1,2).Value,Mid(ThisWorkbook.Sheets("対象").Cells(i, 1), 2, 2)) > 0
               処理1
            Case InStr(ThisWorkbook.Sheets("参照先").Cells(2,2).Value,Mid(ThisWorkbook.Sheets("対象").Cells(i, 1), 2, 2)) > 0
               処理2
            Case InStr(ThisWorkbook.Sheets("参照先").Cells(3,2).Value,Mid(ThisWorkbook.Sheets("対象").Cells(i, 1), 2, 2)) > 0
               処理3
            Case InStr(ThisWorkbook.Sheets("参照先").Cells(4,2).Value,Mid(ThisWorkbook.Sheets("対象").Cells(i, 1), 2, 2)) > 0
               処理4
        End Select
 i = i + 1
Loop
===============================
 
Case True、使ったことなかったんですよね。。。
ちょこっと賢くなりました。