如何在Excel VBA中编写Excel函数数组选择/创建公式

时间:2018-01-14 20:47:40

标签: excel vba excel-vba

努力弄清楚如何在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

1 个答案:

答案 0 :(得分:1)

在您的VBA代码中,[...]Evaluate的快捷方式,其中[ ]内的内容实际上是您在Excel公式栏中输入的内容。

在这种情况下,dateslookupDate是函数的参数,`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