0

每个月,我从 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

根据运行时错误,由于类型不匹配,此方法不起作用。我只能假设它不喜欢我在公式中间粘贴一个范围变量,但我不知道另一种方法可以确保查找表的大小正确。

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

4

1 回答 1

1

运行时错误实际上从WorksheetFunction.VLookup函数中是正确的 - 这相当于#N/A!excel公式将返回。通过检查错误,我们可以找到 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
于 2013-10-28T15:10:54.823 回答