2016-09-28 60 views
2

根據具體的情況從othersheet到其他值我有一個數據表,我想在其他負債,但與前conditions.For數據:在表獲取在Excel

------------------------------------------------- 
| Cell A | Cell B | Cell C | Cell D|Cell E |   
|------------------------------------------------| 
| Sku  |Order_ID|Customer_ID | Price |Status | 
|------------------------------------------------| 
| TW22  | 123 | 1  |221 | D | 
|------------------------------------------------| 
| TS44  | 124 |  2  |221 | D | 
|------------------------------------------------| 
| Ts11-ab | 33 |  3  |211 | D | 
|------------------------------------------------| 
| Ts11  | 231 |  4  |231 | D | 
|------------------------------------------------| 
| Ts11-ab | 33 |  3  |211 | R | 
|------------------------------------------------| 
| Ts11  | 231 |  4  |231 | R | 
|------------------------------------------------| 

我有數據如上EX:,現在,我要像波紋管的值在我的其他表前:

------------------------------------------------- 
| Cell A | Cell B | Cell C | Cell D|Cell E |   
|------------------------------------------------| 
| Sku  |Order_ID|Customer_ID | Price |Status | 
|------------------------------------------------| 
| TW22  | 123 | 1  |221 | D | 
|------------------------------------------------| 
| TS44  | 124 |  2  |221 | D | 
|------------------------------------------------| 
| Ts11-ab | 33 |  3  |211 | R | 
|------------------------------------------------| 
| Ts11  | 231 |  4  |231 | R | 
|------------------------------------------------| 

我試圖VLOOKUP和其他配方淨找到,但我不需要幫助。

更新:如果訂單ID在工作表1中具有狀態「D」和「R」中的兩個記錄,則它應該在工作表2中顯示僅具有狀態「R」的條目。並且如果只有一個記錄具有狀態「D」,那麼它應該在表2中顯示該記錄。謝謝

回答

2

排序和刪除重複項可能會對您有所幫助。

將數據重新命名爲「raw_data」,並在名爲「new_data」的同一工作簿中創建新的空白工作表。在片NEW_DATA」,你會得到的結果。

試試下面的代碼

Sub copy_sheet() 

Dim raw_data, new_data As Worksheet 

Set raw_data = ThisWorkbook.Sheets("raw_data") 
Set new_data = ThisWorkbook.Sheets("new_data") 

raw_data.Activate 
Range("A1:E1").Select 
Range(Selection, Selection.End(xlDown)).Copy 
new_data.Activate 
Range("A1").PasteSpecial xlPasteValues 
Range("A1").Sort key1:=Range("E1"), order1:=xlDescending, Header:=xlYes 
Range("A1:E1").Select 
Range(Selection, Selection.End(xlDown)).RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes 
Range("A1").Sort key1:=Range("E1"), order1:=xlAscending, Header:=xlYes 
Range("A1").Activate 
End Sub 
+0

謝謝,它的工作 – biz

3

注意:我對VBA本人很新,所以這很麻煩,但應該工作。

讓RawData成爲您提到的第一張帶有重複項的完整列表,並且如果存在「D」,讓NewData成爲第二個帶有「R」的工作表。

Option Explicit 

Sub RemoveDuplicates() 
Dim i As Integer 
i = 3 
Worksheets("RawData").Activate 
Range("A1:E2").Copy 
Worksheets("NewData").Activate 
Range("A1").Activate 
     ActiveCell.PasteSpecial Paste:=xlPasteValues 

Do While Sheets("RawData").Cells(i, 1).Value <> "" 
If Sheets("NewData").Range("A:A").Find(Sheets("RawData").Cells(i, 1),   LookAT:=xlWhole) Is Nothing Then 
Worksheets("RawData").Activate 
Range(Cells(i, 1), Cells(i, 5)).Copy 
Worksheets("NewData").Activate 
     Range("A1").End(xlDown).Offset(1, 0).Activate 
     ActiveCell.PasteSpecial Paste:=xlPasteValues 
Else 
    Worksheets("RawData").Activate 
Range(Cells(i, 1), Cells(i, 5)).Copy 
Worksheets("NewData").Activate 
Sheets("NewData").Range("A:A").Find(Sheets("RawData").Cells(i, 1),  LookAT:=xlWhole).Activate 
     ActiveCell.PasteSpecial Paste:=xlPasteValues 
    End If 

    i=i+1 
    Loop 

所以它所做的是檢查項目是否已經存在於列表中。如果確實如此,則用新數據覆蓋它。

+0

感謝您的幫助..我嘗試過,但遇到錯誤..試圖解決,如果有運氣..您的幫助反正感謝 – biz

+0

Drat。我也會處理它,你也可以有同樣的SKU去多個客戶嗎?我沒有在檢查重複方面包括它(這實際上只是尋找重複的SKU號碼。) –

+0

嘗試新的代碼(仍然不檢查客戶或任何東西,但應該正確運行。) –

2

這聽起來像你想要使用Dictionary類。這與VBA打包在一起,但默認情況下未啓用 - 您需要通過向「Microsoft Scripting Runtime」添加引用(Tools-> References)來添加它。

該詞典允許您存儲鍵值對。我通過您的樣本數據假設「訂單編號」構成了一個獨特的「記錄」。如果是這樣的話,這應該起作用 - 如果不是這樣,只需將鍵改爲定義明確記錄的任何東西即可。

此代碼不處理格式,但您可以輕鬆管理該格式。這只是向您展示如何在出現新記錄時更新舊行的值。

Sub CopySheet() 
    Dim rw As Range 
    Dim findRow, newRow As Integer 
    Dim ws1, ws2 As Worksheet 
    Dim data As New Scripting.Dictionary 
    Dim status, orderId As String 

    Set ws1 = Sheets("Sheet1") 
    Set ws2 = Sheets("Sheet2") 
    newRow = 1 

    For Each rw In ws1.Rows 
    If ws1.Cells(rw.row, 1).Value2 = "" Then 
     Exit For 
    End If 

    orderId = ws1.Cells(rw.row, 2).Value2 
    status = ws1.Cells(rw.row, 5).Value2 

    If data.Exists(orderId) Then 
     findRow = data(orderId) ' found it -- replace existing 
     If status <> "R" Then  ' if it's not "R", don't overwrite 
     findRow = 0 
     End If 
    Else 
     findRow = newRow   ' never seen this order before 
     data.Add orderId, findRow ' add it to the dictionary 
     newRow = newRow + 1  ' add record on a new line 
    End If 

    If findRow > 0 Then 
     ws2.Range("A" & findRow & ":E" & findRow).Value = _ 
      ws1.Range("A" & rw.row & ":E" & rw.row).Value 
    End If 
    Next rw 
End Sub 

字典是非常有效的。這意味着如果你擁有巨大的列表,他們不會像典型的Excel查詢那樣遭受典型的Excel性能滯後。