【VBA】[XLOOKUP] で別表からデータを転記する

PC業務において、さまざまな場面で活躍する
関数 [INDEX+MATCH] or [VLOOKUP]ですが、
2021年のアップデートで使用できるようになった

関数【XLOOKUP】

は、非常に使い勝手が良いのです。
別表(別ブック)からデータを転記させるPC作業においても、
[XLOOKUP] を使い始めている方は多いのではないでしょうか?

今回はVBA上で [XLOOKUP] 関数使って、
別表(別ブック)からデータを転記させるVBAコードを、
例題を用いて記載しようと思います。
 

広告

どんなメリットがあるか?

このコードによって得られることは以下の事かと思います。

◆参照先の元データをわざわざ開かなくて良い
参照先の元データは大概、容量が大きいのではないでしょうか?
データ編集のたびに元データを開いて非常に時間が掛かり、イライラする。
こんなお悩みをお抱えではないでしょうか?
◆数式を記入せずに、自動でデータを任意のセルに持って来れる
長い数式を毎回入力して手間だ。
提出資料だから数式を無くす為に、ひと手間かけている。

こんなお悩みをお抱えではないでしょうか?

今回ご紹介するサンプルコードはこれらの悩みを解消してくれるでしょう。
参照元の重いファイルを開かずにデータが持って来れるので非常に楽です。
「別Bookを開かなくて良い」という事は、
「別Bookを探す手間も無い」という事なので、これだけでも時短必須です。

また引抜いてくるデータは「値」のみなので、
処理後、数式を解除する必要はありません。
コード実行後、そのまま誰かに提出しても問題無いです。

[XLOOKUP] はもちろん、
[INDEX+MATCH] or [VLOOKUP]を多用する方で、
同じような悩みを持った方が、
解決の方向へ向かうお手伝い出来たなら幸いです。
 

例題とサンプルコード

VBA_XLOOKUP_別Bookから転記_1
例えば、『単価表』のシート [List1] から該当データを『記入用』のシート [売上明細] へ転記する場合

上のExcel画面の
Excel-Workbook『記入用』 のセル【C2~D11】に
Excel-Workbook『単価表』 から関数[XLOOKUP]で
必要なデータを転記する・抜き出してくる
エラーが出る場合は「無」と記入する
 

サンプルコードと簡単な解説

Application.ScreenUpdating = False    '画面凍結
Dim A, B As String
Dim myBook As Workbook
Dim mySht1, mySht2 As Worksheet
Dim myRng1, myRng2, myRng3 As Range
Dim result As Variant
Dim i, EndLine As Long
A = "売上明細"
B = "List1"

Set mySht1 = Workbooks("記入用").Worksheets(A)

Set myBook = Workbooks.Open("C:¥※※※¥単価表.xlsx")
Set myRng1 = myBook.Sheets(B).Range("A:A")  '検索範囲(商品名)★①
Set myRng2 = myBook.Sheets(B).Range("B:B")  '戻り値1(単価) ★①
Set myRng3 = myBook.Sheets(B).Range("C:C")  '戻り値2(産地) ★①

  mySht1.Activate
 
If mySht1.Range("B2").Value <> "" Then
  EndLine = Cells(Rows.Count, 2).End(xlUp).Row      '最終行の取得

'単価の転記★②
  For i = 2 To EndLine
    result = Application.XLookup(mySht1.Cells(i, 2), myRng1, myRng2, "無", 0, 1)
    mySht1.Cells(i, 4) = result
  Next i

'産地の転記★②-2
  For i = 2 To EndLine
    result = Application.XLookup(mySht1.Cells(i, 2), myRng1, myRng3, "無", 0, 1)
    mySht1.Cells(i, 3) = result
  Next i

End If

  myBook.Close    '『単価表』を閉じる★③

Application.ScreenUpdating = True      '画面凍結解除

上がサンプルコード例になります。

簡単な解説

大まかな流れとしては

1.最終行を取得する。→何行目まで関数 [XLOOKUP] を用いるか…(Endlineの部分)
2.[For Next] を使用し、最終行まで関数 [XLOOKUP]を繰り返し行う
3.『単価表』のbookを閉じる

実際の処理フローを画面で見てみましょう。
以下のようになります。
これでイメージがつかめれば幸いです。
 

VBA_XLOOKUP_別Bookから転記_2
何行目まで処理をするかを決める。つまり最終行を取得する
VBA_XLOOKUP_別Bookから転記_3
指定のBookを開く。例題では『単価表』
VBA_XLOOKUP_別Bookから転記_4
最終行までXLOOKUPを繰り返す

ポイントとしてはソースコードの「※※※」の部分です。
ここにはデータを参照したいBook
(関数 [XOOKUP] の参照先Book)の在り処を記載します。
「※※※」には『住所』を入力するような感じでとらえて下さい。
その”住所”の調べ方は

該当のファイルを [右クリック] → [プロパティ]

これで住所は特定分かります。その後は

「上の画像の箇所①+ブック名②+.ファイルの拡張子( [.xlsx] 等)」を入れ込みます。
【場所:】以降の箇所をコピペして、
VBAコードを入力するところに貼り付け
(下記の画面をご参照ください)

 

VBA_XLOOKUP_別Bookから転記_6
転記したいデータがあるExcelBookを「右クリック」→「プロパティ」
VBA_XLOOKUP_別Bookから転記_7

これでOKです。↑のサンプルコード「※※※」部分に
「C:¥※※※¥Desktop¥新しいフォルダ¥Book1.xlsx」等と入力します。
住所は[“”]で囲むことを忘れずに!

続いて関数 [XLOOKUP] を用いて元データから必要項目を抜き出します。
その為に、あらかじめ引用箇所・必要箇所をRange型変数に格納します。
(★①のSet myRng…)
こうしておくとコードがきれいに整理され、再編集の際も楽になります。

あとは【For Next】のループを使い、今回必要なデータ(単価)を全て
[XLOOKUP] 関数を当てて抜き出します。(★②あたり)
最後に、転記するデータが記載されている『単価表』を閉じて終了です。(★③)

こんな調子で意外と簡単にVBAは組めます。
 

VBA_XLOOKUP_別Bookから転記_5
コードを実行すると一瞬で転記されます。5秒と掛からない量です。

上のソースコードを参考に、
御自身の状況に合わせてご活用下さい。
 

(同一Bookから)引抜きたいデータが2種類以上ある場合

[XLOOKUP]で引抜きたいデータが2つ以上ある場合は、
【For Next】のループ箇所を増やすだけです。(★②部分)
例題的に言えば、『単価』の他に『産地』も
同一のBookから抜き出す場合等です。

↑のサンプルコードではD列の『単価』に加えて
C列の『産地』を引抜いていますので参考になれば幸いです。(★②-2の箇所)

また、仮に産地がさらに別のBookに格納されていた場合でも、
基本的な構造は一緒で、[Set myBook] ~ [End If] の部分がもう一つある

といった感じになります。
 

共有サーバーのファイルからも転記可能

ちなみにちなみに、この要領でやれば、共有サーバーに格納されているファイルを開き、必要なデータを楽々転記させる事も可能です。

『「※※※」の部分にどのように記載すれば良いか』は、
(共有サーバー上でも)同じく該当のファイルを[右クリック] → [プロパティ]を選択
「【場所:】以降の箇所+ブック名+ファイル拡張子」
としてコードを入力・貼り付ければOKです。

 ※但し、サーバーに格納されているbookからデータを引抜く場合は、サーバーにアクセスできるネット環境下でコードを実行する必要が出てきます。

皆さんの業務効率化が図れれば幸いです。

広告