IFERROR与VBA中的INDEX / MATCH

时间:2016-04-15 17:46:23

标签: excel vba excel-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

1 个答案:

答案 0 :(得分:1)

如果您继续使用这种引用范围的方法,则需要限定用于定义Range.Parent propertyRange.Cells propertyRange object

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

WorksheetFunction object与严格Excel Application object略有不同。 IsError function对后者的响应更好,因为错误可以被带入变量类型变量并进行检查而不是抛出运行时错误。

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 statement中的一个工作表,尤其是当您在循环中重复引用时,但我现在已经将所有内容冗余地引用了。

当然,您可以随时将公式写入所有单元格,然后将其还原为返回值。

相关问题