【问题标题】:Runtime Error 1004 Copy long array formula in vba运行时错误 1004 在 vba 中复制长数组公式
【发布时间】:2016-10-26 23:06:25
【问题描述】:

我的 Excel 电子表格的单元格 B2 中有以下数组公式:

={IF(COUNT(IF(ISNUMBER(A30:A1000);IF(C30:C1000>A30:A1000-1;A30:A1000)))>=COUNT(IF(ISNUMBER(A30:A1000);IF(B30:B1000>A30:A1000-1;A30:A1000)));COUNT(IF(ISNUMBER(A30:A1000);IF(C30:C1000>A30:A1000-1;A30:A1000)));IF(COUNT(IF(ISNUMBER(A30:A1000);IF(C30:C1000>A30:A1000-1;A30:A1000)))<=COUNT(IF(ISNUMBER(A30:A1000);IF(B30:B1000>A30:A1000-1;A30:A1000)));COUNT(IF(ISNUMBER(A30:A1000);IF(B30:B1000>A30:A1000-1;A30:A1000)));COUNT(IF(ISNUMBER(A30:A1000);IF(C30:C1000>A30:A1000-1;A30:A1000)))))}

现在我想使用以下 VBA 代码将此代码复制到单元格 A2 中:

Sheets("Sheet1").Range("A2").FormulaArray = Sheets("Sheet1").Range("B2").Formula

但是,当我使用此代码时,出现运行时错误 1004。

你知道如何解决这个问题吗?

【问题讨论】:

  • 您希望范围保持不变吗?例如A30:A1000 即使是 Range("A2") 中的公式?
  • 是的,它们的长度必须完全相同。

标签: excel vba


【解决方案1】:

传递数组时字符限制为 255...

https://support.microsoft.com/en-us/kb/213181

为 A 的 a30:A1000、B 的 B30:B1000 和 D 的 c30:c1000 设置命名范围(C 是保留的,所以你不能使用它,CC 也会使这个公式太长)(ctrl+ f3 打开命名范围管理器,然后点击新建按钮)

然后更改您的公式以使用命名范围。

=IF(COUNT(IF(ISNUMBER(A),IF(D&gt;A-1,A)))&gt;=COUNT(IF(ISNUMBER(A),IF(B&gt;A-1,A))),COUNT(IF(ISNUMBER(A),IF(D&gt;A-1,A))),IF(COUNT(IF(ISNUMBER(A),IF(D&gt;A-1,A)))&lt;=COUNT(IF(ISNUMBER(A),IF(B&gt;A-1,A))),COUNT(IF(ISNUMBER(A),IF(B&gt;A-1,A))),COUNT(IF(ISNUMBER(A),IF(D&gt;A-1,A)))))

或者,您可以设置自定义 VBA 函数,允许您用较短的字符串替换 if 语句中的重复代码,以使您低于 255。但最终您需要低于 255。一旦低于 255,您的代码可以正常工作,无论是我上面的更改还是更短的数组公式。 (请注意,我将分号更改为逗号,因此如果您使用分号,您可能需要将其改回)

【讨论】:

    【解决方案2】:

    我认为问题在于公式中的引用。由于单元格B2 在公式中引用了A30:A1000,因此当您将其应用于单元格A2 时,它会尝试将引用向左移动一列 - 它不能。为了绕过这一点,您可以将引用设为绝对:

    ={IF(COUNT(IF(ISNUMBER($A$30:$A$1000);IF($C$30:$C$1000>$A$30:$A$1000-1;$A$30:$A$1000)))>=COUNT(IF(ISNUMBER($A$30:$A$1000);IF($B$30:$B$1000>$A$30:$A$1000-1;$A$30:$A$1000)));COUNT(IF(ISNUMBER($A$30:$A$1000);IF($C$30:$C$1000>$A$30:$A$1000-1;$A$30:$A$1000)));IF(COUNT(IF(ISNUMBER($A$30:$A$1000);IF($C$30:$C$1000>$A$30:$A$1000-1;$A$30:$A$1000)))<=COUNT(IF(ISNUMBER($A$30:$A1000);IF(B30:B1000>A30:A$1000-1;$A$30:$A$1000)));COUNT(IF(ISNUMBER($A$30:$A$1000);IF($B$30:$B$1000>$A$30:$A$1000-1;$A$30:$A$1000)));COUNT(IF(ISNUMBER($A$30:$A$1000);IF($C$30:$C$1000>$A$30:$A$1000-1;$A$30:$A$1000)))))}
    

    【讨论】:

      猜你喜欢
      • 2016-10-26
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多