Vba 索引匹配公式有错误吗?

Vba 索引匹配公式有错误吗?,vba,excel,indexing,match,Vba,Excel,Indexing,Match,我有excel公式: =INDEX('C:\Users\Desktop\[BOOK1.xlsx]Sheet1'!$J:$J,MATCH(A2,'C:\Users\Desktop\[BOOK1.xlsx]Sheet1'!$W:$W,0)) 我在用Excel vba编写时遇到困难,这是我目前所拥有的: Dim BOOK1 As Workbook Dim bcklog1 As Worksheet Set bcklog1 = BOOK1.Worksheets("backlog1") Dim res

我有excel公式:

=INDEX('C:\Users\Desktop\[BOOK1.xlsx]Sheet1'!$J:$J,MATCH(A2,'C:\Users\Desktop\[BOOK1.xlsx]Sheet1'!$W:$W,0))
我在用Excel vba编写时遇到困难,这是我目前所拥有的:

Dim BOOK1 As Workbook
Dim bcklog1 As Worksheet

Set bcklog1 = BOOK1.Worksheets("backlog1")

Dim result As Variant
Dim match_formula As Variant

match_formula = "Match(Worksheets(1).Range("W:W"), 0)"
result = Evaluate(match_formula)
answer = Application.WorksheetFunction.Match(2, Worksheets(1).Range("W:W"), 0)
test = Application.WorksheetFunction.Index(Sheets("backlog1").Range("J:J"), result, 1)
index_formula = "Index(sales, result, )"
result2 = Evaluate(index_formula)

我很难得到任何类型的结果,我的匹配公式不断出现错误。我的方法正确吗?某些结果将包含预期的错误。公式应在另一个工作簿中查找值并与之匹配。

目标:在VBA中复制工作表公式

=INDEX('C:\Users\Desktop\[BOOK1.xlsx]Sheet1'!$J:$J, MATCH(A2, 'C:\Users\Desktop\[BOOK1.xlsx]Sheet1'!$W:$W,0))
这是一个使用多种方法的渐进式构造。检查VBE的即时窗口中的debug.print输出

外部工作簿单元格范围地址作为字符串引入,并带有可选的external:=True参数。这将返回格式正确的字符串,包括工作簿的完整路径、带单引号的工作表名称(如果需要)以及绝对单元格范围引用


您可以使用等号将这些公式字符串结构写回目标工作表,并将其分配给目标单元格的。等号不是公式的要求。

在您的代码中,让我印象深刻的第一件事是您从未将BOOK1设置为任何值。在您正在构造的公式中,局部A2从何而来?为什么不简单一点。在求值之前,对字符串公式求值(可选地在字符串中更改A2)?@Ron Rosenfeld:为了缩短问题,我省略了BOOK1集合作为一部分。@Jeeped:你能澄清一下吗?我看不出会有什么结果。你原来的配方包括。。。匹配2。。。但是字符串连接使用=Matchsales&PO。。。。是哪一个?A2是什么,在哪里?您是否正在尝试创建具有不同A2的新公式?感谢您提供有关参考外部工作簿的信息!!我得到一个错误13:match_行和'test'变量的类型不匹配。我将match_行更改为Variant,从而消除了一个错误。测试变量仍然返回一个错误。
'assumes that BOOK1 points to a workbook at this point
Dim bcklog1 As Worksheet
Set bcklog1 = BOOK1.Worksheets("backlog1")

Dim result As Variant, test As Variant
Dim frml As String, match_row As Long

'first we construct and evaluate the MATCH portion
frml = "match(A2, " & bcklog1.Range("W:W").Address(external:=True) & ", 0)"
Debug.Print frml
match_row = Evaluate(frml)
Debug.Print match_row

'next we build the remainder of the INDEX/MATCH around the match potion constructed earlier
frml = "index(" & bcklog1.Range("J:J").Address(external:=True) & ", " & frml & ")"
Debug.Print frml
result = Evaluate(frml)

'finally we abandon the Evaluate and use the match_row obtained earlier directly
test = Application.WorksheetFunction.Index(bcklog1.Range("J:J"), match_row, 1)
Debug.Print test