デートに注意!

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/