在VBA

2017-09-03 50 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

非常感谢! –