超过 255 个字符的数组公式

tom*_*_uk 5 excel vba

运行 VBA 代码时出现错误。

运行时错误“1004”:无法设置 Range 类的 FormulaArray 属性

我认为这是因为我有超过 255 个字符。

如果是这种情况,有人知道我可以使用的解决方法吗?

我的代码是下面漂亮的一团糟:

formula_string = "=-SUM("
account_counter = 1
Do Until Range("tblAccounts[[#Headers],[Accounts]]").Offset(account_counter, 0).Value = ""
    account_name = Range("tblAccounts[[#Headers],[Accounts]]").Offset(account_counter, 0).Value
    formula_string = formula_string & "IF(IFERROR(" & account_name & "[Category]=[@Categories],FALSE)*(" & account_name _
        & "[Transaction date]>=Budget!C$1)*(" & account_name & "[Transaction date]<=EOMONTH(Budget!C$1,0))," & account_name _
        & "[Outflow],0),"
    account_counter = account_counter + 1
Loop
formula_string = Left(formula_string, Len(formula_string) - 1) & ")"

    Do Until Range("tblBudget[[#Headers],[Ignore?]]").Offset(category_counter, 0).Value = ""
        If Range("tblBudget[[#Headers],[Ignore?]]").Offset(category_counter, 0).Value = "No" Then
            Do Until Range("tblBudget[[#Headers],[Ignore?]]").Offset(0, column_counter).Value = ""
                If Right(Range("tblBudget[[#Headers],[Ignore?]]").Offset(0, column_counter).Value, 8) = "Outflows" Then
                    Range("tblBudget[[#Headers],[Ignore?]]").Offset(category_counter, column_counter).Select
                    Selection.Formula = formula_string
                End If
                column_counter = column_counter + 1
            Loop
        End If
        category_counter = category_counter + 1
    Loop
Run Code Online (Sandbox Code Playgroud)

如果我将“.FormulaArray”替换为“.Formula”,然后手动将其设置为数组(Ctrl+Shift+Enter),则它可以正常工作,因此公式本身可以正常工作。

不幸的是,我不能让它变得更简单,因为我可以有多达 10 个帐户,每个帐户都需要在每个单元格中引用(我用于测试的当前三个有 525 个字符,但它会根据名称而改变每个帐户是)。

正如我所说,Excel 似乎对此没有问题……这是 VBA 的问题。

非常感谢

Mit*_*šek 4

我发现你的公式中有一些乘法。您可以将公式拆分为多个命名范围,然后使用另一个范围将它们组合回来。例如,假设您的公式可以分为两部分,如下所示:

= formulaPart1 * formulaPart2
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式定义两个命名范围:

ActiveWorkbook.Names.Add Name:="firstPart" RefersToR1C1:="formulaPart1"
ActiveWorkbook.Names.Add Name:="secondPart" RefersToR1C1:="formulaPart2"
Run Code Online (Sandbox Code Playgroud)

然后你可以将最终结果设置为:

= firstPart * secondPart
Run Code Online (Sandbox Code Playgroud)

编辑:您甚至可以为您想要求和的每个元素定义一个命名范围。例如,这将是一个要设置的命名范围,假设您将其命名为 sumElement1:

"IF(IFERROR(" & account_name & "[Category]=[@Categories],FALSE)*(" & account_name _
        & "[Transaction date]>=Budget!C$1)*(" & account_name & "[Transaction date]<=EOMONTH(Budget!C$1,0))," & account_name _
        & "[Outflow],0)"
Run Code Online (Sandbox Code Playgroud)

那么公式将类似于“=-SUM(sumElement1, sumElement2,..., sumElementn)”。