我想知道是否有一种方法在VBA中有一个宏检查SKU和存储从“SheetB”,如果发现在“SheetA”然后取代“STORE”,“PRODUCT_TYPE”和“CONCAT”列的信息从“SheetB”(蓝色)和循环通过表,如果新的被添加。
*示例:*所有Sku为:95908352和商店:-1\f25 SheetA-1中的信息将更改为-1\f25“SheetB”-1上的蓝色列。SheetA STORE将替换为SheetB Store(Autofill),SheetA PRODUCT_TYPE将替换为SheetB Product Type(Autofill),SheetA CONCAT将替换为SheetB Move to。
如果有更多的异常添加到SheetB表中,则循环遍历该列表。
SheetA(之前):
SheetB:
表A(后):
Dim wsD As Worksheet, wsE As Worksheet, r As Long
Dim rngData As Range, rngEx As Range, mH, mR, col As Long, hdr, v
Dim rngCopy As Range, lr As Long, addr
Set wsD = ThisWorkbook.Worksheets("Data")
Set wsE = ThisWorkbook.Worksheets("SKU Exceptions")
Set rngData = wsD.Range("A3:Z" & wsD.Cells(Rows.Count, "A").End(xlUp).Row)
For col = 1 To 3 'loop the columns on the exceptions sheet
lr = wsE.Cells(Rows.Count, col).End(xlUp).Row
If lr > 1 Then
'get the values and find on "Data"
hdr = Replace(wsE.Cells(1, col).Value, "Product Type (Move to) ", "")
hdr2 = Replace(wsE.Cells(1, col).Value, "Store (Autofill) ", "")
mH = Application.Match(hdr, rngData.Columns(17), 0) And Application.Match(hdr2, rngData.Columns(1), 0)
If Not IsError(mH) Then 'matched both values?
For r = 2 To lr
v = wsE.Cells(r, col).Value
mR = Application.Match(v, rngData.Columns(17), 0)
If Not IsError(mR) Then
'Copy new values over
Else
'value was not matched
MsgBox "Value '" & v & "' not found on Data sheet!"
End If
Next r
Else
'header not matched
MsgBox "Header '" & hdr & "' not found on data sheet!"
End If
End If
Next col
MsgBox "Sku's have been reordered successfully!", vbInformation, "Reorder Sku's Macro"
2条答案
按热度按时间kqqjbcuj1#
当匹配>1列时,使用脚本字典来创建组合键和相应行的Map通常更容易:
yyyllmsg2#
如果我没理解错的话…
子创建rgE,它是从B2到行尾的wsE列SKU的范围。然后它循环到rgE内的每个细胞。
在循环期间,它检查是否在wsD列3中找到循环的单元格值,然后设置rgStore变量。因此,rgStore是wsD的列A中的范围,其中rgStore的单元格偏移(0,2)值是循环单元格值。
接下来,它检查是否在rgStore中找到循环的cell. offset(0,-1)值,然后它设置rgR变量。因此,rgR是wsD的列A中的范围,其中rgR的单元格值是循环单元格. offset(0,-1).值,而单元格. offset(0,2)值是循环单元格值。
最后得到所需的结果。
未使用虚拟数据进行测试。