プロが教える店舗&オフィスのセキュリティ対策術

エクセルで作成した二つのDBがあります。それぞれ、列・行の数は異なるのですが、同じ名称の列(例えば郵便番号)を持っています。
この二つのファイルから、同じ列に同じ情報をもった行を取りだす、ということをしたいのですが、関数やマクロでの実現できる方法がございましたら、教えて頂けないでしょうか。
例:二つの住所録のようなファイルAとファイルBがあって、郵便番号が154-0001のデータ(行)を、別のファイルCに出力する。(また、ファイルC上では、各データがファイルAとファイルBのどちらから出力されたものかも、判別が付くように出力したい)

分かりにくいケースで大変恐縮ですが、ご存じの方がおりましたら、どうぞよろしくお願いいたします。
※エクセル2003を使用しています。

A 回答 (5件)

最近、ほぼ同様の質問に3件回答しています。


以下の最初は例を示しただけですが、後の
二つはコードを提示しています。3番目は
No4の回答が最終形です。

http://oshiete1.watch.impress.co.jp/qa6401016.html
http://oshiete1.watch.impress.co.jp/qa6439871.html
http://oshiete1.watch.impress.co.jp/qa6441019.html

縦のものを横に、あるいは横のものを縦に、
あるいは、Keyワードで検索し、データを
加工し、移動、などいろいいろですが、
実際には基本的なことは同じで、いくつか
細かい調整を行なえばデータが取れます。
ただ、細かい調整というのが曲者ですが。

今回の質問は他より少し複雑ですが。一応
動作しています。

方法は他にもあります。データ量が尋常でなければ
他の手段もありますが、ベタな方法ですが、
一応これで確認してみてください。

データの由来を表示したいということで
一番最後の列にそれぞれのデータの由来を
入れます。

一応、検索はA列を対象にします。

Sub test1()
Dim wkA As Workbook
Dim wkB As Workbook
Dim wkC As Workbook
Dim LA As Long
Dim RA As Long
Dim LB As Long
Dim RB As Long
Dim RC As Long
Dim xA As Long
Dim yA As Long
Dim xB As Long
Dim yB As Long

'変数の初期化
RC = 0

'Bookの設定
Set wkA = Workbooks.Open(ThisWorkbook.Path & "\ファイルA.xls")
Set wkB = Workbooks.Open(ThisWorkbook.Path & "\ファイルB.xls")
Set wkC = ThisWorkbook

'ファイルA、Bの最終行、最終列の取得
xA = wkA.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row '最終行
yA = wkA.Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column '最終列
xB = wkB.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row '最終行
yB = wkB.Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column '最終列

'ファイルAのデータを元にファイルBのデータを検索
'ファイルAのA列を検索
For RA = 1 To xA
'ファイルBのA列を検索
For RB = 1 To xB
'同じデータが見つかった場合の処理開始
If wkB.Sheets("Sheet1").Cells(RB, "A").Value = wkA.Sheets("Sheet1").Cells(RA, "A") Then
RC = RC + 1
For LA = 1 To yA
wkC.Sheets("Sheet1").Cells(RC, LA) = wkB.Sheets("Sheet1").Cells(RA, LA).Value
Next LA
'最後の列にA由来を表示
wkC.Sheets("Sheet1").Cells(RC, LA) = "A"

For LB = 1 To yB
wkC.Sheets("Sheet1").Cells(RC + 1, LB) = wkB.Sheets("Sheet1").Cells(RB, LB).Value
Next LB
'最後の列にB由来を表示
wkC.Sheets("Sheet1").Cells(RC + 1, LB) = "B"
RC = RC + 1
End If
Next RB
Next RA
End Sub

コードの張り間違いはないと思いますが、
一応動作を確認してください。

コードの内容の説明は最初に書いたリンク先の
2、3番目に書いてあります。内容的には
同じなのですが、もしわからないところが
あれば補足してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
私には難易度が高かったのですが、大変勉強になりました。
とても助かりました。

お礼日時:2011/01/15 15:21

肝心なことを書き忘れていました。


コードをファイルCの標準モジュールに
貼り付けて、ファイルCでマクロを
実行してください。

なお、ファイルのパスはファイルCと同じ
フォルダにあるという設定にしています。
    • good
    • 0
この回答へのお礼

追加説明、ありがとうございます。御丁寧にありがとうございました。

お礼日時:2011/01/15 15:22

ブック間やシート間において、同じ値の行や列があるかどうか、


大量データを扱う上で、これは頻繁に出くわす処置です。
似たケースで困った質問事例もあります。

以後同じようなことが起きても対処できるようやり方を考え、覚えることです。
郵便番号ではできたが、列の違う電話も同じようにしたいがわからなかった、
これでは質問した意味がない。
    • good
    • 0

>二つのファイルから、同じ列に同じ情報をもった行を取りだす、ということをしたい



>例:二つの住所録のようなファイルAとファイルBがあって、郵便番号が154-0001のデータ(行)を、別のファイルCに出力する。

上の説明は、2つの列に共通する種類の違う文字列を抽出したいということで、下の説明は、2つの列のデータから指定したデータ(同じデータが複数ある)を抽出したいということのように見えます。

2つの内容は全く別のことを説明しているように思いますが、このような場合は、元データのセル位置や集計後の結果の表示例など、実際のデータ例をあげて説明されたほうが皆さんから具体的な回答が得られやすいと思います。
    • good
    • 0
この回答へのお礼

ご助言、ありがとうございます。
今回、皆さんに頂いた回答を踏まえ、まず実践してみたいと思います。
その上で、また躓いてしまった時は、具体的な質問をいたします。
助かります。

お礼日時:2011/01/15 15:24

1つの次元に双方あれば比較可能です。



シート1の分にはA
シート2の分にはB

合わせると
1540001A
1540001B
1540002A

1540001A
1540002A

1540001B
1540002A

1540001が何行あるか
どのシート分かで判断できます。

これは手間ではありますが難しくない作業でしょう。
これを自動にもできますがそういうことでしょうか。手間でもやってみてからマクロでいいと思います。

DBというのはアクセスとかか。アクセスあればクエリ操作で可能です。
    • good
    • 0
この回答へのお礼

回答、ありがとうございました。
参考にマクロのことも調べてみたいと思います。

お礼日時:2011/01/15 15:25

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