質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

526閲覧

複数列、複数行にわたって合致する名前に対応する値を別ファイルから取得する

opsy

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2022/06/29 06:43

編集2022/06/30 17:42

VBA初心者です。
何卒ご教示をいただきたく、宜しくお願い申し上げます。

B2セルの名前について、別ファイルを参照し、
その別ファイルのB列から合致した名前を検索、
その別ファイルの対応するY列とZ列の値を
C列およびD列に記入するマクロを組みたいと考えています。
なお、別ファイルの対応するY列とZ列の値は複数ありますので、
C列およびD列は複数行記入されることを想定しています。
コードをインターネットで見よう見まねで書いてみたのですが、
対応する値がそもそも記入されないという状況です。
さらに複数列、複数行となると、どこをどう記載してよいものか、手が付けられていません。

※下記ご参考までに現在書いてみたコードを記載いたします。

VBA

1Option Explicit 2 3Sub 検索() 4 5 Dim res As Worksheet 6 Dim z As Long 7 Set res = Worksheets("検索") 8 z = res.Cells(res.Rows.Count, "A").End(xlUp).Row 9 10Debug.Print res.Name, z 11 12 Dim sPath As String, fn As String 13 Dim wb As Workbook 14 Dim ws As Worksheet 15 Dim rng1 As Range, rng2 As Range 16 With Application.FileDialog(msoFileDialogFilePicker) 17 .Show 18 If .SelectedItems.Count = 0 Then Exit Sub 19 sPath = .SelectedItems(1) 20 End With 21 For Each wb In Workbooks 22 If wb.Name = fn Then Exit For 23 Next wb 24 If wb Is Nothing Then 25 Set wb = Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) 26 End If 27 Set ws = wb.Worksheets("p_data") 28 Set rng1 = ws.Range("B1:C" & ws.Cells(ws.Rows.Count, "C").End(xlUp).Row) 29 Set rng2 = ws.Range("Y1:Z" & ws.Cells(ws.Rows.Count, "Z").End(xlUp).Row) 30 31Debug.Print wb.Name, ws.Name, rng1.Address, rng2.Address 32 33 Dim i As Long 34 Dim x As String 35 For i = 2 To z 36 '氏名の値を取得 37 x = res.Cells(i, 2).Value 38 '送付先分類の値を表示 39 With Application.WorksheetFunction 40On Error Resume Next 41 res.Cells(i, 3).Value = .Index(rng1, .Match(x, rng2.Value, 0), 1) 42On Error GoTo 0 43 End With 44 45Debug.Print i, x, ws.Name, res.Cells(i, 2).Value 46 47Next 48 49End Sub

分からないことばかりでお恥ずかしい限りですが、
何卒お力添えいただければ幸いです。
宜しくお願い申し上げます。

※追記
質問に目を通していただきまして、誠にありがとうございます。

検索シート、別ファイルのシート、のデータ例
処理後の検索シートの結果、

上記につきまして、画像を添付いたします。
イメージが湧きますでしょうか。
恐れ入りますが、宜しくお願い申し上げます。

●検索シート
イメージ説明

●別ファイルのシート(氏名・会社名等は白で塗りつぶしています)
イメージ説明

●処理後の検索シート
イメージ説明

お手数お掛けいたしますが、何卒ご教示の程、宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2022/06/29 07:12

検索シート、別ファイルのシート、のデータ例 処理後の検索シートの結果、 が分かるような画像を貼り付けもらうと回答が付きやすいかと。
opsy

2022/06/29 07:38

コメントありがとうございます。 イメージ画像を追記させていただきました。
hatena19

2022/06/29 08:34 編集

提示の画像だと、検索シートの名前は1件だけですが、実際は複数ありますよね。 検索結果が複数の場合は、空行を挿入して、そこに結果を表示させるということですか。 名前 検索 太郎    検索 次郎 となっているとして、結果は、 名前 検索 太郎 CO  2004/3/24          SiSC 2004/5/7    検索 次郎 CO  2004/6/20 ということでしょうか。
opsy

2022/06/29 08:41

すみません、言葉足らずでした。 実際に検索を行う名前は1件ずつで、例えば「検索太郎」ですので、 「検索太郎」のマッチしたデータが2行、3行にきてしまって問題ありません。 (「検索次郎」を同時に検索することはないということです)
guest

回答3

0

Sub 検索() Dim res As Worksheet, wFind As Range Set res = ThisWorkbook.Worksheets("検索") Set wFind = res.Range("B2") Dim sPath As String With Application.FileDialog(msoFileDialogFilePicker) .Show If .SelectedItems.Count = 0 Then Exit Sub sPath = .SelectedItems(1) End With Dim wb As Workbook For Each wb In Workbooks If wb.FullName = sPath Then Exit For Next wb If wb Is Nothing Then Set wb = Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) End If Dim ws As Worksheet For Each ws In wb.Worksheets If ws.name = "p_data" Then Exit For Next ws If ws Is Nothing Then Exit Sub Dim c As Range, r As Long For Each c In ws.UsedRange.Columns("B").Cells If c.Value = wFind.Value Then wFind.Offset(r, 1).Resize(, 2).Value = c.Offset(, 24).Resize(, 2).Value r = r + 1 End If Next End Sub

投稿2022/06/29 23:46

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

opsy

2022/06/30 08:42

ご回答、誠にありがとうございます。 コードのご提示、重ねて感謝申し上げます。 色々なアプローチ方法があるんですね。 大変勉強になりました。 また何かありました際には、恐れ入りますが、宜しくお願い申し上げます。
guest

0

ベストアンサー

あなたのソースを修正してみました。

VBA

1Sub 検索() 2 3 Dim res As Worksheet 4 Dim z As Long 5 Set res = Worksheets("検索") 6 Dim name As String 7 '検索 名前取得 8 name = res.Cells(2, "B").Value 9 z = res.Cells(res.Rows.Count, "A").End(xlUp).Row 10 11 Debug.Print res.name, z 12 13 Dim sPath As String, fn As String 14 Dim wb As Workbook 15 Dim ws As Worksheet 16 Dim rng1 As Range, rng2 As Range 17 With Application.FileDialog(msoFileDialogFilePicker) 18 .Show 19 If .SelectedItems.Count = 0 Then Exit Sub 20 sPath = .SelectedItems(1) 21 End With 22 For Each wb In Workbooks 23 If wb.name = fn Then Exit For 24 Next wb 25 If wb Is Nothing Then 26 Set wb = Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) 27 End If 28 Set ws = wb.Worksheets("p_data") 29 Dim maxrow As Long 30 Dim wrow As Long 31 Dim res_row As Long 32 'B列 最終行取得 33 maxrow = ws.Cells(Rows.Count, "B").End(xlUp).Row 34 res_row = 2 35 '2~最終行まで繰り返す 36 For wrow = 2 To maxrow 37 '検索対象名前と一致していれば 38 If ws.Cells(wrow, "B").Value = name Then 39 '送付分類と発送日を設定 40 res.Cells(res_row, "C").Value = ws.Cells(wrow, "Y").Value 41 res.Cells(res_row, "D").Value = ws.Cells(wrow, "Z").Value 42 res_row = res_row + 1 43 End If 44 Next 45 If res_row = 2 Then 46 MsgBox ("該当なし") 47 Else 48 MsgBox ("完了") 49 End If 50 51 52End Sub 53

投稿2022/06/29 09:11

tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

opsy

2022/06/29 09:24

迅速なご回答、誠にありがとうございます。 また、コードのご提示、重ねて感謝申し上げます。 このような解決法があったとは、目からウロコです。 そして、動作が正常に行われることを確認いたしました。 僭越ながらベストアンサーとさせていただきます。 また何かありました際には、恐れ入りますが、宜しくお願い申し上げます。
guest

0

回答ではありません。補足要求です。
イメージ説明
添付図のようにB列に検索対象の名前が並んでいると、
検索太郎のマッチしたデータが2行、3行に(送付先分類=CO,SiSC)あります。
次に徳川家康で、もしマッチしたデータが2件あれば、4行(C4,D4)、5行(C5,D5)に書き込めば良いのでしょうか。そうだとすると、名前と送付先分類の対応が判らなくなりますが、それでよいのでしょうか。

投稿2022/06/29 08:30

tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

opsy

2022/06/29 08:36

すみません、言葉足らずでした。 実際に検索を行う名前は1件ずつで、例えば「検索太郎」ですので、 「検索太郎」のマッチしたデータが2行、3行にきてしまって問題ありません。 (「徳川家康」「織田信長」を同時に検索することはないということです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問