VBA Nested Loop - PullRequest
       9

VBA Nested Loop

0 голосов
/ 23 сентября 2019

Я застрял, вставляя цикл for внутри функции For.По сути, сценарий должен искать строки в массиве, а затем вставлять его в D38 и вставлять значение следующей строки в следующую ячейку с шагом 3 (как видно из For x = 38 To 100 Step 3).У меня проблема в том, что Next x пропускает следующее значение строки и цикл застревает.Я попытался вставить For x = 38 To 100 Step 3 в оператор Else первого цикла for, но он не работает.Что еще я могу сделать, чтобы это исправить?Спасибо!

strings = Array("String 1", "String 2")

For Each strng In strings
    strSearch = strng
For x = 38 To 100 Step 3
    Worksheets("Paste Results Here").Activate
    With ActiveSheet.Columns("D:D")
        Set rFind = .Find(strSearch, LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlNext, MatchCase:=True)
    If rFind Is Nothing Then
            MsgBox ("There is no " & strSearch)
            Exit Sub
    Else
            rFind.Activate
            ActiveCell.Offset(0, 5).Resize(3, 1).Copy
            Worksheets("Data").Activate
            Set rng = Worksheets("Data").Cells(x, 4)
            rng.Activate
            ActiveCell.PasteSpecial xlValues
     End If

    End With
Next x
Next strng

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Я верю, что это то, что вы пытаетесь сделать, но дайте мне знать, если это не так.Избавьтесь от внутреннего цикла все вместе и только увеличивайте x на 3, когда строка найдена.

strings = Array("String 1", "String 2")
x = 38
For Each strng In strings
    strSearch = strng
    Worksheets("Paste Results Here").Activate
    With ActiveSheet.Columns("D:D")
        Set rFind = .Find(strSearch, LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlNext, MatchCase:=True)
        If rFind Is Nothing Then
            MsgBox ("There is no " & strSearch)
            Exit Sub
        Else
            rFind.Offset(0, 5).Resize(3, 1).Copy
            Worksheets("Data").Activate
            Set rng = Worksheets("Data").Cells(x, 4)
            rng.PasteSpecial xlValues
            x = x + 3
        End If
    End With
Next strng
0 голосов
/ 23 сентября 2019

Exit Sub полностью выходит из области действия процедуры.

Вы не хотите этого - вы хотите выйти из внутреннего цикла, но продолжайте итерацию для выполнения следующего поиска.

Exit For сделает это.

If rFind Is Nothing Then
        MsgBox ("There is no " & strSearch)
        Exit For

Не ясно, каковы ваши условия, но звучит так, как будто вы также хотите Exit For, когда у вас do есть совпадение.Теперь, если вы выйдете из цикла независимо от того, нашли ли вы то, что искали, пересмотрите, нужен ли вам внутренний цикл вообще.

Или найдите каждую строку поиска для каждого значенияx вместо поиска каждого значения x для каждой строки поиска, , как предложил Скотт ("перевернуть петли"):

For x = 38 To 100 Step 3
    For Each strng In strings

        Set rFind = Range.Find...
        If Not rFind Is Nothing Then
            ...paste special...
        Else
            ...msgbox
        End If

    Next
Next

Используйте Exit For для выхода из циклаbody и Exit Sub для полного выхода из процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...