昏暗的variables错误,types不匹配?

我从一个帮助我把这个excel公式转换成vba的人得到了这个代码。 Excel公式为: =INDEX('C:\Users\Desktop\[Backlog.xlsx]backlog1'!$J:$J,MATCH(A3,'C:\Users\Desktop\[Backlog.xlsx]backlog1'!$W:$W,0))

代码是:

 SetAttr "C:\Users\Desktop\Backlog.xlsx", vbNormal Dim Backlog As Workbook Dim bcklog1 As Worksheet Set Backlog = Workbooks.Open(Filename:="C:\Users\Desktop\Backlog.xlsx", UpdateLinks:=0) Set bcklog1 = Backlog.Worksheets("backlog1") Dim result As Variant, test As Variant Dim frml As Variant, match_row As Variant frml = "match(A2, " & bcklog1.Range("W:W").Address(external:=True) & ", 0)" Debug.Print frml match_row = Evaluate(frml) Debug.Print match_row frml = "index(" & bcklog1.Range("J:J").Address(external:=True) & ", " & frml & ")" Debug.Print frml result = Evaluate(frml) test = Application.WorksheetFunction.Index(bcklog1.Range("J:J"), match_row, 1) Debug.Print test` 

我一直得到一个错误的不匹配,我已经把所有variables都改为Variant并且仍然没有成功。 子应该使用索引/匹配来查找两个不同的工作簿之间的值。 有些值不会导致“错误”,这也是我想find的,错误将代表我需要关注的东西。 结果应该出现在F:F栏中。 我一直坚持这一段时间,任何帮助表示赞赏。

编辑 – 更新为使用循环

我会这样做…

 Sub test() Dim Backlog As Workbook Dim bcklog1 As Worksheet Set Backlog = Workbooks.Open(Filename:="C:\Users\Desktop\Backlog.xlsx", UpdateLinks:=0) Set bcklog1 = Backlog.Worksheets("backlog1") Dim m, test, c ' adjust following range as needed For each c in ActiveSheet.Range("A2:A200").Cells v = c.Value If Len(v) > 0 then 'note no "worksheetfunction" or "no match" will raise an error m = Application.Match(v, bcklog1.Range("W:W"), 0) 'instead we test for no match here... If Not IsError(m) Then test = bcklog1.Range("J:J").Cells(m).Value 'Debug.Print test c.offset(0, 5).Value = test 'populate colF End If End If 'cell has a value Next c End Sub 

如果match_row计算结果为错误types(错误2042,如果找不到匹配项),那么对test = Application.WorksheetFunction.Index(... )的赋值将失败,因为赋值语句的右侧不能计算,重新将Error 2042传递给Index函数。

 If Not IsError(match_row) Then test = Application.WorksheetFunction.Index(bcklog1.Range("J:J"), match_row, 1) Else MsgBox "something" End If 

这是一种方法,所有的比较都将它们放在F栏中。

从技术angular度来看,这种方法很有趣,因为它根本不使用VBA循环:

 Public Sub excelhero() Const BACKLOG_WB = "C:\Users\Desktop\Backlog.xlsx" Const BACKLOG_WS = "backlog1" Dim n&, ws As Worksheet Set ws = Workbooks.Open(BACKLOG_WB, 0).Worksheets(BACKLOG_WS) With ThisWorkbook.ActiveSheet n = .Cells(.Rows.Count, "a").End(xlUp).Row .Range("f2:f" & n) = ws.Evaluate("transpose(transpose(index(j:j,n(if(1,match([" & .Parent.Name & "]" & .Name & "!a2:a" & n & ",w:w,))))))") End With ws.Parent.Close End Sub