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
我正在与 三个 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