Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
При отработке цикла в одной процедуре, не подтягиваются данные из другой процедуры после первого шага
 
важаемые форумчане!

Огромная просьба помогите разобраться – цикл отказывается работать L
Макрос срабатывает по первой строке, но не переходит к следующей строке (i = i + 1), подходящей под условия (If (Cells(i, 11) Like "НАПРАВЛЯТЬ"))
Код
For Each cell In Columns("K").Cells.SpecialCells(xlCellTypeFormulas, xlTextValues)
                        If (Cells(i, 11) Like "НАПРАВЛЯТЬ") Then '(cell.Value Like "НАПРАВЛЯТЬ")And cell.Offset(0, 16).Value <> "" Then
                                 Call MakeEMail(i)
                                 Worksheets("Меры").Activate
                                 Cells(i, 13).Value = Now
                       End If
                       cell.Offset(1, 0).Value = cell.Offset(1, 0).Value
               i = i + 1
               Next

           Application.ScreenUpdating = True
           Application.DisplayAlerts = True
           MsgBox ("Напоминания по мерам отправлены.")
    Else
      MsgBox "Неверный пароль!  " & vbCrLf & "Сообщения НЕ отправлены. ", vbCritical, "Ошибка."
    End If
Спасибо!
 
Вот наконец то
 
Цитата
Serg53 написал:
Worksheets("Меры").Activate
это зачем? Вы же при первом же выполнении условия активируете другой лист и теперь уже дальнейшее обращение через Cells идет к ячейкам именно этого листа.
Почему отказались от использования переменной цикла cell? Она же именно для этого, а не какие-то там еще i.
Сделайте так:
Код
Worksheets("Меры").Activate
                Dim cell As Range
                For Each cell In Columns("K").Cells.SpecialCells(xlCellTypeFormulas, xlTextValues)
                         If (cell.Value = "НАПРАВЛЯТЬ") Then '(cell.Value Like "НАПРАВЛЯТЬ")And cell.Offset(0, 16).Value <> "" Then
                                  Call MakeEMail(cell.Row)
                                  cell.Offset(, 2).Value = Now
                        End If
                        cell.Offset(1, 0).Value = cell.Offset(1, 0).Value
                Next
а функцию отправки чуть измените(этот блок - добавил With и точки где надо):
Код
With Worksheets("Меры")
                                        If .Cells(i, 16).Value <> "" Then
                                              EmailAddr = .Cells(i, 14).Value
                                              EmailAddr2 = .Cells(i, 15).Value
                                            Else: EmailAddr = .Cells(i, 14).Value
                                        End If
                                    End With
И никакие лишние Activate будут уже не нужны.
Изменено: Дмитрий(The_Prist) Щербаков - 5 Сен 2019 14:40:22
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Попробовал! При отработке процедуры ТБ ( все строки попадающие под условие)
макрос берет только первую строку с условием и не переходит дальше  
 
Цитата
Serg53 написал:
При отработке процедуры ТБ
ну логично. Вы же цикл делаете только по формулам. А откуда они у Вас возьмутся в столбце без Вас? Либо расскажите цель, либо включайте мозг, потому как даже эта строка:
cell.Offset(1, 0).Value = cell.Offset(1, 0).Value
сама по себе убивает формулы в следующей строке, т.е. при первом запуске макроса все будет еще ОК, а вот на второй запуск обрабатываться будет уже только одна строка, т.к. в остальных Вы сами первым запуском убили все формулы.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Столбец К который проверяет процедура, содержит логические формулы, которыми и определяется признак направлять/ не направлять. То есть они там уже проставлены. Исходя из этого я и писал цикл по формулам :sceptic:  
 
Цитата
Serg53 написал:
То есть они там уже проставлены
т.е. я уже как бы написал - проставлены они там ровно ДО ПЕРВОГО выполнения. Потом формула останется только в первой ячейке. Вот прямо сейчас просто протяните формулы из первой ячейки на весь столбец и проверьте. Убедитесь, что все отправляется для всех ячеек. Но на второй раз отправлена будет уже только одна первая. Если не удалите нафиг эту строку:
Код
cell.Offset(1, 0).Value = cell.Offset(1, 0).Value
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Посмотрел сам лист после запуска макроса, формулы выжили только во 2й строке .... вот это я на мудрил....
 
я написал уже что надо сделать, если формулы нужны всегда в этом столбце.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, спасибо огромное! Работает! :)
Пропишу только ещё условие, что бы не направлял без текста в ячейке с письмом и если нет адреса!
еще раз спасибо!!!!
 
При отработке цикла в одной процедуре, не подтягиваются данные из другой процедуры после первого шага»

Ещё раз всем привет!
переписал все по советам Дмитрия - работает!!!
появился новый затык, всю голову сломал уже!
Помогите пожалуйста!
Цикл отрабатывает, но сообщение берет только по первой попавшейся под условия строке, по гстальным Сообщения создаются, но текст из ячейки уже не тянется
Код
Sub ТБ()          ' отправка всех писем с невыполнеными заданиями
Dim i As IntegerPassword = 40919Worksheets("Справочник").Activate     
If Cells(2, 6).Value = Password Then                
Application.ScreenUpdating = False                
Application.DisplayAlerts = False        
        Worksheets("Меры").Activate                
Dim rng As Range: Set rng = Application.Range("Меры!K:K")                
Dim cell As Range                
For Each cell In rng.Cells                
a = cell.Value                         
If (cell.Value = "НАПРАВЛЯТЬ") Then '(cell.Value = "НАПРАВЛЯТЬ")And cell.Offset(0, 16).Value <> "" Then                                  
Call MakeEMail(cell.Row)                     
             cell.Offset(, 2).Value = Now                        
End If                                    
   Next cell
   Application.ScreenUpdating = True         
   Application.DisplayAlerts = True          
  MsgBox ("Напоминания по мерам отправлены.")   
  Else       MsgBox "Неверный пароль!  " & vbCrLf & "Сообщения НЕ отправлены. ", vbCritical, "Ошибка."     
End If
End Sub
Изменено: Serg53 - 9 Сен 2019 11:43:03
 
А функцию отправки-то изменили как я показал в сообщении #3?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, да исправил
 
Без файлов нечего сказать - опять косяк где-то в другом месте, которое мы не видим.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Файл  
 
откуда взялось это и зачем?
Код
Sheets("Справочник").Select
                                        If Range("H2") = "ДА" Then
                                        .Display                 ' если необходимо просмотреть сообщение, а не отправлять без просмотра
                                        Else
                                        .Send                    'автоматическа отправка сообщения
                                        End If
Настоятельно рекомендую статью изучить: Select и Activate - зачем нужны и нужны ли?
Потому как в этом случае надо просто записать так:
Код
If Sheets("Справочник").Range("H2") = "ДА" Then
       .Display                 ' если необходимо просмотреть сообщение, а не отправлять без просмотра
Else
       .Send                    'автоматическа отправка сообщения
End If
и все заработает. Из предыдущего исправления Вы урок не вынесли - у Вас там изначально такая же ошибка была: в теле процедуры создания письма активировали другой лист.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, Вы волшебник! Я уже умучайся переписывал процедуру отправки и в тело Сообщения да же не лез.
статью прочитал, многое усвоил!
Спасибо!
Изменено: Serg53 - 9 Сен 2019 21:31:32
Страницы: 1
Читают тему (гостей: 1)
Наверх