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
我正在尝试将数组公式添加到工作表的 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
请参考
我正在用我想出的解决方案回答我自己的问题。我敢肯定还有其他方法,但这是对我有用的最快最简单的方法。正如@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