Как создать дочерний номер детали из родительских данных в VBA - PullRequest
1 голос
/ 03 мая 2019

У меня есть два листа:

  • MHT
  • TitleHelper

MHT содержит информацию о продукте, например: MHT Sheet

и TitleHelper содержит информацию о вариантах, такую ​​как: Лист TitleHelper

, и вот то, что ожидаемый результат должен быть на листе MHT: Результат MHT


Таким образом, чтобы получить ожидаемый результат, мы должны сравнить конкретные ячейки из каждой строки MHT с TitleHelper

Итак, сначала нам нужно сопоставить Pattern1 OR Pattern2 (Col J или Col K) MHT с TitleHelpersPattern (Col A).Таким образом, первый элемент (D123456) имеет ДВУХ совпадений для шаблона.

Другой критерий соответствия состоит в том, что вес на MHT (Col H) должен быть меньше или равен максимальному весу и больше или равенМинимальный вес соответствующего шаблона на TitleHelper (Col B & C)

Если эти критерии соблюдены: для каждого соответствия мне нужно вставить строку ниже исходного элемента в MHT и добавить звездочку с дочерним кодомматча в конце номера.Так как у D123456 было два матча, и вес был правильным.он добавляет две строки под ним.Первая вставленная строка, имеющая номер детали "D123456 * M" для первого совпадения, и вторая вставленная строка, имеющая номер детали "D123456 * XL"

Если шаблон соответствует, но вес не находится междуминимум и максимум он просто пропустит строку и ничего не вставит, поэтому «H10-101» не получил под ней номер детали для ребенка.


Не знаю, полезно ли это, ноВот моя попытка, и я просто застрял в той части, где оператор for для каждого оператора if и цикл взаимодействуют друг с другом.а также включение циклического перебора по обоим рабочим листам.

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

Выше приведен последний подпункт для моего рабочего листа

1 Ответ

0 голосов
/ 03 мая 2019

Как то так. Примечание: это гораздо проще сделать в 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
...