如何使用2个工作表中的多个条件匹配和提取数据?

时间:2019-09-09 08:11:11

标签: excel vba data-manipulation

我有2个工作表,Sheet1Sheet2Sheet1是空的,除了产品编号。我必须将数据从Sheet2提取到Sheet1中,以提供更清晰的概览。

Sheet1中,区域分为AP(亚太地区),EMEA(欧洲和中东)和NA(北美),以及{{ 1}}的区别在于Sheet2(印度),IN(德国)和DE(美国) 我的工作表如下所示:

Sheet1

US

Sheet2

`       Air             |Ocean      
 Number AP  EMEA    NA  |AP EMEA    NA
 1                      |
 2                      |
 3                      |
 4                      |              `

我已经尝试将'If Then'嵌入到'Do Before Loop'中,虽然这似乎可以在调试中起作用,但我认为我的数据集太大,因此 使程序崩溃。
请注意,“ Sheet2”中的“ Sheet1”中没有#4,因为“ Sheet2”不完整。

 NUMBER GEO_CODE    FREIGHT_TYPE    FREIGHT_COST
 1          IN          Air             1
 1          IN          Ocean           2
 1          US          Air             6
 1          US          Ocean           9
 1          DE          Air             6
 1          DE          Ocean           3
 2          IN          Air             1
 2          IN          Ocean           2
 2          US          Air             7
 2          US          Ocean           8
 2          DE          Air             5
 2          DE          Ocean           4
 3          IN          Air             1
 3          IN          Ocean           2
 3          US          Air             6
 3          US          Ocean           9
 3          DE          Air             6
 3          DE          Ocean           3

如前所述,我的代码在调试模式下工作,直到到达Dim PN1 As Variant Dim PN As Variant Dim X As Integer Dim Y As Integer Dim Country As Variant Dim Plant As Variant Dim Freight As Variant Dim FreightCost As Variant Dim Lookuprng As Range Dim Result As Range Dim LibRng As Range Dim Library As Workbook Dim CostTape As Workbook Set Library = Workbooks("List2.xlsm") Set LibRng = Workbooks("List2.xlsm").Worksheets("Sheet1").Range("A1:Z10000") Set Lookuprng = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("A1:Z10000") Library.Activate X = 2 Y = 3 PN = Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X).Value PN1 = Workbooks("List2.xlsm").Worksheets("Sheet1").Range("A" & Y).Value Do Until IsEmpty(PN1) On Error Resume Next PN = Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X).Value PN1 = Workbooks("List2.xlsm").Worksheets("Sheet1").Range("A" & Y).Value Country = Workbooks("list2.xlsm").Worksheets("Sheet2").Range("F" & X).Value Freight = Workbooks("list2.xlsm").Worksheets("Sheet2").Range("I" & X).Value If PN = PN1 Then If Country = "IN" Then If Freight = "AIR" Then FreightCost = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("M" & X) Workbooks("List2.xlsm").Worksheets("Sheet1").Range("O" & Y).Value = FreightCost.Value X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If ElseIf Freight = "OCEAN" Then FreightCost = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("M" & X) Workbooks("List2.xlsm").Worksheets("Sheet1").Range("R" & Y).Value = FreightCost.Value X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If ElseIf Freight <> "OCEAN" And Freight <> "AIR" Then X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If End If End If End If If PN = PN1 Then If Country = "US" Then If Freight = "AIR" Then FreightCost = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("M" & X) Workbooks("List2.xlsm").Worksheets("Sheet1").Range("Q" & Y).Value = FreightCost.Value X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If ElseIf Freight = "OCEAN" Then FreightCost = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("M" & X) Workbooks("List2.xlsm").Worksheets("Sheet1").Range("T" & Y).Value = FreightCost.Value X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If ElseIf Freight <> "OCEAN" And Freight <> "AIR" Then X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If End If End If End If If PN = PN1 Then If Country = "DE" Then If Freight = "AIR" Then FreightCost = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("M" & X) Workbooks("List2.xlsm").Worksheets("Sheet1").Range("P" & Y).Value = FreightCost.Value X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If ElseIf Freight = "OCEAN" Then FreightCost = Workbooks("List2.xlsm").Worksheets("Sheet2").Range("M" & X) Workbooks("List2.xlsm").Worksheets("Sheet1").Range("S" & Y).Value = FreightCost.Value X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If ElseIf Freight <> "OCEAN" And Freight <> "AIR" Then X = X + 1 If PN <> Workbooks("list2.xlsm").Worksheets("Sheet2").Range("A" & X + 1).Value Then Y = Y + 1 End If End If End If End If If PN <> PN1 Then X = X + 1 End If Loop 上不存在的NUMBER
我也相信我的代码不是最有效的,运行时它会使PC崩溃。

预期结果: 根据{{​​1}}个条目在Sheet2中有正确的Freight Cost

Sheet1

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我知道您发布了VBA代码,但是如果它适合您,我将使用普通的Excel公式组成一个非VBA解决方案。您只需结合使用SUMIFS和IFS即可找到所需的值。

  

More about SUMIFS

我做了这样的数据:

Sheet2:

enter image description here

在Sheet1中,我得到了:

enter image description here

我用于范围$(document.body).on('click', '.plus-btn', function(){ var $tr = $(this).closest('tr'); //update the quantity; var $quantity = $tr.find('.quantity'); var n = $quantity.html(); var i = parseInt(n) + 1; $quantity.html(i); //update the total price var $price = $tr.find('.price'); var price = parseFloat($price.html()); var $total = $tr.find('.total'); $total.html(i*price); }); $(document.body).on('click', '.minus-btn', function(){ var $tr = $(this).closest('tr'); //update the quantity; var $quantity = $tr.find('.quantity'); var n = $quantity.html(); var i = parseInt(n) - 1; if(i<0) i = 0; $quantity.html(i); //update the total price var $price = $tr.find('.price'); var price = parseFloat($price.html()); var $total = $tr.find('.total'); $total.html(i*price); }); (从B4:D7(空气范围)开始的公式是:B4

=SUMIFS(Sheet2!$D$2:$D$19;Sheet2!$A$2:$A$19;Sheet1!$A4;Sheet2!$B$2:$B$19;IF(B$3="AP";"IN";IF(B$3="EMEA";"DE";"US"));Sheet2!$C$2:$C$19;"AIR")(海洋范围)开始,我用于范围E4:G7的公式是:

E4

两个公式都相同,唯一改变的是第三个条件(空气/海洋)

您可以向下拖动,如果有成千上万的行,请在使用公式后粘贴值。

希望这会有所帮助。

更新2: OP需要VBA解决方案。我们可以做与VBA完全相同的操作。我们可以使用相同的函数并遍历所有列和行。我发布的代码完全适合我创建数据样本的方式(行和列号以及数据位置),因此您需要修复代码以使其适应数据的存储方式。

=SUMIFS(Sheet2!$D$2:$D$19;Sheet2!$A$2:$A$19;Sheet1!$A4;Sheet2!$B$2:$B$19;IF(B$3="AP";"IN";IF(B$3="EMEA";"DE";"US"));Sheet2!$C$2:$C$19;"OCEAN")

如果您要检查某些内容,我已经将包含示例和宏版本的文件示例上传到我的Gdrive。

https://drive.google.com/open?id=1RWhJy99lTVcFjsIvAb0F2XMkX4fw9SNx

希望这会有所帮助,您可以根据需要进行调整。