每个月,我从 SAP 数据库中导出 2 个列表,这些列表保存为单独的 Excel 文件。清单 A 包含上个月发现的所有缺陷。清单 B 包含由外部供应商引起的所有缺陷。在 ListA 成为完整报告之前,我对其进行了很多格式化,并且我有一个可以完美完成大部分工作的宏。我似乎无法让列表比较工作。
我的手动过程是在 List A 中插入一个新列 D,在=VLOOKUP(A2,ListB!$A$2:$N$946,1,FALSE)
单元格 D2 中键入,然后将其复制到末尾(查找表的范围因 ListB 的大小而异)。然后,我将过滤列表以排除“#N/A”,并将剩余行的“原因”列(现在是 E 列)的值更改为“供应商”。最后,我删除了 VLOOKUP 列。
我认为自动化这个过程会很容易,但它给了我几个偏头痛。我可以像这样使用嵌套的 For 循环来完成工作,但我觉得必须有一种更有效的方法。
首先,我在 For 循环中尝试了 Vlookup 应用函数:
'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
根据运行时错误,由于类型不匹配,此方法不起作用。我只能假设它不喜欢我在公式中间粘贴一个范围变量,但我不知道另一种方法可以确保查找表的大小正确。
非常感谢任何帮助(哪种方法更有效,如何使其中一种工作,甚至是我没有想到的不同方法)。