IFERROR与INDEX / MATCH在VBA中

我已经编写了下面的代码,使用索引匹配循环将外部工作表中的值带入工作簿。 如果发生错误的索引/匹配公式,它应该从当前工作簿中的工作表中检索另一个值。

该循环的工作,直到它应该从我的当前工作簿中的工作表中引入的第一个值。

关于如何修复IF ISERROR循环来提供值的想法?

Sub UpdateFile() Dim wbMVRVFile As Workbook Dim wbNewMV As Workbook Dim wsRevFile As Worksheet Dim wsMvFile As Worksheet Dim wsMvOld As Worksheet Dim wsRevOld As Worksheet Dim wsNewMV As Worksheet Dim wsTempFile As Worksheet Dim FrRngCount As Range Dim i As Integer Dim b As Integer Dim y As Integer Set wbMVRVFile = Workbooks("Databook_2016.xlsm") Set wsMvOld = wbMVRVFile.Worksheets(2) Set wsRevOld = wbMVRVFile.Worksheets(1) Set wsTempFile = wbMVRVFile.Worksheets("TempFile") wbMVRVFile.Worksheets.Add().Name = "MV " & Format(DateSerial(Year(Date), Month(Date), 0), "dd-mm-yy") Set wsMvFile = wbMVRVFile.ActiveSheet Set FrRngCount = wsMvOld.Range("A:A") i = Application.WorksheetFunction.CountA(FrRngCount) wsTempFile.Range("A1:A" & i).Value = wsMvOld.Range("A1:A" & i).Value Set wbNewMV = Workbooks.Open("F:\Reports\Data\NReport" & Format(DateSerial(Year(Date), Month(Date), 0), "yyyymmdd") & ".xls") Set wsNewMV = wbNewMV.Worksheets(1) Set FrRngCount = wsNewMV.Range("B:B") y = Application.WorksheetFunction.CountA(FrRngCount) b = i + y - 2 wsTempFile.Range("A" & i & ":A" & b).Value = wsNewMV.Range("B2:B" & y).Value wsTempFile.Range("A1:A" & b).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=wsMvFile.Range("A1"), Unique:=True Set FrRngCount = wsMvFile.Range("A:A") y = Application.WorksheetFunction.CountA(FrRngCount) 'i = 2 For i = 2 To y If Not IsError(wsMvFile.Range("B" & i) = Application.WorksheetFunction.Index(wsNewMV.Range("C1:C" & Cells(Rows.Count, "C").End(xlUp).Row), Application.WorksheetFunction.Match(wsMvFile.Range("A" & i), wsNewMV.Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row), 0), 1)) Then wsMvFile.Range("B" & i) = Application.WorksheetFunction.Index(wsMvOld.Range("B1:B" & Cells(Rows.Count, "C").End(xlUp).Row), Application.WorksheetFunction.Match(wsMvFile.Range("A" & i), wsMvOld.Range("A1:A" & Cells(Rows.Count, "B").End(xlUp).Row), 0), 1) End If Next i End Sub 

如果继续引用范围的这种方法,则需要限定用于定义Range对象的Range.Cells属性的Range.Parent属性 。

但是,您可以放弃该方法,转而使用更简洁的Range.Columns属性。

WorksheetFunction对象与严格的Excel应用程序对象略有不同。 IsError函数对后者的响应更好,因为可以将错误带入variablestypesvariables,并检查而不是抛出运行时错误。

 Dim vrw As Variant For i = 2 To y vrw = Application.Match(wsMvFile.Range("A" & i), wsNewMV.Columns(2), 0) If IsError(vrw) Then vrw = Application.Match(wsMvFile.Range("A" & i), wsMvOld.Columns(1), 0) If Not IsError(vrw) Then _ wsMvFile.Range("B" & i) = Application.Index(wsMvOld.Columns(2), vrw) Else wsMvFile.Range("B" & i) = Application.Index(wsNewMV.Columns(3), vrw, 1) End If Next i 

这可能会受益于在循环之外的With … End With语句中引用其中一个工作表,特别是在循环中重复引用,但是现在我已经为冗余引用了所有内容。

当然,你可以随时把公式写入所有的单元格中,然后将它们还原成它们的返回值。