克服 255 个字符。 Excel VBA 中 formulaArray 的限制

Overcoming the 255 char. limit for formulaArray in Excel VBA

我需要将一个数组插入到特定的单元格中,我将 运行 保留在 1004 错误中。这是代码:

Range("o37").FormulaArray = "=CONCATENATE(SUM(IF(('2016 Summary'!$T:$T<=" & mon & ")*" & _
    "('2016 Summary'!$D:$D>0)*('2016 Summary'!$T:$T+'2016 Summary'!$D:$D>" & mon & ")*" & _
    "('2016 Summary'!$S:$S=TRUE),(1),IF(('2016 Summary'!$T:$T<=" & mon & ")*('2016 Summary'!$S:$S=TRUE)*" & _
    "('2016 Summary'!$D:$D=0),(1),0)))&"" - Employees"")"

该数组应该使用基于 activecell 列的 "mon" 变量插入到 O37 中。当我手动将它放入 sheet 时,该公式有效。我试过用 .replace 拆分它,但我得到了同样的错误。我可以做些什么来使它与 formulaArray 一起工作?

根据 mon 变量中的值有多长,您的数组公式似乎仅略微超过了约 290-310 个字符的限制,并且大部分由外部工作表名称组成(例如“2016 年摘要”)。暂时将工作表名称更改为单个字符足以将公式缩小到 ~190-210 个字符范围;足以将公式填充到单元格的 Range.FormulaArray property.

    Dim strWS As String, chrWS As String

    strWS = "2016 Summary"
    chrWS = Chr(167)    '<~~ any unque, legal, single character that can be temporarily used as a worksheet name

    With Worksheets(strWS)
        .Name = Chr(167)
    End With

    With Worksheets("worksheet_with_array_formula")
        .Range("o37").FormulaArray = "=CONCATENATE(SUM(IF((" & chrWS & "!$T:$T<=" & mon & ")*" & _
            "(" & chrWS & "!$D:$D>0)*(" & chrWS & "!$T:$T+" & chrWS & "!$D:$D>" & mon & ")*" & _
            "(" & chrWS & "!$S:$S=TRUE),(1),IF((" & chrWS & "!$T:$T<=" & mon & ")*(" & chrWS & "!$S:$S=TRUE)*" & _
            "(" & chrWS & "!$D:$D=0),(1),0)))&"" - Employees"")"
    End With

    With Worksheets(chrWS)
        .Name = strWS
    End With

Excel 将更改公式中的工作表名称,添加环绕标记(例如 '2016 Summary'!$T:$T)以补偿新(旧)工作表名称中的 space。

如果您提供了有关 mon 的值的更多详细信息以及“2016 年摘要”工作表中的一些示例数据,则该公式也有可能得到改进。乍一看,数组公式似乎完全没有必要。

Sub SetTooLongArrayFormula(ByVal rn As Range, ByVal sFormula As String)
    Dim sFormat As String
    sFormat = rn.Cells(1, 1).NumberFormat
    rn.FormulaArray = ""
    rn.Cells(1, 1).NumberFormat = "@"
    rn.Value = sFormula
    rn.Cells(1, 1).NumberFormat = sFormat
    rn.Select
    DoEvents
    SendKeys "{F2}", True
    DoEvents
    SendKeys "+^{ENTER}", True
    
End Sub
Sub Test()
    'Do not run this macro from VBE Editor
    'Run this macro from the Macros ribbon on the Developer tab with the Excel worksheet in front.
    Dim sFormula As String
    sFormula = "=""1"""
    For i = 1 To 250
        sFormula = sFormula & "&""1"""
    Next
    SetTooLongArrayFormula Range("A1:A2"), sFormula
End Sub