INDEX + MATCH ArrayFormula返回1004

时间:2018-03-27 14:33:50

标签: excel vba excel-vba excel-formula

我已经使用StackOverflow几个月了,它已经回答了我的所有问题,期待我目前遇到的问题。无论本网站上发布的选项如何,我似乎都无法解决问题。也许你可以看到这个问题,我现在还没有看到。

我在VBA中有一个FormulaArray,它接受外部文件的索引,将一个值(Q2)与外部文件的B列中的值匹配。然后它将第二个值(P2)与外部文件的D列中的值匹配。如果两者都匹配,它将返回外部文件的C列中的值。

在Excel中运行得很好,但是当我创建一个Selection.FormulaArray =这个公式时,我获得了1004作为回报。该行本身短于255个字符,甚至将INDEX和MATCH公式分为两部分(由Dim formulapart1和formulapart2作为字符串),它不起作用。

=INDEX([ISOCODE.xlsx]ISOCODE!$A:$D;MATCH(1;([ISOCODE.xlsx]ISOCODE!$B:$B=Q2)*([ISOCODE.xlsx]ISOCODE!$D:$D=P2);0);3)

我尝试了以下解决方案,该网站发布在本网站上,适用于其他人,但无论我做什么,它都不适用于我:

Dim theFormulaPart1 As String
Dim theFormulaPart2 As String

theFormulaPart1 = "=INDEX([ISOCODE.xlsx]ISOCODE!$A:$D;XX"
theFormulaPart2 = "MATCH(1;([ISOCODE.xlsx]ISOCODE!$B:$B=Q2)*([ISOCODE.xlsx]ISOCODE!$D:$D=P2);0);3)"

With ActiveSheet.Range("DS2")
    .FormulaArray = theFormulaPart1
    .Replace "XX", theFormulaPart2
End With

2 个答案:

答案 0 :(得分:1)

每当使用excel-VBA(或一般的任何东西)时,请始终尝试从较小的东西开始,这样可行。在您的情况下,删除opend工作表并尝试使其与您拥有的工作表一起使用。因此,这是有效的:

Sub TestMe()

    Dim theFormulaPart1 As String
    Dim theFormulaPart2 As String

    theFormulaPart1 = "=INDEX(A:D,XX"
    theFormulaPart2 = "MATCH(1,(B:B=Q2)*(D:D=P2),0),3)"

    With ActiveSheet.Range("E1")
        theFormulaPart1 = Replace(theFormulaPart1, "XX", theFormulaPart2)
        .FormulaArray = theFormulaPart1
    End With

End Sub

修复后,请进一步添加[ISOCODE!.xlsx]

答案 1 :(得分:1)

您如何分割代码存在问题(您的theFormulaPart1本身并不是一个有效的公式!)但这不是真正的问题 - 这是您的{{3 }}

真正的问题是,在通过VBA中放置公式时,除非您使用.FormulaLocal,否则必须使用英语本地化 - 这意味着使用,整数;来区分参数。并且,没有.FormulaArrayLocal,因此对于数组公式,您始终使用英语本地化:

ActiveSheet.Range("DS2").FormulaArray = "=INDEX([ISOCODE.xlsx]ISOCODE!$A:$D,MATCH(1,([ISOCODE.xlsx]ISOCODE!$B:$B=Q2)*([ISOCODE.xlsx]ISOCODE!$D:$D=P2),0),3)"