我正在使用INDEX和MATCH函数来拉取数据,这些数据是来自D列的G2和H2的串联字符串(抱歉,我没有足够的点来附加图片)。列D具有INDEX(列A和列B),列A和列B具有直到第12行的值。 MATCH工作正常,给我在工作表上的位置6。但是当我在VBA代码中使用它时,如下所示,INDEX在VBA代码中工作(可以通过MsgBox看到),但MATCH函数将为变量'check'分配值不起作用。我一直在打破我的头脑。需要专家的帮助。有人请告诉我哪里出错了?
Sub testindex()
Dim check As Long
Set sh = Sheets("Sheet1")
For j = 1 To 11
'Index value is correctly shown
MsgBox "Index Value=" & Application.WorksheetFunction.Index(sh.Range("A2:B12"), j, 1) & Application.WorksheetFunction.Index(sh.Range("A2:B12"), j, 2)
'Cells(7, 4)=ISA737775 same as G2&H2
MsgBox "Cells(7,4)=" & Cells(7, 4)
check = Application.WorksheetFunction.Match(Cells(7, 4), Application.WorksheetFunction.Index(sh.Range("A2:B12"), j, 1) & Application.WorksheetFunction.Index(sh.Range("A2:B12"), j, 2), 0)
Next j
End Sub
由于
答案 0 :(得分:0)
匹配期望第二个参数以范围的形式出现。当您通过VBA调用匹配时,范围实际上需要是一个范围对象,而不仅仅是像“A1:A12”这样的字符串或者您的连接索引公式输出的任何内容。
无论如何,你已经在迭代了,那么为什么不直接调用这些值而不是通过Index拉出它们的值呢?
check = Application.WorksheetFunction.Match(Cells(7, 4), sh.Range("A" & 2 + j).value & sh.Range("B" & 2 + j), 0)
编写相同的内容但不必在VBA中使用税收INDEX函数来执行此操作。请注意,这仍然不起作用,因为匹配的第二个参数仍然只是一个字符串,它是来自A列和B列的连接值。您可以通过将它们粘贴到范围对象中来转换为范围:
check = Application.WorksheetFunction.Match(Cells(7, 4), sh.Range(sh.Range("A" & 2 + j).value & sh.Range("B" & 2 + j)), 0)
我假设A和B中的值是实际的单元名称,当连接时会产生一个范围。就像j=1
那样,它就像check = Match(Cells(7,4),sh.Range(“G2:H50”),0)或其他......