Excel VBA vlookup使用date

我正在用三张纸。 工作表起始页的date从A4到lastrow。 我有一个从A11到最后一行的基金趋势表 。 vlookup根据起始页面中的date列表在基金趋势图表中searchdate 。 基金趋势报表中的search表范围范围(A11:C11)到拉斯特罗 。 当finddate时,它将抵消(3,0) ,并且该值将显示在图表“已发生的费用范围”(“C7”)中。 这将循环,直到纸张开始页A4中的lastrow

= VLOOKUP('起始页'!A4,'基金趋势'!A11:C21,3,0)

= VLOOKUP('起始页面'!A5,'Fund Trend'!A12:C22,3,0)

作为代码我没有成功:

Sub equity() Dim Nav_date As Date Dim equity As Integer Nav_date = Sheets("Start page").Range("A4") equity = Application.WorksheetFunction.VLookup(Nav_date,_ Worksheets("Fund Trend").Range("A11:C12"), 3, False) Sheets("Acurred Expenses").Range("C7") = equity End Sub 

我认为这个答案可以分解为三部分:正确引用Range对象的属性,检索最后一行数据,并使用循环

正确引用范围的值:


我注意到的第一件事就是你正试图把一个Datevariables赋值为一个Range对象。

这一行:

Nav_date = Sheets("Start page").Range("A4")

应该:

Nav_date = Sheets("Start page").Range("A4").Value

Range是具有属性和方法的对象。 你必须明确地参考你想要得到的范围。 这是价值,是单元格地址等

同样,下面重复这个不正确的语法。 该行:

Sheets("Acurred Expenses").Range("C7") = equity

应该:

Sheets("Acurred Expenses").Range("C7").Value = equity

编辑:每个评论whytheq提出了默认属性的点。 从技术上讲,代码Sheets("Acurred Expenses").Range("C7") = equity正确的,并将工作,因为范围的默认属性是Value 。 我倾向于更明确,但这是我个人的偏好,所以我总是使用Range.Value所以没有歧义。 无论哪种方式应该工作,但!

检索工作表的最后一行


要查找工作表中最后一次使用的数据行,我们可以从工作簿底部开始查找,直到find第一行(对应于工作表中最后一行数据)为止。

这个代码和激活列A中的最后一个单元格一样,按CTRL + SHIT +

 Sub LastRow() Dim lRow As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Debug.Print lRow End Sub 

重申一下,从最下面一行开始,一直向上,返回停止的行号。 这对应于列A中input的最后一个值。如果您的数据位于不同的列中,则可能需要更改A.

循环


最后,我们可以把我们学到的所有东西放在一起。 在你的lRow对应于你的数据集中的最后一行之后,我们可以像这样执行一下VLOOKUP

 Sub equity() Dim Nav_date As Date Dim equity As Integer Dim lRow As Long Dim i As Long lRow = Sheets("Start page").Cells(Rows.Count, 1).End(xlUp).Row For i = 4 To lRow 'Begin in Row 4 of the "Start page" sheet Nav_date = Sheets("Start page").Range("A" & i).Value 'Tell code to continue even if error occurs On Error Resume Next equity = Application.WorksheetFunction.VLookup(Nav_date, _ Worksheets("Fund Trend").Range("A11:C12"), 3, False) 'Check the results of the VLOOKUP, an error number of 0 means no error If Err.Number = 0 Then 'Here I use i+3 because the data started in row 7 and I assume 'it will always be offset by 3 from the "Start Page" Sheets("Acurred Expenses").Range("C" & i + 3).Value = equity End If 'Return to normal error handling On Error GoTo 0 Next i End Sub