在VBA

2017-09-03 52 views
2

使用VLOOKUP()我們有一個短表像一個工作表:通過A1在VBA

enter image description here

值A3的是這些公式的結果:

=DATE(1999,12,15) 
=DATE(1945,1,18) 
=DATE(2020,2,23) 

如果我嘗試在工作表單元格中使用VLOOKUP()

=VLOOKUP(DATE(1945,1,18),A1:B3,2) 

我得到正確的結果(MOE)

enter image description here

然而,在VBA:

Sub RetrieveName() 
    Dim d As Date, nam As String, rng As Range 
    d = DateSerial(1945, 1, 18) 
    Set rng = Range("A1:B3") 
    nam = Application.WorksheetFunction.VLookup(d, rng, 2) 
    MsgBox nam 
End Sub 

我得到一個錯誤:

enter image description here

我們目前的解決方法是使用:

Sub RetrieveName2() 
    Dim d As Long, nam As String, rng As Range 
    d = 16455 
    Set rng = Range("A1:B3") 
    nam = Application.WorksheetFunction.VLookup(d, rng, 2) 
    MsgBox nam 
End Sub 

對於我的生活,我看不出有什麼不對的原代碼?

+1

聲明d爲double並使用'cdbl(dateserial(1945,1,18))'。不知道爲什麼,但我認爲vba將日期視爲一個字符串,並且輸入的值是來自工作表的一個數字。 –

+0

@ScottCraner你是對的....雙'和'長'工作..........我只是不知道爲什麼轉換是必要的? –

+3

或者您可以將d保留爲Date,但在調用VLOOKUP時使用cDbl(d)。我懷疑原因是Excel試圖將日期變量轉換爲Excel日期,這不是本機數據Excel數據類型,而是一個伴隨格式化指令的雙精度型:如果將d作爲日期直接傳遞給使用範圍的範圍。它將值作爲數字傳遞並將其格式化爲日期。如果使用Range.Value2,它會以excel的形式顯示爲沒有日期格式的數字。 –

回答

2

Scott Craner在將VBA日期傳遞給VLOOKUP之前將VBA日期轉換爲雙精度是正確的。
我認爲問題在於Excel和VBA使用Range.Value規則將值傳遞迴VLOOKUP函數。 Excel沒有真正的日期數據類型 - Excel中的日期是伴有日期格式的雙打。 Range.Value試圖將格式爲日期的Excel數字轉換爲VBA日期,反之亦然,但將VLBA日期傳回給Excel時,VLOOKUP不理解伴隨格式代碼的數字。

Sub RetrieveName() 
    Dim d As Double, nam As Variant, rng As Range 
    d = DateSerial(1945, 1, 18) 
    Set rng = Range("A1:B3") 
    nam = Application.WorksheetFunction.VLookup(d, rng, 2) 
    MsgBox nam 
End Sub 

Sub RetrieveName2() 
    Dim d As Variant, nam As Variant, rng As Range 
    ' 
    ' note Range("a2").value will fail 
    ' 
    d = Range("a2").Value2 
    Set rng = Range("A1:B3") 
    nam = Application.WorksheetFunction.VLookup(d, rng, 2) 
    MsgBox nam 
End Sub 
+0

非常感謝! –