我在大多数其他类似类型的问题中尝试了几乎所有的东西,但我似乎无法解决运行时错误。请帮忙!
我想要实现的目标: 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
记住,我已经尝试查找同一列中的文本,它返回了一个值。所以我怀疑问题在于日期格式或其他什么
任何聪明善良的灵魂都想在这里提出一些建议:)
答案 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