日期查找问题:无法获取WorksheetFunction类的VLookup属性

时间:2014-07-03 06:10:29

标签: vba date runtime-error vlookup

我在大多数其他类似类型的问题中尝试了几乎所有的东西,但我似乎无法解决运行时错误。请帮忙!

我想要实现的目标: 1)我的宏应该从每天创建的报告摘要文件中获取日期,因此需要用户输入他想要数据的报告日期 2)我使用vlookup方法从相关行获取数据并使用宏将其输入到中央工作簿 3)代码的每个部分都工作,除了使用Vlookup的日期,它会给我这个错误信息 4)我已经使用其他基于文本的查找值测试了代码,并且整个宏工作(即我查找了具有“总计”值的行,因此它查找“总计”但我需要宏查找行日期作为查找值)

附加信息: 1)在查找文件中,日期格式为“m / d / yyyy”,但格式为“dd-mmm-yy”(但我已尝试过两种,但它们不起作用)

Sub GetData()

Dim strDate As Date
  strDate = InputBox("Input date of report to retrieve        (Format: DD-MM-YYYY)", "Input Date", Format(Now(), "DD-MM-YYYY"))
  If IsDate(strDate) Then


'there is some code here not relevant but basically i need to keep manipulating the date throughout the code


With ActiveSheet
    Dim XstrDate
    Dim Xfile As String

    XstrDate = Format(strDate, "mmm DD, YYYY")
    Xfile = "C:\...\...\...\Report " & XstrDate & ".xls"


Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim returnValue as Variant

Set wb = Application.Workbooks.Open(Xfile)
Set ws = wb.Worksheets("Summary")
Set rng = ws.Range("A:K")


Dim Xdate As String
    Xdate = Format(XstrDate, "m/d/yyyy")

returnValue = Application.WorksheetFunction.VLookup(Xdate, rng, 2, 0)

'... more code

记住,我已经尝试查找同一列中的文本,它返回了一个值。所以我怀疑问题在于日期格式或其他什么

任何聪明善良的灵魂都想在这里提出一些建议:)

2 个答案:

答案 0 :(得分:0)

Excel内部将日期存储为序列号(例如1/1/2014 = 41640),如果您在单元格中输入日期然后将格式更改为数字,则可以自行观察。

考虑到这一点,使用VLookup功能不太可能匹配VBA日期和Excel日期,因此根据我的经验,最佳解决方案是将日期转换为序列号,然后执行VLookup相反,这个价值。

Dim Ndate As Long
Dim returnValue As Date

Ndate = DateSerial(<Year>, <Month>, <Day>)
returnValue = Application.WorksheetFunction.VLookup(Ndate, <rng>, <col>, False)

如果您需要在VBA中的DateSerial(...)变量中构建Date函数,可以使用Year(<date>)Month(<date>)Day(<date>)函数来中断它归结为所需的组件。

注意:我已经以格式 .VLookup(DateSerial(2014,1,1),...) 尝试了此示例,但仍然会导致相同的错误,因此将DateSerial的返回值存储在数字变量中第一

快乐的编码!

答案 1 :(得分:0)

我采取了不同的方法,并找到了解决此问题的另一种方法。 而不是使用Vlookup,这是绕过VLookup日期格式问题的另一种方法,(在之前的语句中定义了vdate)

Dim rnge As Range, i As Long
Sheets("Summary").Select
Columns("A:A").Select
Set rnge = Intersect(Selection, ActiveSheet.UsedRange)
If rnge Is Nothing Then
     MsgBox "Date Not Found"
     GoTo done
End If


For i = rnge.Count To 1 Step -1
If rnge.Cells(i).Value = vdate Then rnge.Cells(i).EntireRow.Copy _
Destination:=ThisWorkbook.Sheets("AnotherSheet").Range("A1")
Next

done:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True