2つのファイルを比較し、特定の条件(A,B,C列の一致など)を満たしている
レコード(行)を抽出する方法はありますでしょうか
例
※縦=行、横=列
Aファイル
1 2 3 4 5
1 あ い う ※ △
2 か き く ○ ◆
3 さ し す × ◇
Bファイル
1 2 3 4 5
1 あ い う × ○
2 か き く を ■
3 さ し す ヾ 〒
4 た ち つ ‖ 〆
5 な に ぬ 仝 ±
この場合、Bファイルの中からAファイルの1列〜3列と完全一致するレコード(行)を
抽出したいので、仮に抽出できた場合は、以下のレコード(行)
が抽出できるようになれば助かります。
*ファイル
1 2 3 4 5
1 あ い う × ○
2 か き く を ■
3 さ し す ヾ 〒
http://www.hondarer-soft.com/cx/pukiwiki/pukiwiki.php?Memo%2F200...
[hondarer-soft] to [cx20.main.jp]
試しにコードを書いてみました。
URL にサンプルプログラムを置いてあります。
ちょっと邪道ですが、ADO を利用して、Excel を DB として利用した方法です。
各ファイルの先頭には、項目行を設定しておく必要があります。
’ MatchData.vbs
’ Usage : CScript MatchData.vbs
Const strFileName1 = ”D:¥home¥edu¥hatena¥20040915¥db1.xls”
Const strFileName2 = ”D:¥home¥edu¥hatena¥20040915¥db2.xls”
Const strFileName3 = ”D:¥home¥edu¥hatena¥20040915¥db3.xls”
MatchData
Sub MatchData
Dim cn
Dim rs
Set cn = CreateObject(”ADODB.Connection”)
cn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & strFileName3 & ”;Extended Properties=Excel 8.0”
Dim strSQL
strSQL = ”INSERT INTO [Sheet1$]” & _
” SELECT t2.c1, t2.c2, t2.c3, t2.c4, t2.c5” & _
” FROM [Excel 8.0;database=” & strFileName1 & ”].[Sheet1$] AS t1” & _
” INNER JOIN [Excel 8.0;database=” & strFileName2 & ”].[Sheet1$] AS t2” & _
” ON (t1.c3 = t2.c3) AND (t1.c2 = t2.c2) AND (t1.c1 = t2.c1)”
Set rs = cn.Execute( strSQL )
End Sub
マクロを作ってみました
色々な条件で行の出力が出来ます
まずSheet1にCSVファイル1
まずSheet2にCSVファイル2をコピーします
表示>ツールバー>VisualBasicをチェックを入れてVisualBasicEditorのアイコンをクリック
MAXXとMAXYの値を入れます
最後に再生アイコンをクリックすると
Sheet3に条件に合致した行が出力されます
条件を
If DT1(1) = DT2(1) And DT1(2) = DT2(2) And DT1(3) = DT2(3) Then
にすれば列1〜3が同じという条件になります
Sub Macro1()
’
’ Macro1 Macro
’ マクロ記録日 : 2004/9/15 ユーザー名 : Aki
’
’
’横方向のセルの数
Const MAXX = 200
’縦方向のセルの数
Const MAXY = 10
Dim DT1(MAXX) As String
Dim DT2(MAXX) As String
Sheets(”Sheet3”).Select
Cells.Select
Selection.Clear
Range(”A1”).Select
L = 1
For Y = 1 To MAXY
M = 1
For X = 1 To MAXX
DT1(X) = Sheets(”Sheet1”).Cells(Y, X).Value
DT2(X) = Sheets(”Sheet2”).Cells(Y, X).Value
If DT1(X) <> DT2(X) Then M = 0
Next
’条件
’ 全セルの一致が条件
If M = 1 Then
’ 1,3列のセルの一致が条件
’ If DT1(1) = DT2(1) And DT1(3) = DT2(3) Then
’条件を満たした行の出力
For X = 1 To MAXX
Cells(L, X).Value = DT1(X)
Next
L = L + 1
End If
Next
End Sub
同じくまだ試していませんが、出来そうです(^^
#URLはダミーです。
エクセルのファイルをODBCに設定して、Accessなどのデータベースソフトからクエリをかけたらいかがでしょうか?
なるほど、確かに出来そうな気がするのですが
DBソフトに明るく無いんです(^^; でも
選択支のひとつとしては候補にあがると
思います。ありがとうございますー
http://www.hatena.ne.jp/1095238536#
csv形式(Excel等)のファイル操作の方法についてお伺い致します。 2つのファイルを比較し、特定の条件(A,B,C列の一致など)を満たしている レコード(行)を抽出する方.. - 人力検索はてな
URLはダミーです。1つのデータが一文字かどうかでも回答が変わるので、EXCEL上で各データがセルに割り振られたとして回答します。Aファイルをsheet1、Bファイルをsheet2、結果をsheet3に出力させます。sheet4のA1セルに[=if(sheet1!A1=sheet2!A1,1,0)+if(sheet1!b1=sheet2!b1,1,0)+if(sheet1!C1=sheet2!C1,1,0)]と入力して、レコードの数だけ縦に相対コピーします。sheet3のA1セルには[=if(sheet4!$A1=3,sheet2!A1,””)]を縦にレコードの数だけ、横にデータ数分だけ相対コピーします。完全一致しないレコードは空白となりますが、値コピーをして空白レコードを削除すれば一致レコード分だけ抽出できます。原始的な方法ですが、いろんな応用ができます。
基礎的な型として勉強させて頂きました。
実施に入力してみたところ、
レコード自体の一致だけではなく、
行数の一致も必要である為、
行がずれていると出力できない仕様なんですね。
私の説明不足なんで申し訳ないのですが、
行がずれている場合がほどんどのファイルに
なるので、残念ながら扱いきれなかったです。
ただ、VLOOKUP程度しか扱えない私にとっては
結構勉強になりましたので、感謝しております。
まだ試してはいませんが、十分できそうっすね(^^