アプリ版:「スタンプのみでお礼する」機能のリリースについて

2つのCSVファイルを比較して、差分チェックをしたいと考えております。
ただ、2つのファイル上のデータの順番が異なるために、自分の扱える数式では対応できず
困っております。

例としては
■ファイルA
AA,1,1,1,1,1
BB,2,2,2,2,2
CC,3,3,3,3,3
DD,4,4,4,4,4

■ファイルB
DD,4,4,4,4,4
EE,5,5,5,5,5
AA,1,2,1,1,1
CC,3,3,3,3,3
というようなファイルがあった場合
■出力結果
AA,1,1,1,1,1
AA,1,2,1,1,1
BB,2,2,2,2,2
EE,5,5,5,5,5
というように出力されるという事です。
出来ればBB列が削除され、EE列が新規作成されたことが分かると嬉しいです。

VBA等で実現する事は出来ないでしょうか?

どうぞ宜しくお願いいたします。

質問者からの補足コメント

  • 早速のコメントありがとうございます。
    ①はおっしゃる通り、CC列が削除されるの間違いです。
    ②結果はソートされたもので構いません
    ③特定の行の値は一意となります。重複はございません。
    ④エラー返しが望ましいです。または、無視して集計でも問題ありません。
    ⑤削除対象のデータ行を赤塗りつぶす、または行頭に-のような印を付ける。新規作成も同様に青塗りつぶし、または行頭に+をつけられると有難いです。

    どうぞよろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/09/09 23:37
  • 1.おっしゃる通り「BB列が削除」で間違いないです。
    2.おっしゃる通り、2つのCSVファイルをExcelに貼り付け、もしくはデータ取り込みして、結果をExcelに出力させたいです。
    3.追加、削除の判断基準は、ご提案いただいた通りです。第1列(AA,BB,CC,DD)の値がファイルBに無い時に削除、ファイルAに無い時に追加で間違い無いです。

    どうぞよろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/09/10 08:00
  • すいません、tatsu99様のご指摘の通り、「BB列が削除」でした。
    あつかましくて申し訳ないのですが、出来れば1シートで結果表示したいです。
    *追加 行全体を水色塗りつぶし
    *削除 行全体を薄赤色塗りつぶし
    *変更 変更箇所のセルを黄色塗りつぶし
    と出来ると一番望ましいです。

    伝え方が悪く申し訳ありません。
    どうぞよろしくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/09/10 08:06

A 回答 (5件)

こんな感じの処理になると思います。

典型的な1:1マッチングです。
※結果を表示するシートのクリアとかは省略していますので、適宜、追加してくださいね。色も濃いし…。

Sub sample()
Dim wsA As Worksheet
Dim wsB As Worksheet
Dim wsC As Worksheet
Dim ixA As Long
Dim ixB As Long
Dim ixC As Long
Dim i As Long
Set wsA = OpenFile("C:\xxx\ファイルA.csv")
Set wsB = OpenFile("C:\xxx\ファイルB.csv")
Set wsC = ThisWorkbook.Sheets("Sheet1")
ixA = 1
ixB = 1
Do Until wsA.Cells(ixA, "A") = "" And wsB.Cells(ixB, "A") = ""
If wsA.Cells(ixA, "A") > wsB.Cells(ixB, "A") Or wsA.Cells(ixA, "A") = "" Then
ixC = ixC + 1
wsB.Rows(ixB).Copy Destination:=wsC.Rows(ixC)
wsC.Rows(ixC).Interior.Color = 15773696
ixB = ixB + 1
Else
If wsA.Cells(ixA, "A") < wsB.Cells(ixB, "A") Or wsB.Cells(ixB, "A") = "" Then
ixC = ixC + 1
wsA.Rows(ixA).Copy Destination:=wsC.Rows(ixC)
wsC.Rows(ixC).Interior.Color = 255
ixA = ixA + 1
Else
ixC = ixC + 1
wsB.Rows(ixB).Copy Destination:=wsC.Rows(ixC)
For i = 1 To 6
If wsA.Cells(ixA, i) <> wsB.Cells(ixB, i) Then
wsC.Cells(ixC, i).Interior.Color = 65535
End If
Next i
ixA = ixA + 1
ixB = ixB + 1
End If
End If
Loop
wsA.Parent.Close SaveChanges:=False
wsB.Parent.Close SaveChanges:=False
End Sub

Function OpenFile(fn As String) As Worksheet
Set OpenFile = Workbooks.Open(Filename:=fn, ReadOnly:=True).Worksheets(1)
OpenFile.Sort.SortFields.Clear
OpenFile.Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With OpenFile.Sort
.SetRange Range("A:F")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Function
    • good
    • 0

良く判らなくなってきました。



①「*追加 行全体を水色塗りつぶし」とは
「ファイルA」に無くて「ファイルB」に有る行を「追加」する事ですか?

②「*削除 行全体を薄赤色塗りつぶし」とは
「ファイルA」と「ファイルB」に共通している行を「削除」ではなく、行全体を薄赤色塗りつぶす事ですか?

③「*変更 変更箇所のセルを黄色塗りつぶし」とは
どんな時に発生するのでしょうか?

④ 出来れば結果をどうしたいか?を実際にエクセルで表現した物をキャプチャして載せて頂けませんか?
☆以下キャプチャの仕方の説明です(500×500ピクセル以上だと縮小されてしまう為)
・シート全体を選択して「列」を「選択幅を合わせる」で列の幅を狭めてください。
・必要な箇所のみ表示出来ている状態までエクセルの右下の部分をドラッグしてエクセルの大きさを小さくします。
・[Alt]+[Print Screen]でキャプチャして、ペイントなどで「貼付」後「名前をつけて保存」した物をここに貼り付けて下さい。
    • good
    • 0

結果は下図のようにすればよいのですか?


ちなみに青塗りつぶしや赤塗りつぶしは字が見にくいので下図のように薄い色の方が良いかも?
「【VBA】異なる行だけを抜き出す数式/マ」の回答画像3
この回答への補足あり
    • good
    • 0

すみません。

くどいようですが、再確認します。
1.>①はおっしゃる通り、CC列が削除されるの間違いです。
ということでが、「BB列が削除され」が正しいのではないでしょうか。
もし、「CC列が削除される」が正しいすると、
「削除対象のデータ行を赤塗りつぶす、または行頭に-のような印を付ける」ということは、
ファイルA、およびファイルBの該当行を更新することになります。
ファイルA,ファイルBは、更新しないと思うのですが、いかがでしょうか?

2.>⑤削除対象のデータ行を赤塗りつぶす、または行頭に-のような印を付ける。新規作成も同様に青塗りつぶし、または行頭に+をつけられると有難いです。
についてですが、出力結果はCSVファイルになりますので、データ行に色を付けることは、できません。
それとも、このデータをexcelに取り込んで、excelの各シートの該当行に色を付けたいということでしょうか?

3.追加されたか削除されたの判断は、以下の基準でよいですか?
ファイルBの第1列の値(DD,EE,AA,CC)がファイルAの第1列の値(AA,BB,CC,DD)にないとき、
削除とする。(ファイルAから削除)
ファイルAの第1列の値(AA,BB,CC,DD)がファイルBの第1列の値(DD,EE,AA,CC)にないとき、
追加とする。(ファイルAへ追加)
この回答への補足あり
    • good
    • 0

① 念の為確認ですが「出来ればBB列が削除され、EE列が新規作成されたことが分かると嬉しいです。

」は「出来ればCC列が削除され、EE列が新規作成されたことが分かると嬉しいです。」の間違いですよね。
② 結果はソートされたものでも良いですか?
③ ファイルAとファイルB、それぞれ自ファイルでは重複ありますか?
④ 自ファイル内で重複が有った時はどうしますか?
⑤ 削除されたデータが判る様にとは具体的にどうするのですか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!