【问题标题】:Another >> Unable to set the FormulaArray property of the range class另>>无法设置范围类的FormulaArray属性
【发布时间】:2017-09-07 10:19:25
【问题描述】:

我在这里和其他网站中研究了尽可能多的“无法设置范围类的 FormulaArray 属性”问题,以解决我试图在数据表中执行的 FormulaArray 操作。

考虑到 R1C1,我在公式中遵守了 255 个字符的限制,我尝试先将公式作为文本字符串插入。我已经尝试了很多东西。

现在我认为我的问题在于我试图仅将公式插入空白单元格,因为如果我将公式简化为 =1+1,我仍然会收到错误。如果我将 .FormulaArray 更改为 .Formula 以简单地输入标准公式,我也会得到同样的错误。空白单元格不能进行此操作吗?

错误发生在.FormulaArray = myFormula1 步骤。

为了确认,手动输入单元格时,公式本身有效(在下面进一步粘贴)。

    Sub ArrayMacro()

    Dim myFormula1 As String 
    Dim myFormula2 As String 
    Dim myFormula3 As String 
    Dim myFormula4 As String 

    myFormula1 = "=IF(COUNTIFS(MLBtransactions!$D:$D,A$1,MLBtransactions!$A:$A,""<=""&$C2)>0,IF(INDEX(MLB," & "X_X_X)" 
    myFormula2 = "transactions!$A:$E,MATCH(1,(MLBtransactions!$D:$D=A$1)*(MLBtransactions!$A:$A<=$C2),0),," & "Y_Y_Y)" 
    myFormula3 = "5)=$A2,""DNP/SUS/MIN"",""with "" & INDEX(MLBtransactions!$A:$E,MATCH(A$1,MLBtransactions," & "Z_Z_Z)" 
    myFormula4 = "!$D:$D,0),5)),IF(COUNTIFS(MLBstats!$B:$B,A$1,MLBstats!$A:$A,$A2)=1,""DNP/SUS/MIN"",""LEAVE BLANK""))" 

    Sheets("Sheet1").Select  
    With Range("E2:AZ140").SpecialCells(4)
    .FormulaArray = myFormula1 
    .Replace ",X_X_X)", myFormula2 
    .Replace ",Y_Y_Y)", myFormula3 
    .Replace ",Z_Z_Z)", myFormula4 
    End With 

    End Sub

问题更新。使用With Range("E2:AZ140").SpecialCells(xlCellTypeBlanks) 而不是With Range("E2:AZ140").SpecialCells(4) 也会以同样的错误结束。

这是正在使用的完整公式

=IF(COUNTIFS(MLBtransactions!$D:$D,A$1,MLBtransactions!$A:$A,"0,IF(INDEX(MLBtransactions!$A:$E, MATCH(1,(MLBtransactions!$D:$D=A$1)*(MLBtransactions!$A:$A

使用简化代码(下面的示例)进行测试导致了实现,因为 YowE3K 指出 myFormula1 需要有效才能使程序正常工作。

Sub ArrayMacro()

Dim myFormula1 As String
Dim myFormula2 As String

myFormula1 = "=1+1" & "+2+2"
myFormula2 = "+1+1"

Sheets("Sheet1").Select
With Range("h14:h16").SpecialCells(xlCellTypeBlanks)
MsgBox .Address
.FormulaArray = myFormula1
.Replace "+2+2)", myFormula2
End With

End Sub

【问题讨论】:

  • 使用.FormulaArray = myFormula1 意味着myFormula1 本身就是一个有效的公式。不是。
  • @YowE3K 我没有意识到这一点。在 myFormula1 中,我现在移动了 IF(INDEX....。在第二个公式的末尾附近并用简单的""true"",""false"") 关闭公式1 中的 IF 语句,然后在替换中也使用它。它仍然会导致错误。正如我所提到的,即使在 myFormula1 中使用 =1+1 作为公式也会导致错误,一旦我到达步骤.FormulaArray = myFormula1
  • 如果您在 E2:AZ140 中没有任何空白单元格(或者即使它是一张空白表,这意味着您的 UsedRange 不会延伸到那里,因此单元格不是归类为空白)您的With 语句将崩溃,但是一旦我越过那条线,我就可以将FormulaArray 设置为=1+1
  • 你得到的实际错误信息是什么?
  • 您将遇到的另一个问题是,如果您的目标范围中有一些非空白单元格,您可能会在 Range("E2:AZ140").SpecialCells(xlCellTypeBlanks) 中有非连续区域,因此您的公式将仅适用于这些领域中的第一个。

标签: vba excel excel-formula


【解决方案1】:

当您使用FormulaArray = ... 设置公式时,它必须是有效的公式。 (我认为在每个Replace 之后,公式也需要继续有效,但我还没有测试过。编辑:不,如果Replace 会创建一个无效的公式,它只是不处理它 - 但它不会崩溃。)

您的问题似乎都源于在您的 myFormula1 变量中使用了无效公式。

我建议你使用以下:

Sub ArrayMacro()

    Dim myFormula1 As String
    Dim myFormula2 As String
    Dim myFormula3 As String
    Dim myFormula4 As String

    myFormula1 = "=IF(COUNTIFS(MLBtransactions!$D:$D,A$1,MLBtransactions!$A:$A,""<=""&$C2)>0,IF(1232=$A2,""DNP/SUS/MIN"",""with ""&1233),1234)"
    myFormula2 = "INDEX(MLBtransactions!$A:$E,MATCH(1,(MLBtransactions!$D:$D=A$1)*(MLBtransactions!$A:$A<=$C2),0),5)"
    myFormula3 = "INDEX(MLBtransactions!$A:$E,MATCH(A$1,MLBtransactions!$D:$D,0),5)"
    myFormula4 = "IF(COUNTIFS(MLBstats!$B:$B,A$1,MLBstats!$A:$A,$A2)=1,""DNP/SUS/MIN"",""LEAVE BLANK"")"

    'Insert the formula
    With Sheets("Sheet1").Range("E2:AZ140").SpecialCells(xlCellTypeBlanks)
        .FormulaArray = myFormula1
        .Replace "1232", myFormula2
        .Replace "1233", myFormula3
        .Replace "1234", myFormula4
    End With

End Sub

【讨论】:

  • OK 一些进展。非常感谢。如果我使用它并将范围设置为 H14:H16 并使用 H15 空白运行它(H14 和 H16 为非空白),它将数组公式输入到 H15,但地址没有增加以匹配单元格。如果我将 H14 设为空白并填充其他 2 个单元格,则结果相同,公式输入但地址仍如公式中所写。如果 H16 为空白(H14 和 H15 非空白),我收到错误“未找到单元格”,尽管 H16 为空且在范围内。
  • 最后一位(“未找到单元格”,即使 H16 为空白)可能是因为您的 UsedRange 目前仅扩展到 H15 - 工作表当前“已使用”区域之外的单元格不会使用SpecialCells 时似乎被视为工作表的一部分(我怀疑这是微软的故意决定,而不是错误)。对于第一部分,您将不得不向我们提供更多关于您的工作表的详细信息,以及为什么您只选择范围内的一些单元格来应用公式,然后我们才能提出任何有用的回答。
  • 我只选择整个表格的一小部分用于测试(时间)目的。由于它的大小,只测试它的一小块会更快。我的数据跟踪美国职业棒球大联盟的伤病情况。每行代表一个团队和他们的一场比赛。列中是联盟中的每个球员。单元格包含每个玩家的游戏数据。如果单元格为空白,则表明该球员没有参加比赛,或者他们不在该球队中,并且会从该球队比赛的所有行中丢失。
【解决方案2】:

在 VBA 中将 .FormulaArray 设置为单元格范围与在选择整个范围时按 CTRL+SHIFT+ENTER 相同。当单个公式返回结果数组并且您希望在选定单元格的范围内显示该数组时使用此选项。这需要一系列连续的单元格来显示数组。尝试在不连续的单元格区域上设置 .FormulaArray 将失败,无论公式是否正确。

我认为您正在尝试创建一个数组公式,该公式在对数组执行分析后返回单个结果;并且您希望在所有空白单元格中使用此公式。

在 Excel 中,您需要将公式以数组方式输入到单个单元格中,然后将公式复制到其他单元格中。

同样,您需要在 VBA 中分两步完成。您需要首先为一个单元格设置 .FormulaArray。这也将确认在 VBA 中正确构造了公式。然后,您可以将该单元格复制到所有空白单元格,如果您只想复制公式,请使用 PasteSpecial。

或者,您可以循环遍历所有设置 .FormulaArray 的空白单元格,例如:

Dim raCell As Range

For Each raCell In Range("E2:AZ140")
    If IsEmpty(raCell) Then raCell.FormulaArray = ...
Next

但是,由于您有动态引用,因此您需要仔细构造 FormulaArray,以根据当前 raCell 的 .Row 和 .Column 正确确定所需的公式。

如果您有“锚点”,则复制和粘贴会更安全。在您知道的某个地方,您始终可以输入完全相同的公式,并在复制并粘贴到所有其他单元格时获得正确的结果。

【讨论】:

  • 我已经尝试了你提到的第一个选项。在表格外输入数组公式,将公式复制粘贴到表格中所有空白单元格中。数组公式正确输入到单个单元格中,并很好地复制到所有空表格单元格中。但我失去了成为#REF 的 1 澳元单元格引用!在结果公式中。我没有在我的宏中使用很多循环(不知道如何)。我想知道它是否会更直接
  • 我实际上的意思是尝试将其直接放入表格中的一个单元格中。您可以使用 Range("h14:h16").SpecialCells(xlCellTypeBlanks).cells(1) 将其粘贴到第一个空白单元格中,然后从那里复制。
  • 也就是说,循环更安全。 SpecialCells 在电子表格上最后使用的单元格之后不会返回空白单元格,因此可能不会返回您期望的所有单元格。我添加了一个简单的 For 循环来帮助您入门,但您应该更多地阅读它们。
  • 也就是说,循环要慢得多。使用复制粘贴很可能会更快。此外,如果您不知道第一个空白单元格将存在的位置,这意味着您也不知道在复制和粘贴之前公式的初始值需要是什么。您可能需要首先在您知道将始终为空白的单元格中创建公式,但请对其进行调整,以便在将其复制到表中时具有正确的引用。您可以通过向后工作来确定这一点:将正确的公式放入表格中的空白单元格,然后将其复制并粘贴到表格外始终为空白的单元格中。
  • 谢谢@Michael。时间不应该成为问题,因为宏正在替换需要我大约 60 分钟的手动步骤。即使宏需要 120 分钟才能完成,我也不必花时间去做。我将尝试一个循环。但我需要考虑我最初考虑的错误的另一个问题,这可能会使循环复杂化
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2015-08-13
相关资源
最近更新 更多