VBA Почему мой цикл застрял на первом элементе, после того как я убедился, что он не соответствует критериям - PullRequest
0 голосов
/ 31 мая 2019

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

Как только вы снова запустите цикл, он должен найти следующую строку, которая соответствует этим аргументам.Однако это только идет к первому снова.

Я попытался отрицать это, убедившись, что она заполняет эту ячейку «в ожидании» - то есть она больше не пуста, и все же она все еще идет туда.

Вот код:

Dim i As Long 'Defining i, which will be used to loop through the ranges.

For i = 6 To 50000 'Setting the ranges -
    If Range("M" & i) = "Rejected" And Range("N" & i) = "" Then 'Searches through the ranges first job that the partner has rejected - and then checks as to whether the partner has issued their assessment.
        Range("O" & i) = "'Pending" 'Changes the first one that has been  to 'Pending' so it won't be picked up the next time the code is run.
        GoTo Email
    End If
Next

Я не совсем уверен, как еще это сделать.Мне нужно, чтобы подпрограмма была остановлена ​​после того, как она сделала электронное письмо, иначе она могла бы зацикливаться и создавать сотни одновременно, что не только перегрузило бы систему, но и привело бы к переполнению моей входящей почты.

Ps, не знаю, почему мой код форматируетстранно - извините

1 Ответ

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

Дело в том, что вы используете GoTo и делаете то, что должны делать. Перейдите на ... свой почтовый ярлык. Оказавшись там, он продолжит код вниз, никогда не поднимется, это все равно что пропустить цикл. Вместо этого вы можете поместить свой код электронной почты в другую процедуру и вызывать его при необходимости, чтобы цикл продолжался:

Option Explicit
Sub Test()

    Dim C As Range 'this will loop through the range
    Dim LastRow As Long 'this will find the last row

    With ThisWorkbook.Sheets("MySheetName") 'change MySheetName
        LastRow = .Cells(.Rows.Count, "M").End(xlUp).Row 'last row with data on column M
        For Each C In .Range("M6:M" & LastRow) 'loop through M6 to M & last row
            If C = "Rejected" And .Cells(C.Row, "N") = vbNullString And Not .Cells(C.Row, "O") = "'Pending" Then 'vbnullstring has better performance than ""
                .Cells(C.Row, "O") = "'Pending"
                Mail C.Row
            End If
        Next C
    End With

End Sub
Sub Mail(MailRow As Long)

    'Code doing your mail

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