|
▼TODD さん:
まず col は、1行目の右端(XFD1)から左にみて最後にデータがある列番号。
つまり、このリストの一番右の列になりますね。
で、Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp))
これは、その列の 1行目のセルからから、その列のデータ最終セルまでの領域。
かりに、2回目の場合、colが 9(つまりI列)で、I列のデータ最終行が20行目だとすると
この領域は I1:I20 になりますね。それを左に3つ広げますので I1:K20 つまり
2回目の領域全体になります。
そうしますと adr1 = .Cells(1).Address(False, True)
これは I1:K20の領域の最初のセル つまり I1。このアドレス文字列を取得しています。
この時、行は相対表示、列は絶対表示という指定(False,True) をしていますので
adr1 に格納される文字列は $I1 になります。
もう1つ adr0 文字列を説明しておきます。
adr0 = Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 3).Address
かりに A列データ最終行が 20 なら A1:C20 になるわけですが Address取得時の
相対、絶対 を省略しています。省略した場合絶対になります。
したがって $A$1:$C$20 になっています。
で、処理としては 『ある領域』に数式を埋め込んでいます。
この場合、ある領域 の左上隅にセットする数式を与えると、
シート上で右に、下にフィルコピーした場合に、式の中身が相対的に変化しますけど
それと同じ状態でセットされます。
ある領域 というのは
With Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Resize(, 3)
つまり、I1:K20 これの .Columns("B:C") これは2番目と3番目の列ということになりますので
J1:K20 ですね。
この左上隅のセル つまり J1 に
"=IFERROR(VLOOKUP(" & adr1 & "," & adr0 & ",COLUMN(B1),FALSE),""登録なし"")"
こんな式をセットしています。
変数 adr1 や adr2 を 上で説明した例になおしますと
=IFERROR(VLOOKUP($I1,$A$1:$C$20,COLUMN(B1),FALSE),"登録なし")
こうなります。
Columns(B1) って 2 ですから、この式は
=IFERROR(VLOOKUP($I1,$A$1:$C$20,2,FALSE),"登録なし")
これを右に(つまりK1)にフィルコピーすると
=IFERROR(VLOOKUP($I1,$A$1:$C$20,COLUMN(C1),FALSE),"登録なし")
つまり =IFERROR(VLOOKUP($I1,$A$1:$C$20,3,FALSE),"登録なし")
になりますね。
いずれにしても J1 に
=IFERROR(VLOOKUP($I1,$A$1:$C$20,COLUMN(B1),FALSE),"登録なし")
を入れて、これうぃK列にフィルコピーした後下にフィルコピーしてみてください。
どのように式が変化するか、よくわかると思います。
|
|