努力弄清楚如何在Excel VBA中编写以下内容:
=LOOKUP(2,1/(A:A=K8),F:F)
我目前的尝试是这样的:
Application.lookup(2, [1 / (dates = (lookupDate + lookupModifier))], balances))
当我突破到数组公式时,我得到一个#VALUE错误,作为查找的一部分,我得到#NAME。
最初的公式来自一个没有特别解释中心参数的网站,而我理解它的作用我不确定它的正确术语,所以道歉。
完整的参考公式:
Option Explicit
Public Function GetWeekEndBalanceFromStatement(lookupDate As Double, dates As Range, balances As Range) As Variant
Dim lookupModifier As Integer
Do While IsError(Application.lookup(2, [1 / (dates = (lookupDate + lookupModifier))], balances)) And lookupModifier > -7
lookupModifier = lookupModifier - 1
Loop
GetWeekEndBalanceFromStatement = Application.lookup(2, [1 / (dates = (lookupDate + lookupModifier))], balances)
End Function
答案 0 :(得分:1)
在您的VBA代码中,[...]
是Evaluate
的快捷方式,其中[
]
内的内容实际上是您在Excel公式栏中输入的内容。
在这种情况下,dates
和lookupDate
是函数的参数,`lookupModifier是一个局部变量,Excel不知道,因此会导致错误。
您可以使用Worksheet.Evaluate
,因为这会带一个字符串参数,您可以使用函数Parameter.Address
创建
所以,改变
Application.Lookup(2, [1 / (dates = (lookupDate + lookupModifier))], balances)
到
Application.Lookup(2, dates.Worksheet.Evaluate("1 / (" & dates.Address & " = (" & lookupDate & " + " & lookupModifier & "))"), balances)
此外,如果要传递整列(如在示例中),这在VBA中效率低下。您可以将这些范围减少到仅包含数据的单元格,例如
If IsEmpty(dates.Cells(dates.Cells.Count)) Then
Set dates = dates.Resize(dates.Cells(dates.Cells.Count).End(xlUp).Row, 1)
End If
类似于balances
要增加灵活性,请将此更改视为lookupDate
将lookupDate As Double
更改为lookupDate As Variant
并添加代码以检查其类型
If TypeName(lookupDate) = "Range" Then
... (dates.Address = (lookupDate.Address ...
Else
... (dates.Address = (lookupDate ...
End IF