我已经使用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
答案 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)"