まるきち君!今日は初めて実践として2つのファイルを比較してみよう!Excel VBAならボタンひとつで実行できるよ!
ファイル比較って今まで目視でやってて時間もかかるし、疲れてるとミスりまくるんだよね~
実践記事はサンプルと動画付きだからそのまま転用することができるよ!いっしょにみていこうよ!
イッエーイ!お願いします!
サンプル &動画
サンプル & 動画はこちらになります。
Sub ExcelFile_compare1()
'ものおブログ実践1.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 JOKEN1_KOKYAKU_COL = 11
Const JOKEN2_KOKYAKU_COL = 12
Const JOKEN3_KOKYAKU_COL = 13
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
'【ものづくり条件】製品名管理ファイル.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
'-------------データ削除-------------
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, 10), Cells(END_ROW, 10)).Copy Cells(START_ROW, SEIHIN_COL)
'-----------比較処理-----------
For i = START_ROW To END_ROW
'条件1の比較
If Cells(i, JOKEN1_KOKYAKU_COL) = Cells(i, JOKEN1_MONO_COL) Then
Cells(i, HIKAKU1_COL) = "OK"
Else
Cells(i, HIKAKU1_COL) = "NG"
Cells(i, HIKAKU1_COL).Interior.Color = vbRed
Cells(i, JOKEN1_MONO_COL).Interior.Color = vbYellow
End If
'条件2の比較
If Cells(i, JOKEN2_KOKYAKU_COL) = Cells(i, JOKEN2_MONO_COL) Then
Cells(i, HIKAKU2_COL) = "OK"
Else
Cells(i, HIKAKU2_COL) = "NG"
Cells(i, HIKAKU2_COL).Interior.Color = vbRed
Cells(i, JOKEN2_MONO_COL).Interior.Color = vbYellow
End If
'条件3の比較
If Cells(i, JOKEN3_KOKYAKU_COL) = Cells(i, JOKEN3_MONO_COL) Then
Cells(i, HIKAKU3_COL) = "OK"
Else
Cells(i, HIKAKU3_COL) = "NG"
Cells(i, HIKAKU3_COL).Interior.Color = vbRed
Cells(i, JOKEN3_MONO_COL).Interior.Color = vbYellow
End If
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」
・ものづくり条件のファイル「【ものづくり条件】製品名管理ファイル.xlsx」
をそれぞれ選択し、同じ製品名の条件3種類をそれぞれ比較し結果を判定する内容になります。
要は、顧客要求の条件とものづくり条件が一致しているかどうかのチェックになります。
図解すると下記になります。
定数宣言
サンプル3行目~32行目で各ファイル、各データのスタート位置、エンド位置を定数で宣言しています。
実務ではどうしてもファイルの情報量が変更されるケースがでてきます。
変化に強いコーディングをするために、できるだけ定数を使用して簡単にコードの修正が出来るようにしておきましょう。
データ消去
サンプル40行目で、データの消去を実施しています。
先にデータが入っていると結果が正しく出力されません。
処理前にClear_dataプロシージャをCallして100%残っているデータを消去するようにしています。
Call Clear_data
2つのファイルを開く
サンプルの44行目から76行目で、GetOpenFilenameで2つのExcelファイルを指定し開き、表のデータをマクロファイルの”Sheet1″にコピーしています。
2つのファイルのデータを比較
サンプルの78行目から123行目で1製品名ずつ条件1、条件2、条件3のデータが一致しているか比較しています。
For Nextステートメントについては下記記事を参照してください。
比較した結果、一致すれば”OK”、一致しなければ”NG”としセル背景色を赤にして間違いがわかるように強調しています。
【ものづくり条件】製品名管理ファイル.xlsxのどのデータが一致していないのか?一目でわかるようにこちらもセル背景色を黄色にして強調しています。
ボタンひとつで、比較処理があっという間に終わったね!
そうだね!今回のようにファイルを選択することで、ファイル場所を直接指定するより柔軟に対応できるようになっているよ!
まとめ
今回のExcel VBA自動化を行った結果、
【ものづくり条件】製品名管理ファイル.xlsxの製品名maru-aaaeという製品の条件1が顧客要求と比較し間違っていることがわかりました。
次回の実践記事では表のフォーマットが異なるケースにも対応したコードを説明していきたいと思います。
VBA初級から抜け出すための知恵と、実務で活用できるスキルが学べる1冊です!激しくオススメ!
\ Excel VBA 技術書も豊富 /
コメント