教えて!ExcelVBA!

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

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

       f:id:m_kbou:20200422141326p:plain

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

 

【目次】

 

例題

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

[実行前]:

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

f:id:m_kbou:20200422142545p:plain

[実行後]:

A列及びD列の両列に入力されている「落合」「照沼」に対し、B列のマッチング欄に”●”が表示されます。

f:id:m_kbou:20200422142612p:plain

 

プログラミング

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

[記述例]:

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

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

Sub サンプル()

    Dim 行1 As Double
    Dim 行2 As Double

    Range("B3:B7").ClearContents

    For 行1 = 3 To 7
        For 行2 = 3 To 4
            If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then
                Range("B" & 行1) = "●"
                Exit For
            End If
        Next
    Next
   
End Sub

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

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

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

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

このループによりA列の3行目~7行目に入力されている名前とD列の3行目~4行目に入力されている名前の突合せ処理を実行します。

突合せの条件判断にはIF文を使用し、A列名前とD列名前の突合せを行うためTrim(Range("A" & 行1)) = Trim(Range("D" & 行2))と記述します。Trim関数は文字列前後にスペース文字が入っていた場合に取り除くための指定となります。また、IF文での条件が一致した場合には、Exit文での直近のFor~Next文を抜けます。

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

「まず最初に1つ目のFor~Next文の変数:行1に3がセットされ、A3セルの名前である”大山”が抽出されます。

この抽出の後に2つ目のFor~Next文の変数:行2に3がセットされ、D3セルの名前である”落合”が抽出されます。

1回目のIF文では”大山”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事から2つ目のFor~Next文の変数:行2には4がセットされ、D4セルの名前である”照沼”が抽出されます。

2回目のIF文では”大山”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つも一致していない事から2つ目のFor~Next文の処理は終了し、1つ目のFor~Next文に処理が戻ります。(結論、B3セルには何も表示されません)

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

次に1つ目のFor~Next文の変数:行1には4がセットされ、A4セルの名前である”久保木”が抽出されます。

この抽出の後に2つ目のFor~Next文の変数:行2に3がセットされ、D3セルの名前である”落合”が抽出されます。

1回目のIF文では”久保木”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事から2つ目のFor~Next文の変数:行2には4がセットされ、D4セルの名前である”照沼”が抽出されます。

2回目のIF文では”久保木”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つも一致していない事から2つ目のFor~Next文の処理は終了し、1つ目のFor~Next文に処理が戻ります。(結論、B4セルには何も表示されません)

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

次に1つ目のFor~Next文の変数:行1には5がセットされ、A5セルの名前である”照沼”が抽出されます。

この抽出の後に2つ目のFor~Next文の変数:行2に3がセットされ、D3セルの名前である”落合”が抽出されます。

1回目のIF文では”照沼”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事から2つ目のFor~Next文の変数:行2には4がセットされ、D4セルの名前である”照沼”が抽出されます。

2回目のIF文では”照沼”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致しているため、B5セルに”●”が表示(Range("B" & 行1) = "●")された後に2つ目のFor~Next文の処理は終了(Exit For)し、1つ目のFor~Next文に処理が戻ります。

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

次に1つ回目のFor~Next文の変数:行1に6がセットされ、A6セルの名前である”遠藤”が抽出されます。

この抽出の後に2つ目のFor~Next文の変数:行2に3がセットされ、D3セルの名前である”落合”が抽出されます。

1回目のIF文では”遠藤”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事から2つ目のFor~Next文の変数:行2には4がセットされ、D4セルの名前である”照沼”が抽出されます。

2回目のIF文では”遠藤”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つも一致していない事から2つ目のFor~Next文の処理は終了し、1つ目のFor~Next文に処理が戻ります。(結論、B6セルには何も表示されません)

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

次に1つ目のFor~Next文の変数:行1には7がセットされ、A7セルの名前である”落合”が抽出されます。

この抽出の後に2つ目のFor~Next文の変数:行2に3がセットされ、D3セルの名前である”落合”が抽出されます。

1回目のIF文では”落合”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致しているため、B7セルに”●”が表示(Range("B" & 行1) = "●")された後に2つ目のFor~Next文の処理は終了(Exit For)し、1つ目のFor~Next文に処理が戻りますが、1つ目のFor~Next文も処理が終了したため、全ての突合せ処理が終了します。」

との意味になります。

 

ダウンロード

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

1drv.ms