データの並びが2つのファイル間でバラバラな場合どうやって比較すればいいの?
新しい変数とFor文を使って検索する方法でうまく比較できるよ!
下記実践記事はデータ並びは一致している時しか使えなかったね!この記事との差を、動画とサンプル付きでみていこう!
よろしくおねがいします!
サンプル &動画
本日のサンプル & 動画はこちらになります。
Sub ExcelFile_compare2()
'ものおブログ実践2.xlsm内 行/列位置
Const START_ROW As Long = 4
Const END_ROW As Long = 21
Const SEIHIN_COL As Long = 5
Const HIKAKU1_COL As Long = 6
Const HIKAKU2_COL As Long = 7
Const HIKAKU3_COL As Long = 8
Const KOKYAKU_SEIHIN_COL = 10
Const JOKEN1_KOKYAKU_COL = 11
Const JOKEN2_KOKYAKU_COL = 12
Const JOKEN3_KOKYAKU_COL = 13
Const MONO_SEIHIN_COL = 15
Const JOKEN1_MONO_COL = 16
Const JOKEN2_MONO_COL = 17
Const JOKEN3_MONO_COL = 18
'【顧客要求】製品名管理ファイル.xlsx 行/列位置
Const KOKYAKU_START_ROW As Long = 1
Const KOKYAKU_START_COL As Long = 1
Const KOKYAKU_END_ROW As Long = 19
Const KOKYAKU_END_COL As Long = 4
'【ものづくり条件】製品名管理ファイル_実践2.xlsx 行/列位置
Const MONO_START_ROW As Long = 1
Const MONO_START_COL As Long = 1
Const MONO_END_ROW As Long = 19
Const MONO_END_COL As Long = 4
Dim bkPath_FileName As String
Dim i As Long
Dim j As Long
'-------------データ削除-------------
Call Clear_data
'-------------顧客要求データのコピー-------------
ChDir "C:\"
bkPath_FileName = Application.GetOpenFilename("Excelファイル,*.xlsx", , "顧客要求データファイルを選択")
If bkPath_FileName = "False" Then Exit Sub
Workbooks.Open bkPath_FileName
Range(Cells(KOKYAKU_START_ROW, KOKYAKU_START_COL), Cells(KOKYAKU_END_ROW, KOKYAKU_END_COL)).Copy _
Destination:=ThisWorkbook.Worksheets("Sheet1").Range("J3")
'ワークブックを閉じる
ActiveWorkbook.Close
'-------------ものづくり条件データのコピー-------------
bkPath_FileName = Application.GetOpenFilename("Excelファイル,*.xlsx", , "ものづくり条件データファイルを選択")
If bkPath_FileName = "False" Then Exit Sub
Workbooks.Open bkPath_FileName
Range(Cells(MONO_START_ROW, MONO_START_COL), Cells(MONO_END_ROW, MONO_END_COL)).Copy _
Destination:=ThisWorkbook.Worksheets("Sheet1").Range("O3")
'ワークブックを閉じる
ActiveWorkbook.Close
ThisWorkbook.Worksheets("Sheet1").Activate
'製品名のコピー
Range(Cells(START_ROW, KOKYAKU_SEIHIN_COL), Cells(END_ROW, KOKYAKU_SEIHIN_COL)).Copy Cells(START_ROW, SEIHIN_COL)
'-----------比較処理-----------
For i = START_ROW To END_ROW
For j = START_ROW To END_ROW
'製品名が一致したら
If Cells(i, KOKYAKU_SEIHIN_COL) = Cells(j, MONO_SEIHIN_COL) Then
'条件1の比較
If Cells(i, JOKEN1_KOKYAKU_COL) = Cells(j, JOKEN1_MONO_COL) Then
Cells(i, HIKAKU1_COL) = "OK"
Else
Cells(i, HIKAKU1_COL) = "NG"
Cells(i, HIKAKU1_COL).Interior.Color = vbRed
Cells(j, JOKEN1_MONO_COL).Interior.Color = vbYellow
End If
'条件2の比較
If Cells(i, JOKEN2_KOKYAKU_COL) = Cells(j, JOKEN2_MONO_COL) Then
Cells(i, HIKAKU2_COL) = "OK"
Else
Cells(i, HIKAKU2_COL) = "NG"
Cells(i, HIKAKU2_COL).Interior.Color = vbRed
Cells(j, JOKEN2_MONO_COL).Interior.Color = vbYellow
End If
'条件3の比較
If Cells(i, JOKEN3_KOKYAKU_COL) = Cells(j, JOKEN3_MONO_COL) Then
Cells(i, HIKAKU3_COL) = "OK"
Else
Cells(i, HIKAKU3_COL) = "NG"
Cells(i, HIKAKU3_COL).Interior.Color = vbRed
Cells(j, JOKEN3_MONO_COL).Interior.Color = vbYellow
End If
End If
Next j
Next i
End Sub
Sub Clear_data()
ThisWorkbook.Worksheets("Sheet1").Activate
Range(Cells(4, 5), Cells(1000, 8)).Clear
Range(Cells(3, 10), Cells(1000, 18)).Clear
MsgBox "データを削除しました(`・ω・´)ゞ"
End Sub
データ並びが異なる2つのファイル比較とOK / NG判定 図解
今回の目的も同じフォーマットの2つのファイル
・顧客要求のファイル 「【顧客要求】製品名管理ファイル.xlsx」
・ものづくり条件のファイル「【ものづくり条件】製品名管理ファイル_実践2.xlsx」
をそれぞれ選択し、同じ製品名の条件3種類をそれぞれ比較し結果を判定する内容になります。
顧客要求の条件とものづくり条件が一致しているかどうかのチェックになりますが、下記図のように製品名の並びが上記2ファイルで異なっている場合は変数とFor文を増やして検索するように工夫しましょう。
サンプルでは84行目でFor文を追加し、87行目のIf文で
If Cells(i, KOKYAKU_SEIHIN_COL) = Cells(j, MONO_SEIHIN_COL) Then
・製品名が一致したら(If文がTrueの場合) 比較処理を実施
・製品名が一致しなければ(If文がFalseの場合)、比較処理を実施しない
ようにコーディングしています。
このようにデータ並びが異なる場合でも、
製品名”maru-aaae”の条件1が2つのファイル間で異なることを検出できました。
製品名”maru-aaae”の条件1のデータは黄色ではなく、顧客要求ファイルによると、青が正解だったね!
青に修正します!
危なかった~セーフ!
まとめ
2つのファイル間でデータ並びが異なる場合でもFor文とIf文、新しい変数を駆使し、工夫することで柔軟に自動化対応することができました。
期待値と自分が作ったデータを比較するケースであれば本記事を応用できると思いますので、ぜひ参考にしていただければ嬉しいです。
VBA初級から抜け出すための知恵と、実務で活用できるスキルが学べる1冊です!激しくオススメ!
\ Excel VBA技術書も豊富 /
コメント