- ベストアンサー
エクセルのVBAでデータをコピーしたい
- エクセルのVBAを使用して、名前を基準にデータをコピーする方法を知りたいです。
- 1つのエクセルファイルには社員の名前とデータが複数書かれた行があり、もう1つのエクセルファイルには名前だけが入っています。名前を基準にして、前者のファイルから後者のファイルへ必要なデータをコピーしたいです。
- マクロを勉強中で、両方のファイルを開いて指定したセルをコピーすることはできますが、VLOOKUPのように該当するデータを選び出す方法がわかりません。どうすればよいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VBAを始めて間もないレベルの人がやる課題ではない。 また課題を文章にして、回答者に丸投げしただけだし。 ーー まあしかし、参考までにやってみた。 下記でも、長年の勉強の結果がいっぱい詰まっています。 ーー 部分氏名と全部氏名の2つのブックがあり 部分氏名.xls 例データ Sheet1 A2:A6 橋本 茂 山田 力 近藤 健二 北野 真二 小林 雅夫 -- 全部氏名.xls 例データ Sheet1.A1:B13 氏名 データ 橋本 茂 名古屋市 奥田 一 東京都 元田 清二 横浜市 山田 力 豊田市 森野 文雄 千葉市 近藤 健二 北九州市 植山 寛 さいたま市 原田 郁夫 新潟市 北野 真二 奥州市 皆川 俊夫 甲府市 小林 雅夫 仙台市 奥 実 八王子市 ーー 標準モジュールに Sub test01() Dim bk1 As Workbook Dim bk2 As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet Set bk1 = Workbooks("部分氏名.xls") Set bk2 = Workbooks.Open("C:\Documents and Settings\xxxx\My Documents\全部氏名.xls") Set sh1 = bk1.Worksheets("Sheet1") Set sh2 = bk2.Worksheets("Sheet1") '-- d1 = sh1.Range("A65536").End(xlUp).Row MsgBox d1 d2 = sh2.Range("A65536").End(xlUp).Row MsgBox d2 For i = 2 To d1 MsgBox sh1.Cells(i, "A") x = Application.WorksheetFunction.VLookup(sh1.Cells(i, "A"), sh2.Range("A1:B" & d2), 2, False) MsgBox x sh1.Cells(i, "B") = x Next i End Sub を入れて実行。ただしXXXXのところは、ユーザー名で置き換えること。 ーー 結果 部分氏名 Sheet1A2:B6 橋本 茂 名古屋市 山田 力 豊田市 近藤 健二 北九州市 北野 真二 奥州市 小林 雅夫 仙台市 ーー 両ブックのデータで氏名の表現の不一致や、誤って違ってしまっている氏名のものは知らないよ。 骨子はこんなものと思うが、実際にあわせてコードを修正できるのかな。
その他の回答 (2)
- hallo-2007
- ベストアンサー率41% (888/2115)
内容が、日々、頻繁に変更されるものでなければ、 後者のファイルのシート全てを、前者のファイルの別シートに コピペしてから、Vlookup関数ではだめですか。 どちらかと言うと 同姓、同名の場合 お互いのデータの氏名で、苗字と名前の間に、全角空白、半角空白など 違いがあった場合 こちらの場合は、心配ですが。
- merlionXX
- ベストアンサー率48% (1930/4007)
両方のファイルを開いているなら、VBAじゃなくともファイルをまたいでVLOOK関数を使えますよ。
補足
ご回答ありがとうございます。 ただ、後者のファイルについてはデータを入力するだけで 関数等を入れるわけにはいかないんです。 別シートに同じ形の表を作ってVLOOK関数を使い、 そこから値だけコピーするを繰り返している状態です。
お礼
短時間で完璧なご回答畏れ入ります。 明日からまたコピペの為に時間を取られるかと思うと 憂鬱でした。ありがとうございます。 VLookupそのものが使えるんですね。 氏名の部分を配列に入れて順に比較しなければならないかと 悪戦苦闘していました。 実際に処理するデータは手元にないので確認できませんが、 住所だけでなく複数種類のデータを追加して試してみましたところ 同様に動作させることが出来ましたので、 明日早速試したいと思います。 ご心配いただいた修正云々は得意です。 情けない話ですが、学生時代のC++の課題も不出来な為に 先達のコードを切り貼りして漸くにして切り抜けていた有様ですから… 最後に非常にシンプルかつ明快なコード、勉強になりました。