Excel vba公式字符串:数组公式-如何模拟Ctrl+Shift+Enter键



我有一个包含数据和一些列的工作表,我通过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

有什么办法可以避免吗?我有很多排,我不能一排一排地移动。

我试着在没有括号的情况下运行它,它很有效,但出现了#VALUE!错误,也可以通过应用Ctrl+Shift+Enter来修复。

要使用模拟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:M2sheet1!B2:M2。它们不应该都sheet1!B2:M2吗?

有一些考虑因素。

  • 运行时错误:1004-太长。FormulaArray减少了255个字符的限制,但也有一些解决办法。

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

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

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

注意,这似乎可以在没有数组公式的情况下完成,比如:

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"

最新更新