根据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 | |------------------------------------------------| 

我在上面的工作表中有数据,例如:,现在我想在我的其他表中的数值如下:

 ------------------------------------------------- | 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”的两个logging,则应该在工作表2中显示仅具有状态“R”的条目。并且如果只有一个具有状态“D”的logging,那么它应该显示该表中的logging2.谢谢

sorting和删除重复可能会帮助你。

将数据重命名为“raw_data”,并在名为“new_data”的同一工作簿中创build新的空白工作表。 在工作表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 

注意:我自己对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 

所以它所做的是检查项目是否已经存在于列表中。 如果是,那么它会用新的数据覆盖它。

这听起来像你想要使用Dictionary类。 这与VBA打包,但默认情况下不启用 – 您需要添加一个参考(工具 – >参考)到“Microsoft脚本运行时”。

Dictionary允许您存储键值对。 根据您的样本数据,我认为“订单编号”是一个独特的“logging”。 如果是这样的话,这应该工作 – 如果没有,只要将键改为定义一个独特的logging。

此代码不处理格式,但您可以轻松pipe理。 这只是向您展示如何在出现新logging时更新旧行的值。

 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性能的影响。