Excel VBA 使用日期进行 vlookup

Excel VBA vlookup using Dates

我正在与 三个 sheets 一起工作。 作品sheet 起始页 的日期从 A4 到最后一排。我有一个 基金趋势 sheet,日期从 A11 到最后一行。 vlookup 是根据起始页 sheet 中的日期列表 在基金趋势 sheet 中搜索日期 。基金趋势sheet中的搜索table范围范围(A11:C11)到最后一列。当找到日期时,它 offsets (3,0),显示的值是 sheet Acurred Expenses Range("C7").这将循环到sheet起始页A4的最后一行

=VLOOKUP('Start page'!A4,'Fund Trend'!A11:C21,3,0)

=VLOOKUP('Start page'!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对象的属性、检索最后一行数据以及使用循环

正确引用范围值:


我注意到的第一件事是您试图将 Date 变量分配为 Range 对象。

这一行:

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

应该是:

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

A Range 是一个具有属性和方法的对象。您必须明确引用 what 它是关于您想要获得的范围。它是值,它是单元格地址等

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

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

应该是:

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

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

正在检索工作表的最后一行


要找到工作表中最后使用的数据行,我们可以从工作簿的底部开始,"look up"直到找到第一行(这将对应于数据的最后一行在工作表中)。

此代码与激活 A 列中的最后一个单元格并按 CTRL+Shit+[=72= 相同]↑

Sub LastRow()

    Dim lRow As Long

    lRow = Cells(Rows.Count, 1).End(xlUp).Row

    Debug.Print lRow

End Sub

重申一下,这从最底行开始一直向上,返回停止位置的行号。这对应于 A 列中输入的最后一个值。如果您的数据在不同的列中,您可能需要更改 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