デートに注意!
MOUG(Excel VBA)2008/03/28 07:23:50
『VLOOKUP関数にて悩みがございます』
http://www2.moug.net/bbs/exvba/20080328000002.htm
現在Sheet1に下記の関数が入っております。 =VLOOKUP(DATE($A$1,$B$1,C6),Sheet2!$A:$H,7,FALSE)
これを VBA のコードで書くとどうなるか?というのが質問です。
そのまんま VBA のコードにするなら、DATE関数を VBAライブラリのDateSerial関数にして、VLOOKUP関数を Application.VLookup にして
Sub TestNG() Dim Re As Variant Re = Application.VLookup _ (DateSerial(Sheet1.Range("A1").Value _ , Sheet1.Range("B1").Value _ , Sheet1.Range("C6").Value) _ , Sheet2.Range("A:G"), 8, False) If IsError(Re) Then MsgBox "#N/Aエラー" Else MsgBox Re End If End Sub
とすればいいんじゃないかと思ってしまいます。
# コードを短くするために シートはオブジェクト名と名前が一致する前提にしてます。
でも、これはダメなのです。
ワークシート関数ではうまくヒットするはずでも、VBAでは #N/Aエラーになります。
DateSerial関数は、Date型(ヘルプによると「内部処理形式 Date の Variant」)を返します。
そして、VBAで使うときは VLookup の第一引数は、Date型はNGだからです。
なので、Double型で VLookup に渡してやるようにすればいいです。
という訳で、回答したコードはコチラ↓。
Sub TestRes() Dim Arg1 As Double Dim Arg2 As Range Dim Re As Variant With Worksheets("Sheet1") Arg1 = DateSerial(.Range("A1").Value _ , .Range("B1").Value _ , .Range("C6").Value) End With Set Arg2 = Worksheets("Sheet2").Range("A:G") Re = Application.VLookup(Arg1, Arg2, 7, False) If IsError(Re) Then MsgBox "#N/Aエラー" Else MsgBox Re End If End Sub
ぐだぐだと解説はしなかったけど、質問者はどこまで理解してくれるでしょうか?
まぁ、とりあえずは、
DATE関数 → VBAライブラリのDateSerial関数
VLOOKUP関数 → Application.VLookup
であることと、その引数の書き方が伝われば御の字かなと思います。
P.S.
自分のサイトの整備をしていて、ちょうど VLOOKUP関数を書いたばかりなので、リンクを張っておこうかと思ったけど、止めました。
Value2 とは何ぞや?ってことを知らないと話がつながらないので。
http://homepage3.nifty.com/belie/func/FUNC_VLookup.htm
※.Excel World の 2008年3月28日 23:49 の日記をコピーしています。
http://excel.sns.fc2.com/excel/