两个循环内的if语句内的循环

时间:2019-06-05 20:13:54

标签: excel vba

Sub aaa()
Dim childROWmax    As Long
Dim parentROWmax   As Long
Dim i              As Long
Dim j              As Long
Dim z              As Long
Dim p              As Long
Dim n              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
Dim newSHEET       As Worksheet
Dim oldSHEET       As Worksheet

Set oldSHEET = ActiveSheet
parentROWmax = oldSHEET.Cells(Rows.Count, 1).End(xlUp).Row
Set newSHEET = ThisWorkbook.Sheets.Add(After:= _
             ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    newSHEET.Name = "Result"
childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
MHTROWmax = newSHEET.Cells(Rows.Count, 1).End(xlUp).Row


    For i = 2 To parentROWmax
        z = 1
        n = 0

        'Increment Result sheet row
        MHTROWmax = MHTROWmax + 1

        'get MHT row info for comparison
           Set parentPATTERN = oldSHEET.Range("J" & i)
           Set parentPATTERN2 = oldSHEET.Range("K" & i)
           Set parentWEIGHT = oldSHEET.Range("H" & i)
           Set parentPART = oldSHEET.Range("A" & i)

        'Write a row to MHT Result Table
        oldSHEET.Rows(i).Copy newSHEET.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 _
               And z < 5 Then
                   z = z + 1

                'Increment Result sheet row
                MHTROWmax = MHTROWmax + 1

                'Criteria is met, write a row to MHT Result Table
                oldSHEET.Rows(i).Copy newSHEET.Rows(MHTROWmax)
                newSHEET.Cells(MHTROWmax, 1) = newPART
                    For p = 2 To childROWmax

                         If (parentPATTERN = Worksheets("TitleHelper").Range("A" & p) _
                          Or parentPATTERN2 = Worksheets("TitleHelper").Range("A" & p)) _
                          And parentWEIGHT <= Worksheets("TitleHelper").Range("C" & p) _
                          And parentWEIGHT >= Worksheets("TitleHelper").Range("B" & p) _
                         And n < 4 Then
                             n = n + 1

                          newSHEET.Cells(MHTROWmax, 19 + n) = Worksheets("TitleHelper").Range("E" & p).Value
                         End If
                    Next p
                End If
        Next j
    Next i
End Sub

所以我有此VBA代码,该代码在工作表中循环(oldSHEET) 对于oldSHEET中的每一行,它将向newSHEET添加一行 然后它将复制该行到新行 然后它将遍历另一个工作表(TitleHelper) 对于TitleHelper中的每一行,它将通过IF语句 如果该语句为true,则会在newSHEET中添加一行 然后它将复制该行到新行 然后它将新行中的第一个单元格替换为newPART 然后它将再次遍历TitleHelper 对于TitleHelper中的每一行,它将通过IF语句 如果该语句为真,它将替换新行的第19 + n列

应该是代码的结尾,但是如果我将第一个IF语句的结尾放在P循环上方,它将仅在J循环的第一次迭代中执行第19 + n个替换,因为“ MHTROWmax = MHTROWmax +1“

如果第一个IF语句在第二个IF语句之前在“ Next P”之前结束,则会给我一个错误代码。

如果If语句保持原样,它将在J循环的第一次迭代中编写第19个+ n替换,然后为其他迭代做一些奇怪的事情。

我已包含我的工作表的副本 仅在“ MHT”处于活动状态时使用宏 (编辑:添加了应显示的结果页面。注意:您必须更改“结果”的名称才能运行宏) https://drive.google.com/file/d/1ZbmcIr_bRp_f6cngMeZevj7zujcdW1RC/view?usp=sharing

这也是预期结果的图像 Expected Results

1 个答案:

答案 0 :(得分:0)

好吧,所以我通过实际执行最后一个循环(p循环)并使用i循环再次将其弄清楚了。因此,它实际上是2个双循环,而不是1个三重循环。绝对有更好的方法可以做到这一点,但是我很高兴我想出了所有解决办法。

因此基本上是前两个循环:

-遍历oldSHEET

-将复制的行从oldSHEET添加到newSHEET

-遍历TitleHelper

-如果语句为true,则将复制的行从oldSHEET添加到newSHEET

-将新行的第一个单元格更改为newPART

然后,我将oldSHEET和newSHEET的值更改为“ Result”,并新建一个工作表“ Result2”

后两个循环:

-遍历oldSHEET

-将复制的行从oldSHEET添加到newSHEET

-遍历TitleHelper

-如果语句为true,则替换新行的第19 + n列

Sub ParentPartOne()
    Dim childROWmax    As Long
    Dim parentROWmax   As Long
    Dim i              As Long
    Dim j              As Long
    Dim z              As Long
    Dim p              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
    Dim newSHEET       As Worksheet
    Dim oldSHEET       As Worksheet

    Set oldSHEET = ActiveSheet
    parentROWmax = oldSHEET.Cells(Rows.Count, 1).End(xlUp).Row
    Set newSHEET = ThisWorkbook.Sheets.Add(After:= _
                                           ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    newSHEET.Name = "Result"
    childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
    MHTROWmax = newSHEET.Cells(Rows.Count, 1).End(xlUp).Row


    For i = 2 To parentROWmax
        z = 1
        n = 0

       'Increment Result sheet row
        MHTROWmax = MHTROWmax + 1

       'get MHT row info for comparison
        Set parentPATTERN = oldSHEET.Range("J" & i)
        Set parentPATTERN2 = oldSHEET.Range("K" & i)
        Set parentWEIGHT = oldSHEET.Range("H" & i)
        Set parentPART = oldSHEET.Range("A" & i)

       'Write a row to MHT Result Table
        oldSHEET.Rows(i).Copy newSHEET.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 _
            And z < 5 Then
                z = z + 1

               'Increment Result sheet row
                MHTROWmax = MHTROWmax + 1

               'Criteria is met, write a row to MHT Result Table
                oldSHEET.Rows(i).Copy newSHEET.Rows(MHTROWmax)
                newSHEET.Cells(MHTROWmax, 1) = newPART
            End If
        Next j
    Next i

    Set oldSHEET = Sheets("Result")
    parentROWmax = oldSHEET.Cells(Rows.Count, 1).End(xlUp).Row
    Set newSHEET = ThisWorkbook.Sheets.Add(After:= _
                                           ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    newSHEET.Name = "Result2"
    childROWmax = Sheets("TitleHelper").Cells(Rows.Count, 1).End(xlUp).Row
    MHTROWmax = newSHEET.Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To parentROWmax
        z = 1
        n = 0

       'Increment Result sheet row
        MHTROWmax = MHTROWmax + 1

       'get MHT row info for comparison
        Set parentPATTERN = oldSHEET.Range("J" & i)
        Set parentPATTERN2 = oldSHEET.Range("K" & i)
        Set parentWEIGHT = oldSHEET.Range("H" & i)
        Set parentPART = oldSHEET.Range("A" & i)

       'Write a row to MHT Result Table
        oldSHEET.Rows(i).Copy newSHEET.Rows(MHTROWmax)

        For p = 2 To childROWmax

        If (parentPATTERN = Worksheets("TitleHelper").Range("A" & p) _
        Or parentPATTERN2 = Worksheets("TitleHelper").Range("A" & p)) _
        And parentWEIGHT <= Worksheets("TitleHelper").Range("C" & p) _
        And parentWEIGHT >= Worksheets("TitleHelper").Range("B" & p) _
        And n < 4 Then
            n = n + 1

                newSHEET.Cells(MHTROWmax, 19 + n) = Worksheets("TitleHelper").Range("E" & p).Value
            End If
        Next p
    next i

End Sub
相关问题