我编写了以下代码,使用索引匹配循环将外部工作表中的值传入我的工作簿。如果错误发生在索引/匹配公式中,它应该从我当前工作簿中的工作表中检索另一个值。
循环一直有效,直到它从我当前工作簿中的工作表中获取它应该引入的第一个值。
关于如何修复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
答案 0 :(得分:1)
如果您继续使用这种引用范围的方法,则需要限定用于定义Range.Parent property的Range.Cells property的Range 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中的一个工作表,尤其是当您在循环中重复引用时,但我现在已经将所有内容冗余地引用了。
当然,您可以随时将公式写入所有单元格,然后将其还原为返回值。