如何从 VBA 中的父数据创建子零件号
How to create child part number from parent data in VBA
我有两个 sheet:
- MHT
- TitleHelper
MHT 包含如下产品信息:
MHT Sheet
TitleHelper 包含变体信息,例如:TitleHelper Sheet
这是 sheet MHT 上的预期结果:MHT Result
因此,为了获得预期的结果,我们必须将 MHT 每一行的特定单元格与 TitleHelper
进行比较
所以首先我们需要将 MHT 的模式 1 或模式 2(Col J 或 Col K)与 TitleHelpers 模式(Col A)相匹配。所以第一项 (D123456) 有两个模式匹配项。
另一个匹配标准是 MHT 上的权重(H 列)需要小于或等于最大权重并且大于或等于 TitleHelper 上匹配模式的最小权重(B 列和 C 列) )
如果满足这些条件:对于每个匹配项,我都需要在 MHT 上的原始项目下方插入一行,并在零件号末尾添加一个带有匹配项子代码的星号。所以因为 D123456 有两场比赛并且重量是正确的。它在其下方添加了两行。第一个插入的行具有第一个匹配项的部件号 "D123456*M",第二个插入的行具有部件号 "D123456*XL"
如果模式匹配但权重不在最小值和最大值之间,它将跳过该行而不插入任何内容,这就是为什么 "H10-101" 没有收到其下的子部件号。
我不知道这是否有帮助,但这是我的尝试,我只是卡在 for each 语句、if 语句和循环相互交互的部分。以及通过这两项工作合并循环sheets.
Sub parentCHILD()
Dim childROW As Long
Dim parentROW As Long
Dim childPATTERN As Range
Dim oMAX As Range
Dim oMIN As Range
Dim parentPATTERN As Range
Dim parentPATTERN2 As Range
Dim parentWEIGHT As Range
Dim i As Long
With Sheets("TitleHelper")
Set childROW = Cells(Rows.Count, 1).End(xlUp).Row
Set childPATTERN = Range("A" & childROW)
Set oMAX = Range("B" & childROW)
Set oMIN = Range("C" & childROW)
End With
With Sheets("MHT")
Set parentRow = Cells(Rows.Count, 1).End(xlUp).Row
Set parentPATTERN = Range("J" & parentROW)
Set parentPATTERN2 = Range("K" & parentROW)
Set parentWEIGHT = Range("H" & parentROW)
For i = 1 To childROW
if parentPATTERN or parentPATTERN2 = childPATTERN and parentWEIGHT <= oMAX and parentWEIGHT >= oMIN then . . .
Next i
End With
End Sub
编辑:这是对@N8 代码的改编
Sub parentCHILD()
Dim childROWmax As Long
Dim parentROWmax As Long
Dim i As Long
Dim j As Long
Dim parentPATTERN As Range
Dim parentPATTERN2 As Range
Dim parentWEIGHT As Range
Dim childPATTERN As Range
Dim oMAX As Range
Dim oMIN As Range
Dim childCODE As Range
Dim parentPART As Range
Dim newPART As String
childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
parentROWmax = Sheets("MHT").Cells(Rows.Count, 1).End(xlUp).Row
MHTROWmax = Sheets("MHT Result").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To parentROWmax
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'get MHT row info for comparison
Set parentPATTERN = Worksheets("MHT").Range("J" & i)
Set parentPATTERN2 = Worksheets("MHT").Range("K" & i)
Set parentWEIGHT = Worksheets("MHT").Range("H" & i)
Set parentPART = Worksheets("MHT").Range("A" & i)
'Write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
For j = 2 To childROWmax
'get TitleHelper row info for comparison
Set childPATTERN = Worksheets("TitleHelper").Range("A" & j)
Set oMAX = Worksheets("TitleHelper").Range("C" & j)
Set oMIN = Worksheets("TitleHelper").Range("B" & j)
Set childCODE = Worksheets("TitleHelper").Range("F" & j)
newPART = parentPART & "*" & childCODE
'Perform if/then
If (parentPATTERN = childPATTERN _
Or parentPATTERN2 = childPATTERN) _
And parentWEIGHT <= oMAX _
And parentWEIGHT >= oMIN Then
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'Criteria is met, write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
Sheets("MHT Result").Cells(MHTROWmax, 1) = newPART
End If
Next j
Next i
End Sub
以上是我作品的最终子集sheet
像这样。注意:这在 SQL 中要简单得多。这是建立数据库来解决的一类问题。
Sub parentCHILD()
Dim childROWmax As Long
Dim parentROWmax As Long
Dim i As Long
Dim j As Long
childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
parentROWmax = Sheets("MHT").Cells(Rows.Count, 1).End(xlUp).Row
MHTROWmax = Sheets("MHT Result").Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To parentROWmax
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'get MHT row info for comparison
'Write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
For j = 1 To childROWmax
'get TitleHelper row info for comparison
'Perform if/then
If (parentPATTERN = childPATTERN _
or parentPATTERN2 = childPATTERN) _
and parentWEIGHT <= oMAX _
and parentWEIGHT >= oMIN then
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'Criteria is met, write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
Sheets("MHT Result").Cells(MHTROWmax, 1) = concatValue
End If
Next j
Next i
我有两个 sheet:
- MHT
- TitleHelper
MHT 包含如下产品信息: MHT Sheet
TitleHelper 包含变体信息,例如:TitleHelper Sheet
这是 sheet MHT 上的预期结果:MHT Result
因此,为了获得预期的结果,我们必须将 MHT 每一行的特定单元格与 TitleHelper
进行比较所以首先我们需要将 MHT 的模式 1 或模式 2(Col J 或 Col K)与 TitleHelpers 模式(Col A)相匹配。所以第一项 (D123456) 有两个模式匹配项。
另一个匹配标准是 MHT 上的权重(H 列)需要小于或等于最大权重并且大于或等于 TitleHelper 上匹配模式的最小权重(B 列和 C 列) )
如果满足这些条件:对于每个匹配项,我都需要在 MHT 上的原始项目下方插入一行,并在零件号末尾添加一个带有匹配项子代码的星号。所以因为 D123456 有两场比赛并且重量是正确的。它在其下方添加了两行。第一个插入的行具有第一个匹配项的部件号 "D123456*M",第二个插入的行具有部件号 "D123456*XL"
如果模式匹配但权重不在最小值和最大值之间,它将跳过该行而不插入任何内容,这就是为什么 "H10-101" 没有收到其下的子部件号。
我不知道这是否有帮助,但这是我的尝试,我只是卡在 for each 语句、if 语句和循环相互交互的部分。以及通过这两项工作合并循环sheets.
Sub parentCHILD()
Dim childROW As Long
Dim parentROW As Long
Dim childPATTERN As Range
Dim oMAX As Range
Dim oMIN As Range
Dim parentPATTERN As Range
Dim parentPATTERN2 As Range
Dim parentWEIGHT As Range
Dim i As Long
With Sheets("TitleHelper")
Set childROW = Cells(Rows.Count, 1).End(xlUp).Row
Set childPATTERN = Range("A" & childROW)
Set oMAX = Range("B" & childROW)
Set oMIN = Range("C" & childROW)
End With
With Sheets("MHT")
Set parentRow = Cells(Rows.Count, 1).End(xlUp).Row
Set parentPATTERN = Range("J" & parentROW)
Set parentPATTERN2 = Range("K" & parentROW)
Set parentWEIGHT = Range("H" & parentROW)
For i = 1 To childROW
if parentPATTERN or parentPATTERN2 = childPATTERN and parentWEIGHT <= oMAX and parentWEIGHT >= oMIN then . . .
Next i
End With
End Sub
编辑:这是对@N8 代码的改编
Sub parentCHILD()
Dim childROWmax As Long
Dim parentROWmax As Long
Dim i As Long
Dim j As Long
Dim parentPATTERN As Range
Dim parentPATTERN2 As Range
Dim parentWEIGHT As Range
Dim childPATTERN As Range
Dim oMAX As Range
Dim oMIN As Range
Dim childCODE As Range
Dim parentPART As Range
Dim newPART As String
childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
parentROWmax = Sheets("MHT").Cells(Rows.Count, 1).End(xlUp).Row
MHTROWmax = Sheets("MHT Result").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To parentROWmax
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'get MHT row info for comparison
Set parentPATTERN = Worksheets("MHT").Range("J" & i)
Set parentPATTERN2 = Worksheets("MHT").Range("K" & i)
Set parentWEIGHT = Worksheets("MHT").Range("H" & i)
Set parentPART = Worksheets("MHT").Range("A" & i)
'Write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
For j = 2 To childROWmax
'get TitleHelper row info for comparison
Set childPATTERN = Worksheets("TitleHelper").Range("A" & j)
Set oMAX = Worksheets("TitleHelper").Range("C" & j)
Set oMIN = Worksheets("TitleHelper").Range("B" & j)
Set childCODE = Worksheets("TitleHelper").Range("F" & j)
newPART = parentPART & "*" & childCODE
'Perform if/then
If (parentPATTERN = childPATTERN _
Or parentPATTERN2 = childPATTERN) _
And parentWEIGHT <= oMAX _
And parentWEIGHT >= oMIN Then
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'Criteria is met, write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
Sheets("MHT Result").Cells(MHTROWmax, 1) = newPART
End If
Next j
Next i
End Sub
以上是我作品的最终子集sheet
像这样。注意:这在 SQL 中要简单得多。这是建立数据库来解决的一类问题。
Sub parentCHILD()
Dim childROWmax As Long
Dim parentROWmax As Long
Dim i As Long
Dim j As Long
childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
parentROWmax = Sheets("MHT").Cells(Rows.Count, 1).End(xlUp).Row
MHTROWmax = Sheets("MHT Result").Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To parentROWmax
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'get MHT row info for comparison
'Write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
For j = 1 To childROWmax
'get TitleHelper row info for comparison
'Perform if/then
If (parentPATTERN = childPATTERN _
or parentPATTERN2 = childPATTERN) _
and parentWEIGHT <= oMAX _
and parentWEIGHT >= oMIN then
'Increment Result sheet row
MHTROWmax = MHTROWmax + 1
'Criteria is met, write a row to MHT Result Table
Sheets("MHT").Rows(i).Copy Sheets("MHT Result").Rows(MHTROWmax)
Sheets("MHT Result").Cells(MHTROWmax, 1) = concatValue
End If
Next j
Next i