另一个>>无法设置范围类的FormulaArray属性

时间:2017-09-06 22:55:48

标签: excel vba excel-vba excel-formula

我已经研究过很多“无法设置范围类的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, “&LT =” &安培; $ C2)大于0,IF(INDEX(MLBtransactions $ A:! $ E,MATCH(1,(MLBtransactions $ d:$ d = A $ 1)*(MLBtransactions $ A:!$ A&LT; = $ C2),0),5)= $ A2, “DNP / SUS / MIN” ,“with”&amp; INDEX(MLBtransactions!$ A:$ E,MATCH(A $ 1,MLBtransactions!$ D:$ D,0),5)),IF(COUNTIFS(MLBstats!$ B:$ B,A $ 1) ,MLBstats!$ A:$ A,$ A2)= 1,“DNP / SUS / MIN”,“LEAVE BLANK”))

使用简化代码(下面的示例)进行测试导致实现,因为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

2 个答案:

答案 0 :(得分:1)

将VormulaArray设置为VBA中的一系列单元格与选择整个范围时按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正确确定所需的公式。

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

答案 1 :(得分:0)

使用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