excel vba вложен для каждого цикла

Я работаю над макросом excel и застрял в одной точке. Нужна помощь, пожалуйста, решить это.

Мне нужно искать 2 строки на листе, и для каждого значения в 1 строке искать значение ячейки во 2 строке. Если диапазон значений в строке 2 равен некоторому условному значению, то из строки 2 выходят проверки и устанавливается флаг как истина. Для этого я использовал два цикла For Each:

 Sub Sendmail ()
    For Each cell in Rows("5").Cells.SpecialCells(xlCellTypeConstant)
        If cells.Value Like "*@*" Then
            Subj = "Fill the Sheet"
            Recipient = cell.Offset(0,-3).Value
            EmailAddr = cell.Offset.Value
            For Each row In Sheet14.Range("O244:AK244").Cells
                If Not row = '8.00" Then
                    found = False
                Else
                    found = True
                End If
            Next row
            If found = False Then
                Msg = "Hi " & Recipient & vbCrLf & vbCrLf
                Msg = Msg & " Please fill the sheet for this week " & vbCrLf & vbCrLf
                Set MItem = Outlook.CreateItem(oIMailItem)
                With MItem  
                    .To = EmailAddr
                    .Subject = Subj
                    .Body = Msg
                    .Save
                End With
            End If
        End If
    Next
End Sub

Используемая здесь переменная found определена как логическая, но я не могу правильно ее использовать, и каждый раз, когда выполняется found = false. Я хочу только после того, как условие верно для строки 2, тогда должна быть создана только почта.


person jhakas    schedule 06.08.2013    source источник
comment
Я бы посмотрел на строку «If Not row = '8.00 Then», прежде всего, вы начинаете с одинарной кавычки и закрываете двойной кавычкой. Если это число, то кавычки не нужны, если это текст, используйте двойные кавычки с обеих сторон.   -  person ChrisProsser    schedule 06.08.2013


Ответы (2)


Несколько вещей, которые я заметил... Я не тестировал код, но вот мои общие наблюдения.

A) Один бросающийся в глаза фрагмент кода — If cells.Value Like "*@*" Then. Измените его на If cell.Value Like "*@*" Then

B) Изменить xlCellTypeConstant на xlCellTypeConstants

C) EmailAddr = cell.Offset.Value Если вы хотите получить одно и то же значение ячейки, вам не нужно Offset иначе указать параметры смещения

D) @ChrisProsser уже прокомментировал For Each row In Sheet14.Range("O244:AK244").Cells

E) Ради бога (не обращайте на это внимания... Ради себя), используйте Option Explicit! Я настоятельно рекомендую использовать Option Explicit. Я также рекомендую взглянуть на эту ссылку (СМОТРЕТЬ ПУНКТ 2 в ссылке).

Тема: Человеку свойственно ошибаться

Ссылка: http://www.siddharthrout.com/2011/08/01/to-err-is-human/

person Siddharth Rout    schedule 06.08.2013

Вы запускаете этот цикл For;

For Each row In Sheet14.Range("O244:AK244").Cells
    If Not row = '8.00" Then
        found = False
    Else
        found = True
    End If
Next row

для всего диапазона, ничего не делая для каждого условия. Это было бы то же самое, что проверять только последнюю ячейку в диапазоне, которая, вероятно, равна True, поэтому вы думаете, что False выполняется. Возможно, ваш оператор if тоже должен быть в этом цикле? Может где нашел =False есть?

person MakeCents    schedule 06.08.2013