我有2个工作表,Sheet1
和Sheet2
,Sheet1
是空的,除了产品编号。我必须将数据从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
任何帮助将不胜感激!
答案 0 :(得分:1)
我知道您发布了VBA代码,但是如果它适合您,我将使用普通的Excel公式组成一个非VBA解决方案。您只需结合使用SUMIFS和IFS即可找到所需的值。
我做了这样的数据:
Sheet2:
在Sheet1中,我得到了:
我用于范围$(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
希望这会有所帮助,您可以根据需要进行调整。