使用VBA比较2个列表

时间:2013-10-28 14:38:04

标签: excel vba excel-vba vlookup

每个月,我从SAP数据库导出2个列表,这些列表将另存为单独的Excel文件。列表A包含上个月发现的所有缺陷。列表B包含由外部供应商引起的所有缺陷。在完成报告之前,我对ListA进行了大量格式化,并且我有一个完美地完成大部分工作的宏。我似乎无法让列表比较件工作。

我的手动过程是在列表A中插入一个新列D,在单元格D2中键入=VLOOKUP(A2,ListB!$A$2:$N$946,1,FALSE),然后将其复制到最后(查找表的范围因ListB的大小而异) )。然后,我将过滤列表以排除“#N / A”并将“原因”列(现在列E)的值更改为剩余行的“供应商”。最后,我删除了VLOOKUP列。

我认为自动化这个过程很容易,但它给了我几个迁移。我可以使用嵌套的For Loops like this完成工作,但我觉得必须有一种更有效的方法。

首先,我在For循环中尝试了Vlookup Aplication功能:

'ListA and ListB declared as Worksheets and set
Dim aRange as Range, bRange as Range
Dim last row As Integer
Set aRange = ListA.Range("A1")
Set aRange = Range(aRange, aRange.End(xlToRight))
Set aRange = Range(aRange, aRange.End(xlDown))
Set bRange = ListB.Range("A1")
Set bRange = Range(bRange, bRange.End(xlToRight))
Set bRange = Range(bRange, bRange.End(xlDown))

'I'm skipping over the stuff that would be here but don't need help with

lastrow = ListA.Range("A1").End(xlDown).Row
For i = 2 To lastrow
    ListA.Cells(i, 4).Value = Application.WorksheetFunction.VLookup(ListA.Cells(i, 1), bRange, 3, False)
    If ListA.Cells(i, 4).Value <> "#N/A" Then ListA.Cells(i, 5).Value = "Vendor"
Next i

不幸的是,此方法在第一个单元格遇到运行时错误,该错误会返回#N / A错误。

对于我的第二次尝试,我在完成手动过程时录制了一个宏,然后尝试更改返回的代码:

ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-3],Sheet1!R2C1:R946C14,1,FALSE)"
Range("D2").Select
Selection.AutoFill Destination:=Range("D2:D1033"), Type:=xlFillDefault
Range("D2:D1033").Select

到此:

Set aRange = ListA.Range("D2")
Set aRange = Range(aRange, aRange.End(xlDown))
Set bRange = ListB.Range("A1")
Set bRange = Range(bRange, bRange.End(xlToRight))
Set bRange = Range(bRange, bRange.End(xlDown))
Range("D2").FormulaR1C1 = "=VLOOKUP(RC[-3]," & bRange & ",1,FALSE)"
Range("D2").AutoFill Destination:=aRange, Type:=xlFillDefault

根据运行时错误,由于类型不匹配,此方法无效。我只能假设它不喜欢我在公式的中间插入一个范围变量,但我不知道另一种方法来确保查找表的大小合适。

非常感谢任何帮助(哪种方法更有效,如何使其中一种工作,甚至是我没想过的不同方法)。

1 个答案:

答案 0 :(得分:1)

运行时错误实际上来自WorksheetFunction.VLookup函数 - 这相当于excel公式将返回的 #N / A!。通过检查错误,我们可以找到N / A值(或者,在这种情况下,通过检查成功,我们可以写出Vendor字符串)

On Error Resume Next 'don't error out on failure to find

For i = 2 To lastrow
   Err.Clear 
   'clear out errors, as we don't want to see whatever the previous error was
   ListA.Cells(i, 4).Value = _
       Application.WorksheetFunction.VLookup(ListA.Cells(i, 1), bRange, 3, False)
   ' if no error, then we have a vendor
   If Err.Number=0 Then ListA.Cells(i, 5).Value = "Vendor"
Next i

'reset error trapping back to default 
'(or to whatever your normal error handling is
On Error Goto 0