ループによるマッチング処理を実施する方法について説明します。今回はIF文とDo~Loop文を使用したマッチング処理について説明します。
例題
A列の氏名(A列の3行目~7行目セル)とD列の氏名(A列の3行目~4行目セル)の突合せを行い、一致(マッチング)した場合にはB列のマッチング欄に”●”を表示するプログラミング方法となります。
[実行前]:
A列の3行目~7行目とD列の3行目~4行目に氏名が入力されています。この各々の列に入力されている氏名の突合せを行います。
[実行後]:
A列及びD列の両列に入力されている「落合」「照沼」に対し、B列のマッチング欄に”●”が表示されます。
プログラミング
プログラミングは以下の通りとなります。
[記述例]:
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)) = ""
If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then
Range("B" & 行1) = "●"
Exit Do
End If
行2 = 行2 + 1
Loop
行1 = 行1 + 1
Loop
End Sub
最初に変数:行1と行2を指定します。
次にB列の3行目~7行目をクリアします。
最後にDo~Loop文を使用して変数:行1に3~7までの数値を順次セットしながらA列セルが未入力になるまでループさせると同時に、更に別のDo~Loop文を使用して変数:行2に3~4までの数値を順次セットしながらD列セルが未入力になるまでループさせます。
このループによりA列の3行目~7行目に入力されている名前とD列の3行目~4行目に入力されている名前の突合せ処理を実行します。
突合せの条件判断にはIF文を使用し、A列名前とD列名前の突合せを行うためTrim(Range("A" & 行1)) = Trim(Range("D" & 行2))と記述します。Trim関数は文字列前後にスペース文字が入っていた場合に取り除くための指定となります。また、IF文での条件が一致した場合には、Exit文での直近のDo~Loop文を抜けます。
ループ内の処理内容を説明すると、
---------------------------------
まず最初に変数:行1に3をセット(行1=3)します。1つ目のDo~Loop文では変数:行1に3がセットされている事から、A3セルが未入力か否か(Trim(Range("A" & 行1)) = "")を判定します。A3セルには文字が入力されているため、A3セルの名前である”大山”が抽出されます。
この抽出の後に変数:行2に3をセット(行2=3)します。2つ目のDo~Loop文では変数:行2に3がセットされている事から、D3セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D3セルには文字が入力されているため、D3セルの名前である”落合”が抽出されます。
1回目のIF文では”大山”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(3+1=4))され、2つ目のDo~Loop文での2回目の処理が実行されます。
2回目の処理では変数:行2に4がセットされている事から、D4セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D4セルには文字が入力されているため、D4セルの名前である”照沼”が抽出されます。
2回目のIF文では”大山”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(4+1=5))され、2つ目のDo~Loop文での3回目の処理が実行されます。
3回目の処理では変数:行2に5がセットされている事から、D5セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D5セルには文字が入力されていないため、2つ目のDo~Loop文の処理を終了します。
2つ目のDo~Loop文の処理を抜けた後には変数:行1がカウントアップ(行1 = 行1 + 1(3+1=4))され、1つ目のDo~Loop文に処理が戻ります。(結論、B3セルには何も表示されません)
---------------------------------
次に1つ目のDo~Loop文では変数:行1に4がセットされている事から、A4セルが未入力か否か(Trim(Range("A" & 行1)) = "")を判定します。A4セルには文字が入力されているため、A4セルの名前である”久保木”が抽出されます。
この抽出の後に変数:行2に3をセット(行2=3)します。2つ目のDo~Loop文では変数:行2に3がセットされている事から、D3セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D3セルには文字が入力されているため、D3セルの名前である”落合”が抽出されます。
1回目のIF文では”久保木”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(3+1=4))され、2つ目のDo~Loop文での2回目の処理が実行されます。
2回目の処理では変数:行2に4がセットされている事から、D4セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D4セルには文字が入力されているため、D4セルの名前である”照沼”が抽出されます。
2回目のIF文では”久保木”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(4+1=5))され、2つ目のDo~Loop文での3回目の処理が実行されます。
3回目の処理では変数:行2に5がセットされている事から、D5セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D5セルには文字が入力されていないため、2つ目のDo~Loop文の処理を終了します。
2つ目のDo~Loop文の処理を抜けた後には変数:行1がカウントアップ(行1 = 行1 + 1(4+1=5))され、1つ目のDo~Loop文に処理が戻ります。(結論、B4セルには何も表示されません)
---------------------------------
次に1つ目のDo~Loop文では変数:行1に5がセットされている事から、A5セルが未入力か否か(Trim(Range("A" & 行1)) = "")を判定します。A5セルには文字が入力されているため、A5セルの名前である”照沼”が抽出されます。
この抽出の後に変数:行2に3をセット(行2=3)します。2つ目のDo~Loop文では変数:行2に3がセットされている事から、D3セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D3セルには文字が入力されているため、D3セルの名前である”落合”が抽出されます。
1回目のIF文では”照沼”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(3+1=4))され、2つ目のDo~Loop文での2回目の処理が実行されます。
2回目の処理では変数:行2に4がセットされている事から、D4セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D4セルには文字が入力されているため、D4セルの名前である”照沼”が抽出されます。
2回目のIF文では”照沼”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致しているため、B5セルに”●”が表示(Range("B" & 行1) = "●")された後に2つ目のDo~Loop文の処理を終了(Exit Do)します。
2つ目のDo~Loop文の処理を抜けた後には変数:行1がカウントアップ(行1 = 行1 + 1(5+1=6))され、1つ目のDo~Loop文に処理が戻ります。
---------------------------------
次に1つ目のDo~Loop文では変数:行1に6がセットされている事から、A6セルが未入力か否か(Trim(Range("A" & 行1)) = "")を判定します。A6セルには文字が入力されているため、A6セルの名前である”遠藤”が抽出されます。
この抽出の後に変数:行2に3をセット(行2=3)します。2つ目のDo~Loop文では変数:行2に3がセットされている事から、D3セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D3セルには文字が入力されているため、D3セルの名前である”落合”が抽出されます。
1回目のIF文では”遠藤”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(3+1=4))され、2つ目のDo~Loop文での2回目の処理が実行されます。
2回目の処理では変数:行2に4がセットされている事から、D4セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D4セルには文字が入力されているため、D4セルの名前である”照沼”が抽出されます。
2回目のIF文では”遠藤”と”照沼”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致していない事からIF文を抜けます。IF文を抜けた後には変数:行2がカウントアップ(行2 = 行2 + 1(4+1=5))され、2つ目のDo~Loop文での3回目の処理が実行されます。
3回目の処理では変数:行2に5がセットされている事から、D5セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D5セルには文字が入力されていないため、2つ目のDo~Loop文の処理を終了します。
2つ目のDo~Loop文の処理を抜けた後には変数:行1がカウントアップ(行1 = 行1 + 1(6+1=7))され、1つ目のDo~Loop文に処理が戻ります。(結論、B6セルには何も表示されません)
---------------------------------
次に1つ目のDo~Loop文では変数:行1に7がセットされている事から、A7セルが未入力か否か(Trim(Range("A" & 行1)) = "")を判定します。A7セルには文字が入力されているため、A7セルの名前である”落合”が抽出されます。
この抽出の後に変数:行2に3をセット(行2=3)します。2つ目のDo~Loop文では変数:行2に3がセットされている事から、D3セルが未入力か否か(Trim(Range("D" & 行2)) = "")を判定します。D3セルには文字が入力されているため、D3セルの名前である”落合”が抽出されます。
1回目のIF文では”落合”と”落合”の2つの名前が一致しているか否か(If (Trim(Range("A" & 行1)) = Trim(Range("D" & 行2))) Then)を比較しますが、この2つは一致しているため、B7セルに”●”が表示(Range("B" & 行1) = "●")された後に2つ目のDo~Loop文の処理を終了(Exit Do)します。
2つ目のDo~Loop文の処理を抜けた後には変数:行1がカウントアップ(行1 = 行1 + 1(7+1=8))され、1つ目のDo~Loop文に処理が戻ります。
---------------------------------
次に1つ目のDo~Loop文では変数:行1に8がセットされている事から、A8セルが未入力か否か(Trim(Range("A" & 行1)) = "")を判定します。A8セルには文字が入力されていないため、1つ目のDo~Loop文の処理を終了します。
---------------------------------
との意味になります。
ダウンロード
上記サンプルプログラムを使用したい場合は、こちらからダウンロードして下さい。