教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について説明していきます。

【ExcelVBA プログラミング】(マッチング4)ループによるマッチング処理を実行する(Select文とDo~Loop文の組み合わせによるマッチング)

      f:id:m_kbou:20200525062534p:plain

ループによるマッチング処理を実施する方法について説明します。今回はSelect文とDo~Loop文を使用したマッチング処理について説明します。

 

【目次】

 

例題

例題は、<実行>ボタンにVBAマクロが登録されており、ボタンをクリックする事で条件によるマッチング処理を実行します。内容は、A列の氏名(A列の3行目~7行目セル)とD列の氏名(A列の3行目~5行目セル)又はE列の氏名(A列の3行目~5行目セル)の突合せを行い、D列の氏名と一致(マッチング)した場合にはB列のクラス欄に”クラス①”を、E列の氏名と一致(マッチング)した場合にはB列のクラス欄に”クラス②”を表示するプログラミング方法となります。

[実行前]:

A列の3行目~7行目とD列の3行目~5行目とE列の3行目~5行目に氏名が入力されています。この各々の列に入力されている氏名の突合せを行います。

f:id:m_kbou:20200427192854p:plain

[実行後]:

A列に入力されている氏名とD列に入力されている氏名が一致した場合にはB列のクラス欄に”クラス①”が表示され、A列に入力されている氏名とE列に入力されている氏名が一致した場合にはB列のクラス欄に”クラス②”が表示されます。

f:id:m_kbou:20200427192925p:plain

 

プログラミング

プログラミングは以下の通りとなります。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。また、ボタンにプログラム内容を割り当てるには、VBAをボタンに割り当てるを参考にして下さい。

-------------------------------------------------

Sub サンプル()

    Dim 行1 As Double
    Dim 行2 As Double

    Range("B3:B7").ClearContents

    行1 = 3
    Do Until Trim(Range("A" & 行1)) = ""
        行2 = 3
        Do Until Trim(Range("D" & 行2)) = ""
            Select Case Trim(Range("A" & 行1))
                '↓クラス①
                Case Is = Trim(Range("D" & 行2))
                    Range("B" & 行1) = "クラス①"
                    Exit Do
                '↓クラス②
                Case Is = Trim(Range("E" & 行2))
                    Range("B" & 行1) = "クラス②"
                    Exit Do
            End Select
            行2 = 行2 + 1
        Loop
        行1 = 行1 + 1
    Loop
   
End Sub 

-------------------------------------------------

最初に変数:行1と行2を指定します。

次にB列の3行目~7行目をクリアします。

最後にDo~Loop文を使用して変数:行1に3~7までの数値を順次セットしながらループさせると同時に、更に別のDo~Loop文を使用して変数:行2に3~5までの数値を順次セットしながらループさせます。

このループによりA列の3行目~7行目に入力されている名前とD列の3行目~5行目に入力されている名前又はE列の3行目~5行目に入力されている名前の突合せ処理を実行します。突合せの条件判断にはSelect文を使用し、条件が一致した場合にはExit文での直近のDo~Loop文を抜けます。

 

ループ内の処理内容を説明すると、

「まず最初に1つ目のDo~Loop文を回します。変数:行1には3がセットされているため、A3セルがスペースか否かを判断します。A3セルには文字が入力されている事から、A3セルの名前である”大山”が抽出されます。

この抽出の後に2つ目のDo~Loop文の変数:行2に3がセットされ、Select文での条件判断を行います。

1回目のSelect文での条件である”大山”とD3セルの”落合”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”大山”とE4セルの”大山”の2つの名前が一致しているか否かを比較します。この2つは一致している事からB3セルに”クラス②”が表示されます。条件が一致した事で2つ目のDo~Loop文の処理を終了し、変数:行1に1が足し算(3+1=4)され1つ目のDo~Loop文に処理が戻ります。

---------------------------------

次に1つ目のDo~Loop文の変数:行1に4がセットされているため、A4セルがスペースか否かを判断します。A4セルには文字が入力されている事から、A4セルの名前である”久保木”が抽出されます。

この抽出の後に2つ目のDo~Loop文の変数:行2に3がセットされ、Select文での条件判断を行います。

1回目のSelect文での条件である”久保木”とD3セルの”落合”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”久保木”とE3セルの”大山”の2つの名前が一致しているか否かを比較します。この2つも一致していない事からSelect文を抜けます。

Select文を抜けた後に2つ目のDo~Loop文の変数:行2には1が足し算(3+1=4)され、変数:行2は4となり再度Select文での条件判断を行います。

2回目のSelect文での条件である”久保木”とD4セルの”照沼”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”久保木”とE4セルの”久保木”の2つの名前が一致しているか否かを比較します。この2つは一致している事からB4セルに”クラス②”が表示されます。条件が一致した事で2つ目のDo~Loop文の処理を終了し、変数:行1に1が足し算(4+1=5)され1つ目のDo~Loop文に処理が戻ります。

---------------------------------

次に1つ目のDo~Loop文の変数:行1に5がセットされているため、A5セルがスペースか否かを判断します。A5セルには文字が入力されている事から、A5セルの名前である”照沼”が抽出されます。

この抽出の後に2つ目のDo~Loop文の変数:行2に3がセットされ、Select文での条件判断を行います。

1回目のSelect文での条件である”照沼”とD3セルの”落合”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”照沼”とE3セルの”大山”の2つの名前が一致しているか否かを比較します。この2つも一致していない事からSelect文を抜けます。

Select文を抜けた後に2つ目のDo~Loop文の変数:行2には1が足し算(3+1=4)され、変数:行2は4となり再度Select文での条件判断を行います。

2回目のSelect文での条件である”照沼”とD4セルの”照沼”の2つの名前が一致しているか否かを比較しますが、この2つは一致している事からB5セルに”クラス①”が表示されます。条件が一致した事で2つ目のDo~Loopt文の処理を終了し、変数:行1に1が足し算(5+1=6)され1つ目のDo~Loop文に処理が戻ります。

---------------------------------

次に1つ目のDo~Loop文の変数:行1に6がセットされているため、A6セルがスペースか否かを判断します。A6セルには文字が入力されている事から、A6セルの名前である”遠藤”が抽出されます。

この抽出の後に2つ目のDo~Loop文の変数:行2に3がセットされ、Select文での条件判断を行います。

1回目のSelect文での条件である”遠藤”とD3セルの”落合”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”遠藤”とE3セルの”大山”の2つの名前が一致しているか否かを比較します。この2つも一致していない事からSelect文を抜けます。

Select文を抜けた後に2つ目のDo~Loop文の変数:行2には1が足し算(3+1=4)され、変数:行2は4となり再度Select文での条件判断を行います。

2回目のSelect文での条件である”遠藤”とD4セルの”照沼”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”遠藤”とE4セルの”久保木”の2つの名前が一致しているか否かを比較します。この2つも一致していない事からSelect文を抜けます。

Select文を抜けた後に2つ目のDo~Loop文の変数:行2には1が足し算(4+1=5)され、変数:行2は5となり再度Select文での条件判断を行います。

 3回目のSelect文での条件である”遠藤”とD5セルの”仲田”の2つの名前が一致しているか否かを比較しますが、この2つは一致していない事から次の条件である”遠藤”とE5セルの”遠藤”の2つの名前が一致しているか否かを比較します。この2つは一致している事からB6セルに”クラス②”が表示されます。条件が一致した事で2つ目のDo~Loop文の処理を終了し、変数:行1に1が足し算(6+1=7)され1つ目のDo~Loop文に処理が戻ります。

---------------------------------

次に1つ目のDo~Loop文の変数:行1に7がセットされているため、A7セルがスペースか否かを判断します。A7セルには文字が入力されている事から、A7セルの名前である”落合”が抽出されます。

この抽出の後に2つ目のDo~Loop文の変数:行2に3がセットされ、Select文での条件判断を行います。

1回目のSelect文での条件である”落合”とD3セルの”落合”の2つの名前が一致しているか否かを比較しますが、この2つは一致している事からB7セルに”クラス①”が表示されます。条件が一致した事で2つ目のDo~Loop文の処理を終了し、変数:行1に1が足し算(7+1=8)され1つ目のDo~Loop文に処理が戻ります。

---------------------------------

次に1つ目のDo~Loop文の変数:行1に8がセットされているため、A8セルがスペースか否かを判断します。A8セルには文字が入力されていない事から、全ての突合せ処理が終了します。」

との意味になります。

 

ダウンロード

上記サンプルプログラムを使用したい場合は、こちらからダウンロードして下さい。

1drv.ms