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

时间:2016-01-26 22:58:41

标签: excel vba excel-vba array-formulas

我需要将一个数组插入到特定的单元格中,并且我一直遇到1004错误。这是代码:

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

该数组应该与{#1}}一起插入&#34; mon&#34;基于activecell列的变量。当我手动将它放入工作表时,该公式有效。我试过用.replace分割它,我得到了同样的错误。我可以做些什么来使用formulaArray?

2 个答案:

答案 0 :(得分:1)

根据 mon 变量中的值的长度,似乎您的数组公式仅略微超过~290-310个字符的限制,其中很大一部分由外部工作表名称(例如'2016 Summary')。暂时将工作表名称更改为单个字符足以使公式降至~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$4:$T$39<=" & mon & ")*" & _
            "(" & chrWS & "!$D$4:$D$39>0)*(" & chrWS & "!$T$4:$T$39+" & chrWS & "!$D$4:$D$39>" & mon & ")*" & _
            "(" & chrWS & "!$S$4:$S$39=TRUE),(1),IF((" & chrWS & "!$T$4:$T$39<=" & mon & ")*(" & chrWS & "!$S$4:$S$39=TRUE)*" & _
            "(" & chrWS & "!$D$4:$D$39=0),(1),0)))&"" - Employees"")"
    End With

    With Worksheets(chrWS)
        .Name = strWS
    End With

Excel将更改公式中的工作表名称,添加换行标记(例如'2016 Summary'!$T$4:$T$39)以补偿新(旧)工作表名称中的空格。

如果您提供了有关 mon 的值的详细信息以及“2016摘要”工作表中的一些示例数据,则可能还可以改进公式。乍一看,看起来阵列公式可能根本不是绝对必要的。

答案 1 :(得分:0)

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