2013-08-06 2 views
0

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

Мне нужно найти 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, тогда должна быть создана только почта.

+0

я смотрел бы на линии «Если не грести =„8,00" Тогда“, прежде всего, начать с одного цитата и закрыть двойную кавычку. Если это число, тогда кавычки не нужны, если в тексте используются двойные кавычки с обеих сторон. – ChrisProsser

ответ

0

Вы используете этот цикл 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?

2

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

A) Один яркий фрагмент кода - If cells.Value Like "*@*" Then. Измените его на If cell.Value Like "*@*" Then

B) Изменение xlCellTypeConstant в xlCellTypeConstants

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

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

E) Ради Бога (ну проигнорируйте это ... ради вас), используйте Option Explicit! Я бы настоятельно советовал использовать Option Explicit. Я бы также рекомендовал взглянуть на эту ссылку (см. Пункт 2 в ссылке).

Тема: К «Err» является Human

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

Смежные вопросы