3

我有一个包含数据的工作表和一些通过 vba 填充公式的列。我挣扎的公式是一个数组公式,如下所示:

Workbooks(job_file).Worksheets(1).Cells(h + b, 195).Formula = _
            "{=IF(MAX(IF(B2:M2>$FY" & currentRow & ",$B$1:$M$1))=0,0," & _
              "MAX(IF(sheet1!B2:M2>$FY" & currentRow & "," & _
                                "sheet1!$B$1:$M$1)))+1}"

它应该是一个数组公式,所以这就是我放在{}那里的原因。但是,在运行时,它只是在单元格中显示公式的文本,而不计算它。我必须手动卸下括号,然后按Ctrl+Shift+Enter自己。

有什么办法可以避免吗?我有很多行,我不能 ctrlshiftenter 每一行。

我尝试在不带括号的情况下运行它,它可以工作,但会出现#VALUE!错误,也可以通过应用来修复Ctrl+Shift+Enter

4

2 回答 2

4

要使用模拟的 ctrl+shift+enter(又名 CSE)创建数组公式,请使用Range.FormulaArray 属性而不是Range.Formula 属性,并让 Excel 添加“大括号”。

with Workbooks(job_file).Worksheets(1)
    .Cells(h + b, 195).FormulaArray = _
        "=IF(MAX(IF(B2:M2>$FY" & currentRow & ",$B$1:$M$1))=0,0," & _
            "MAX(IF(sheet1!B2:M2>$FY" & currentRow & ", sheet1!$B$1:$M$1)))+1"
end with

我在您的公式中注意到您使用B2:M2and sheet1!B2:M2他们不应该是sheet1!B2:M2吗?

有一些考虑。

  • 运行时错误:1004 - 太长。FormulaArray 的字符数限制为 255,但有一些变通方法

  • 运行时错误:1004 - 损坏的字符串。请记住,带引号的字符串中的所有引号必须加倍。当尝试通过 VBA 将公式写入单元格时,这很容易成为最常见的错误原因之一。提示:TEXT(,)可以用来代替,""因此您不必键入""""零长度字符串。

  • FormulaArray 接受 xlR1C1 和 xlA1 样式的公式。如果您可以了解 xlR1C1 样式的公式语法,则通常更容易在 xlR1C1 中构造连接的公式字符串,因为您可以使用数字来表示列号,而不是尝试将列序号转换为列字母。但是,不要尝试在同一个公式中混合匹配 xlA1 和 xlR1C1 范围引用;它们都必须是一种风格或另一种风格。

  • 如果您在制定将被接受为公式的字符串时遇到问题,'请在第一个等号前打勾(例如 ),然后运行代码并返回工作表以查看输入的内容。在工作表上进行修改直到你有一个工作公式,然后将这些修改转移到 VBA 代码。

于 2018-07-11T15:30:20.753 回答
2

请注意,看起来这可以在没有数组公式的情况下完成,如下所示:

Workbooks(job_file).Worksheets(1).Cells(h + b, 195).Formula = _
        "=IF($FY" & currentRow & ">MAX(B2:M2),0," & _
         "MAX(INDEX((B2:M2>$FY" & currentRow & ")*$B$1:$M$1,)))+1"
于 2018-07-11T15:53:22.747 回答