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

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

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

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

Q&A

解決済

1回答

2062閲覧

【VBA】VLOOKUP関数で別シートに同じ値を貼り付けたい

koburon

総合スコア30

VBA

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

0グッド

0クリップ

投稿2023/01/16 02:35

編集2023/01/16 04:26

前提

VBAで任意の日付に異動した社員リストを出力するマクロを作っています。
使用するブックは1つで、シートは以下の2枚です。

  1. 社員マスタ
  2. 異動者リスト

『異動者リスト』A列に、ある日に異動した社員の『社員番号』を記入しています。
※『社員マスタ』『異動者リスト』の表はA列~EN列まであり、2行目の項目名は全て同じで、各セルは同じ列幅、同じフォントの大きさに調整しています。

【社員マスタ】
イメージ説明
【異動者リスト】
イメージ説明

実現したいこと

『社員マスタ』と『異動者リスト』A列を比較して社員番号が一致した場合のみ、『社員マスタ』のA列~EN列をコピーして『異動者リスト』に貼り付けて、最終行までこれを繰り返すコードにしたいです。
『社員番号を検索し出力するマクロ』はすでに作成しているので、ここではA列より右の値をコピー&ペーストするだけのマクロを作成します。

試したこと

下記2つのURLから、サンプルコードを組み合わせて作成しました。

該当のソースコード

VBA

1Sub 別のシートからVLookup() 2 Dim tbl As Range 3 Set tbl = Sheets("社員マスタ").Range("A3:B2191") 4 Dim key As Long 5 key = Range("A3").Value 6 7 On Error Resume Next 8 Dim ret As String 9 ret = WorksheetFunction.VLookup(key, tbl, 2, False) 10 11 '最終行を取得する 12 Dim LastRow As Long 13 LastRow = Worksheets("異動者リスト").Cells(Rows.Count, "A").End(xlUp).Row 14 15 'ループする 16 For i = 3 To LastRow 17 With Cells(i, "B") 18 19 'VLookup関数を計算する 20 .Offset(0, 1) = ret 21 End With 22 Next 23 24End Sub

発生している問題・エラーメッセージ

異動者リストのB列に氏名を入れたいのですが、上述のコードを実行すると、下の画像のように『異動者リスト』のC列にA3の社員番号に対応する社員の氏名が最終行まで連続して出力されてしまいました。
オフセットの数字の設定に問題があるとは思いますが、その解釈で合っているでしょうか。
また、この場合1列分しか出力できていないので、検索する右の範囲をEN列まで広げて、全てのセル値を貼り付けたいです。
イメージ説明
VLOOKUP関数にこだわらず範囲指定でコピー&ペーストする方法があれば、ご教示いただければ幸いです。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PC:Windows11
ソフト:Microsoft365 Excel
参考URL:

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

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

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

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

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

hatena19

2023/01/16 03:05

社員マスタと異動者リストの2行目の項目名は同じですか。
koburon

2023/01/16 03:43

はい、2行目のA列からEN列まで全て名前は同じです。
guest

回答1

0

ベストアンサー

vlookupは使用していませんが、以下でどうでしょうか。

VBA

1Sub 別のシートからVLookup() 2 Dim ws1 As Worksheet 3 Dim ws2 As Worksheet 4 Dim lastRow1 As Long 5 Dim lastRow2 As Long 6 Dim row1 As Long 7 Dim row2 As Long 8 Set ws1 = Worksheets("社員マスタ") 9 Set ws2 = Worksheets("異動者リスト") 10 11 '最終行を取得する 12 lastRow1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row 13 lastRow2 = ws2.Cells(Rows.Count, "A").End(xlUp).Row 14 15 'ループする 16 For row2 = 3 To lastRow2 17 For row1 = 3 To lastRow1 18 If ws2.Cells(row2, 1).Value = ws1.Cells(row1, 1).Value Then 19 ws2.Cells(row2, 2).Resize(, 143).Value = ws1.Cells(row1, 2).Resize(, 143).Value 20 Exit For 21 End If 22 Next 23 Next 24 25End Sub 26

投稿2023/01/16 06:26

tatsu99

総合スコア5438

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

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

koburon

2023/01/16 07:08

回答ありがとうございます。 ループを2回行わせる方法がよく理解できていなかったので助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問