Excel VBA 使用索引匹配的数组公式给出错误类型不匹配

Excel VBA Array Formula using Index Match giving an error Type mismatch

我正在尝试将数组公式添加到工作表的 Table 列中。我正在使用索引匹配并拆分公式,因为它对于所有文件名来说变得相当大。我通过拆分它在代码的其他部分使用它并且它有效(但使用不同的引用等)。

当我尝试将匹配公式 replace/insert 放入索引公式时,我总是收到“类型不匹配”错误。当我手动执行(通过复制变量字符串值)时,它有效...

ATPFile = Dir(DataPath & "\*ATP*COMBINED.xls*")
ATPFileF = DataPath & "\" & ATPFile

Set wb = Workbooks.Open(ATPFileF)

'Add ATP data from ATP raw data file
sheetname = Worksheets("ATP").Name

'Get last row with data in ATP file
Dim rowCountSource As Integer
Dim ATPRowRange As Range
Dim sFomrula2 As String

With wb.Worksheets("ATP")
    rowCountSource = .Cells(.Rows.Count, 2).End(xlUp).Row
End With

ref = DataPath & "\[" & ATPFile & "]" & sheetname

sFormula = "=INDEX('" & ref & "'!$P:$P$" & rowCountSource & ",""X_X_X"",1)"
sFormula2 = "MATCH([@Article]&[@Site],('" & ref & "'!$B:$B$" & rowCountSource & ")&('" & ref & "'!$D:$D$" & rowCountSource & "),0)"

'Add ATP info
With ws.ListObjects("Table_DCvenSDCdata")
    With .ListColumns("ATP").DataBodyRange
        .NumberFormat = "General"
        With .Cells(1, 1)
            .FormulaArray = sFormula
            .Replace """X_X_X""", sFormula2
        End With
        .FillDown
        .Value = .Value
    End With
End With

.Replace """X_X_X""", sFormula2

弹出错误

文件引用和名称都是正确的。我不确定问题出在我的匹配公式中...

sFormula 字符串是这样的:

=INDEX('C:\_Store.05.2020\[T MA0 ATP 18.08.2020.xls COMBINED.xls]ATP'!$P:$P6,"X_X_X",1)

这就是替换索引公式中的“X_X_X”的 sFormula2 字符串:

MATCH([@Article]&[@Site],('C:\_Store.05.2020\[T MA0 ATP 18.08.2020.xls COMBINED.xls]ATP'!$B:$B6)&('C:\_Store.05.2020\[T MA0 ATP 18.08.2020.xls COMBINED.xls]ATP'!$D:$D6),0)

任何建议将不胜感激!

试试这个 With 块的代码片段以及前面提到的一些声明。

Dim oldStr As String, newStr As String

    oldStr = """X_X_X"""
    newStr = "sFormula2"

With ws.ListObjects("Table_DCvenSDCdata")
    With .ListColumns("ATP").DataBodyRange
        .NumberFormat = "General"
        With .Cells(1, 1)
            .FormulaArray = sFormula
            .FormulaArray = Replace(.FormulaArray, oldStr, newStr)
        End With
        .FillDown
        .Value = .Value
    End With
End With

请参考相关link.

我正在用我想出的解决方案回答我自己的问题。我敢肯定还有其他方法,但这是对我有用的最快最简单的方法。正如@Scott Craner 提到的那样,我进一步拆分了我的公式,因为 255 个字符的限制似乎是问题所在。

现在更改的代码部分如下所示:

sFormula = "=INDEX('" & ref & "'!$P:$P$" & rowCountSource & ",""X_X_X"",1)"
sFormula2 = "MATCH([@Article]&[@Site],""X3""&""X4"",0)"
sFormula3 = "('" & ref & "'!$B:$B$" & rowCountSource & ")"
sFormula4 = "('" & ref & "'!$D:$D$" & rowCountSource & ")"

'Add ATP info
With ws.ListObjects("Table_DCvenSDCdata")
    With .ListColumns("ATP").DataBodyRange
        .NumberFormat = "General"
        With .Cells(1, 1)
            .FormulaArray = sFormula
            .Replace """X_X_X""", sFormula2
            .Replace """X3""", sFormula3
            .Replace """X4""", sFormula4
        End With
        .FillDown
        .Value = .Value
    End With
End With