2013-10-28 63 views
0

每個月,我從SAP數據庫中導出2個列表,並將其保存爲單獨的Excel文件。列表A包含上個月發現的所有缺陷。清單B包含由外部供應商引起的所有缺陷。在完整的報告之前,我對ListA做了很多格式化,並且我有一個完美的大部分宏。我似乎無法得到列表比較片的工作。使用VBA比較2個列表

我的手動過程是在列表A中插入一個新列D,在012格中輸入=VLOOKUP(A2,ListB!$A$2:$N$946,1,FALSE),並將其複製到最後(查找表的範圍因ListB的大小而異)。然後,我將篩選列表以排除「#N/A」,並將其餘行中的「原因」列(現在列E)的值更改爲「供應商」。最後,我刪除了VLOOKUP列。

我認爲自動化這個過程很容易,但它給了我幾個migranes。我可以通過嵌套For循環完成工作like this,但我覺得必須有一個更有效的方法。

首先,我嘗試內的VLOOKUP Aplication功能For循環:

'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 

這種方法ISN」根據運行時錯誤,由於類型不匹配而無法工作。我只能假設它不喜歡我在公式中間粘貼可變範圍,但我不知道另一種確保查找表是正確大小的方法。

任何幫助(哪種方法更有效率,如何讓這些工作中的一種,甚至是我沒有想到的其他方法)都非常感謝。

回答

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