Уважаемые, не подскажите мне в рамках данного макроса хотелось бы решить следующие задачи: Просматривать несколько диапазонов и сравнивать не с текущей датой, а с датой за три дня до текущей и для каждого диапазона сравнения дат свой адресат для отправки и при отправке прикреплять файл, с которым я работаю. Насколько я вижу решение данного вопроса заключается в следующем:
[vba]
Код
Sub Mail_Workbook_1() Dim OutApp As Object Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0)
On Error Resume Next ' Change the mail address and subject in the macro before you run it.
' Nado sravnit datu v "B2:B11" s segodniashnei datoj i esli sovpodaet avtomaticheski vyslat email
If Range("B2:B11") = Date-3 Then With OutMail .To = "sklad@awt.ru" .CC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.......xlsm" .Send
End With
Else If Range("C2:C11") = Date-3 Then 'И так цикл повторять для каждого диапазона? With OutMail .To = "a.buzdugan@awt.ru" .CC = "" .BCC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.....xlsm" .Send
End With End If End If On Error GoTo 0
Set OutMail = Nothing Set OutApp = Nothing End Sub
[/vba]
Уважаемые, не подскажите мне в рамках данного макроса хотелось бы решить следующие задачи: Просматривать несколько диапазонов и сравнивать не с текущей датой, а с датой за три дня до текущей и для каждого диапазона сравнения дат свой адресат для отправки и при отправке прикреплять файл, с которым я работаю. Насколько я вижу решение данного вопроса заключается в следующем:
[vba]
Код
Sub Mail_Workbook_1() Dim OutApp As Object Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0)
On Error Resume Next ' Change the mail address and subject in the macro before you run it.
' Nado sravnit datu v "B2:B11" s segodniashnei datoj i esli sovpodaet avtomaticheski vyslat email
If Range("B2:B11") = Date-3 Then With OutMail .To = "sklad@awt.ru" .CC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.......xlsm" .Send
End With
Else If Range("C2:C11") = Date-3 Then 'И так цикл повторять для каждого диапазона? With OutMail .To = "a.buzdugan@awt.ru" .CC = "" .BCC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.....xlsm" .Send
End With End If End If On Error GoTo 0
Set OutMail = Nothing Set OutApp = Nothing End Sub
1). Если в В2:В11 мы не нашли нужную дату, переходим на С2:С11? Если и там не нашли, то идём на D2:D11? И так далее до бесконечности? 2). Когда нужная дата найдена, цикл поиска прекращаем и отправляем письмо? Или надо перебрать все столбцы? 3). Проверять надо, чтобы весь столбец содержал одинаковую дату с Икс2 по Икс11? Или достаточно, чтобы нужная дата проверялась только в Икс2 ячейке?
Для отправки по каждому отдельному столбцу своего письма, нужно чтобы в столбце содержалась нужная информация, которая меняется от одного к другому. Это отдельная ячейка для имени адресата и, если надо отправлять разные файлы, то ещё одна ячейка с ссылкой на правильный файл.
[offtop]Прикреплять файл, с которым работаете - признак хорошего тона.[/offtop] [moder]Прикреплять файл - обязательное условие, прописанное в Правилах форума.[/moder] Когда Rioran намекает - модератор бьёт в лоб =)
Bulava81, здравствуйте.
Опишите логику работы будущего макроса подробнее.
1). Если в В2:В11 мы не нашли нужную дату, переходим на С2:С11? Если и там не нашли, то идём на D2:D11? И так далее до бесконечности? 2). Когда нужная дата найдена, цикл поиска прекращаем и отправляем письмо? Или надо перебрать все столбцы? 3). Проверять надо, чтобы весь столбец содержал одинаковую дату с Икс2 по Икс11? Или достаточно, чтобы нужная дата проверялась только в Икс2 ячейке?
Для отправки по каждому отдельному столбцу своего письма, нужно чтобы в столбце содержалась нужная информация, которая меняется от одного к другому. Это отдельная ячейка для имени адресата и, если надо отправлять разные файлы, то ещё одна ячейка с ссылкой на правильный файл.
[offtop]Прикреплять файл, с которым работаете - признак хорошего тона.[/offtop] [moder]Прикреплять файл - обязательное условие, прописанное в Правилах форума.[/moder] Когда Rioran намекает - модератор бьёт в лоб =)Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Пятница, 20.06.2014, 13:48
Добрый день, Rioran! Спасибо, что откликнулись на мою просьбу:) Логика работы данного инструмента в следующем: Есть конечное множество столбцов с датами бронирования оборудования (17) эти диапазоны я и буду указывать (например: Range ("A1:A100, C1:B100, D1:D100")), макросу необходимо просканировать эти диапазоны (то есть все ячейки, указанные в этих диапазонах) и если в заданном диапазоне выполняется условие, то есть есть хоть одна дата которая находится за три дня до текущей, то отправляется данный файл указанному адресату (адресаты разные) с определенной текстовкой (текстовка впринципе будет одна и та же, только будет отличаться обращение). Далее макрос переходит сканировать на следующий диапазон, если в новом диапазоне, при сканировании по датам, выполнится вышеуказанное условие, то производится отправка данного файла другому адресату, если в данном диапазоне по датам условие не выполняется, то отправки файла адресату, которого я укажу для данного диапазона не происходит и макрос переходит на следующий диапазон. Касательно прикрепления файла я уже разобрался, еще раз повторюсь файл будет для всех одинаков. У меня не получается составить последовательность циклов для просмотра/сканирования диапазонов и отправки нужному адресату. Соответственно текстовку и обращение и пропишу в .Body = "Text of the letter", поскольку адресаты у меня фиксированные и меняются очень редко, поэтому здесь я смогу на ручном приводе производить корректировку. Если Вы мне поможете с формированием циклом, я Вам буду премного благодарен. В указанном мною макросе, второй цикл через оператор Else не работает, первый проходит и отправляет все как нужно.
Добрый день, Rioran! Спасибо, что откликнулись на мою просьбу:) Логика работы данного инструмента в следующем: Есть конечное множество столбцов с датами бронирования оборудования (17) эти диапазоны я и буду указывать (например: Range ("A1:A100, C1:B100, D1:D100")), макросу необходимо просканировать эти диапазоны (то есть все ячейки, указанные в этих диапазонах) и если в заданном диапазоне выполняется условие, то есть есть хоть одна дата которая находится за три дня до текущей, то отправляется данный файл указанному адресату (адресаты разные) с определенной текстовкой (текстовка впринципе будет одна и та же, только будет отличаться обращение). Далее макрос переходит сканировать на следующий диапазон, если в новом диапазоне, при сканировании по датам, выполнится вышеуказанное условие, то производится отправка данного файла другому адресату, если в данном диапазоне по датам условие не выполняется, то отправки файла адресату, которого я укажу для данного диапазона не происходит и макрос переходит на следующий диапазон. Касательно прикрепления файла я уже разобрался, еще раз повторюсь файл будет для всех одинаков. У меня не получается составить последовательность циклов для просмотра/сканирования диапазонов и отправки нужному адресату. Соответственно текстовку и обращение и пропишу в .Body = "Text of the letter", поскольку адресаты у меня фиксированные и меняются очень редко, поэтому здесь я смогу на ручном приводе производить корректировку. Если Вы мне поможете с формированием циклом, я Вам буду премного благодарен. В указанном мною макросе, второй цикл через оператор Else не работает, первый проходит и отправляет все как нужно.Bulava81
Во вложенном файле Колонки по названием "Дн до ОБ" рассчитывают кол-во дней до окончании бронирования (например: "K6:K1335, P6:P1335, U6:U1335 и т. д.), если число равно 3 (то есть до окончания брони остается три дня), то отправляется файл адресату.
Цитата
Текстовка для одного и того же файла всегда будет одинакова?
Да, для всех одинакова.
Во вложенном файле Колонки по названием "Дн до ОБ" рассчитывают кол-во дней до окончании бронирования (например: "K6:K1335, P6:P1335, U6:U1335 и т. д.), если число равно 3 (то есть до окончания брони остается три дня), то отправляется файл адресату.
Цитата
Текстовка для одного и того же файла всегда будет одинакова?
anvg, отвечая на Ваш вопрос, хотелось бы сказать следующее: Во первых, Вы приводите ссылку, которая не понятно куда ссылается; Во вторых, это другой сайт; В третьих даже, если я консультируюсь с разными умными людьми, то это не является признаком плохого тона и данный шаг является сугубо моим личным делом о чем я сообщать вообще не кому не обязан. Поэтому, принимая во внимание все вышесказанное, я ничем не нарушил правила форума.
anvg, отвечая на Ваш вопрос, хотелось бы сказать следующее: Во первых, Вы приводите ссылку, которая не понятно куда ссылается; Во вторых, это другой сайт; В третьих даже, если я консультируюсь с разными умными людьми, то это не является признаком плохого тона и данный шаг является сугубо моим личным делом о чем я сообщать вообще не кому не обязан. Поэтому, принимая во внимание все вышесказанное, я ничем не нарушил правила форума.Bulava81
у меня прописана формула, которая считает количество дней до окончании брони, то есть =ЕСЛИ(J6="";"";J6-СЕГОДНЯ()), где J6 -это дата окончания брони (столбцы "Дата ОБ"). Как видно из формулы, столбцы "Дн до ОБ", автоматически меняют количество дней до окончании брони в зависимости от "СЕГОДНЯ()" , и соответственно, как только остается три дня до наступления окончания брони, то есть в столбце появляется цифра 3, то макрос автоматически отправляет для для указанного в данном столбце адресата вложенный файл, насколько я понимаю, Rioran, я могу вручную прописать этого адресата в макросе, поскольку, как я говорил выше адресатов небольшое множество и меняются они крайне редко. Вопрос, только в цикле... Rioran, надеюсь на вашу помощь!
Добрый день, Rioran!
Цитата
в столбцах "Дн до ОБ"
у меня прописана формула, которая считает количество дней до окончании брони, то есть =ЕСЛИ(J6="";"";J6-СЕГОДНЯ()), где J6 -это дата окончания брони (столбцы "Дата ОБ"). Как видно из формулы, столбцы "Дн до ОБ", автоматически меняют количество дней до окончании брони в зависимости от "СЕГОДНЯ()" , и соответственно, как только остается три дня до наступления окончания брони, то есть в столбце появляется цифра 3, то макрос автоматически отправляет для для указанного в данном столбце адресата вложенный файл, насколько я понимаю, Rioran, я могу вручную прописать этого адресата в макросе, поскольку, как я говорил выше адресатов небольшое множество и меняются они крайне редко. Вопрос, только в цикле... Rioran, надеюсь на вашу помощь!Bulava81
Не имею возможности пройти по ссылке на параллельное обсуждение, поэтому пишу не зная, как у Вас дела обстоят там.
Доработал макрос из начального поста. Добавил от себя в файл лист "Списки" где должны быть указаны адреса получателей (P.S. - прописывать их вручную - противоречит моей религии лентяя ). Учёл особенности структуры листа "Базы данных".
Как работает:
1). Макрос перебирает 3-ю строку листа "Базы данных" и ищет ячейки с "Дн до ОБ". 2). В столбце с найденной ячейкой ищет цифру 3. Если найдена... 3). Ищет имя по листу "Списки" и берёт оттуда адрес почты. Отправляет письмо.
Для теста работы макроса (Обязательно!) в любом из столбцов с заголовком "Дн до ОБ" пропишите в любой строке от 4 до 14 цифру 3. На листе "списки" у соответствующего человека в ячейке пропишите соответствующий адрес почты.
[vba]
Код
Sub Mail_Workbook_1()
Dim X As Long 'Для перебора столбцов базы данных Dim Y As Long 'Для перебора строк базы данных Dim Z As Long 'Для перебора строк по спискам адресов получателей Dim shtX As Worksheet 'Для листа "Базы Данных" Dim shtY As Worksheet 'Для листа "Списки" с адресами получателей Dim Mail_Name As String 'Имя адресата для отправки письма
Dim OutApp As Object Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) Set shtX = ThisWorkbook.Sheets("База Данных") Set shtY = ThisWorkbook.Sheets("Списки")
On Error Resume Next
For X = 1 To shtX.Cells(3, shtX.Columns.Count).End(xlToLeft).Column If shtX.Cells(3, X).Value = "Дн до ОБ" Then For Y = 4 To 14 If shtX.Cells(Y, X).Value = 3 Then For Z = 2 To shtY.Cells(shtY.Rows.Count, 1).End(xlUp).Row If shtX.Cells(1, X - 3).Value = shtY.Cells(Z, 1).Value Then Mail_Name = shtY.Cells(Z, 2).Value With OutMail .To = Mail_Name .CC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.......xlsm" .Send End With End If Next Z End If Next Y End If Next X
On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing
End Sub
[/vba] При желании в таблице "Списки" можно также указать разные файлы, заголовки писем и содержание писем. С лёгкой модификацией кода письмо будет отправляться с нужными параметрами.
Bulava81, здравствуйте.
Не имею возможности пройти по ссылке на параллельное обсуждение, поэтому пишу не зная, как у Вас дела обстоят там.
Доработал макрос из начального поста. Добавил от себя в файл лист "Списки" где должны быть указаны адреса получателей (P.S. - прописывать их вручную - противоречит моей религии лентяя ). Учёл особенности структуры листа "Базы данных".
Как работает:
1). Макрос перебирает 3-ю строку листа "Базы данных" и ищет ячейки с "Дн до ОБ". 2). В столбце с найденной ячейкой ищет цифру 3. Если найдена... 3). Ищет имя по листу "Списки" и берёт оттуда адрес почты. Отправляет письмо.
Для теста работы макроса (Обязательно!) в любом из столбцов с заголовком "Дн до ОБ" пропишите в любой строке от 4 до 14 цифру 3. На листе "списки" у соответствующего человека в ячейке пропишите соответствующий адрес почты.
[vba]
Код
Sub Mail_Workbook_1()
Dim X As Long 'Для перебора столбцов базы данных Dim Y As Long 'Для перебора строк базы данных Dim Z As Long 'Для перебора строк по спискам адресов получателей Dim shtX As Worksheet 'Для листа "Базы Данных" Dim shtY As Worksheet 'Для листа "Списки" с адресами получателей Dim Mail_Name As String 'Имя адресата для отправки письма
Dim OutApp As Object Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) Set shtX = ThisWorkbook.Sheets("База Данных") Set shtY = ThisWorkbook.Sheets("Списки")
On Error Resume Next
For X = 1 To shtX.Cells(3, shtX.Columns.Count).End(xlToLeft).Column If shtX.Cells(3, X).Value = "Дн до ОБ" Then For Y = 4 To 14 If shtX.Cells(Y, X).Value = 3 Then For Z = 2 To shtY.Cells(shtY.Rows.Count, 1).End(xlUp).Row If shtX.Cells(1, X - 3).Value = shtY.Cells(Z, 1).Value Then Mail_Name = shtY.Cells(Z, 2).Value With OutMail .To = Mail_Name .CC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.......xlsm" .Send End With End If Next Z End If Next Y End If Next X
On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing
End Sub
[/vba] При желании в таблице "Списки" можно также указать разные файлы, заголовки писем и содержание писем. С лёгкой модификацией кода письмо будет отправляться с нужными параметрами.Rioran
Я попробовал работать с макросом и Вы знаете у меня возникло две проблемы: 1. Если я вношу в таблицу в несколько ячеек число три (для проверки) в разные диапазоны, то макрос отправляет только одному адресату; 2. Согласно тому же первому условию, то есть если в нескольких ячейках диапазона "Дн до ОБ" для разных адресатов стоит три дня до окончания брони, то макрос в приложении (в прикладываемом файле) его дублирует то количество раз которое он нашел число три, иными словами одному адресату прикладывается три, четыре и т.д. файлов указанных в макросе: [vba]
Я попробовал работать с макросом и Вы знаете у меня возникло две проблемы: 1. Если я вношу в таблицу в несколько ячеек число три (для проверки) в разные диапазоны, то макрос отправляет только одному адресату; 2. Согласно тому же первому условию, то есть если в нескольких ячейках диапазона "Дн до ОБ" для разных адресатов стоит три дня до окончания брони, то макрос в приложении (в прикладываемом файле) его дублирует то количество раз которое он нашел число три, иными словами одному адресату прикладывается три, четыре и т.д. файлов указанных в макросе: [vba]
Проверьте. Теперь должно креативить писем сколько нужно и одно письмо - только одному адресату.
[vba]
Код
Sub Mail_Workbook_1()
Dim W As Boolean 'Для проверки на дубли Dim X As Long 'Для перебора столбцов базы данных Dim Y As Long 'Для перебора строк базы данных Dim Z As Long 'Для перебора строк по спискам адресов получателей Dim shtX As Worksheet 'Для листа "Базы Данных" Dim shtY As Worksheet 'Для листа "Списки" с адресами получателей Dim Mail_Name As String 'Имя адресата для отправки письма
Dim OutApp As Object Dim OutMail As Object
Set shtX = ThisWorkbook.Sheets("База Данных") Set shtY = ThisWorkbook.Sheets("Списки")
For X = 1 To shtX.Cells(3, shtX.Columns.Count).End(xlToLeft).Column W = False If shtX.Cells(3, X).Value = "Дн до ОБ" Then For Y = 4 To 14 If shtX.Cells(Y, X).Value = 3 Then For Z = 2 To shtY.Cells(shtY.Rows.Count, 1).End(xlUp).Row If shtX.Cells(1, X - 3).Value = shtY.Cells(Z, 1).Value Then Mail_Name = shtY.Cells(Z, 2).Value Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = Mail_Name .CC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.......xlsm" .Send End With On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing W = True End If If W = True Then Exit For Next Z End If If W = True Then Exit For Next Y End If Next X
End Sub
[/vba]
Bulava81, поправил цикл.
Проверьте. Теперь должно креативить писем сколько нужно и одно письмо - только одному адресату.
[vba]
Код
Sub Mail_Workbook_1()
Dim W As Boolean 'Для проверки на дубли Dim X As Long 'Для перебора столбцов базы данных Dim Y As Long 'Для перебора строк базы данных Dim Z As Long 'Для перебора строк по спискам адресов получателей Dim shtX As Worksheet 'Для листа "Базы Данных" Dim shtY As Worksheet 'Для листа "Списки" с адресами получателей Dim Mail_Name As String 'Имя адресата для отправки письма
Dim OutApp As Object Dim OutMail As Object
Set shtX = ThisWorkbook.Sheets("База Данных") Set shtY = ThisWorkbook.Sheets("Списки")
For X = 1 To shtX.Cells(3, shtX.Columns.Count).End(xlToLeft).Column W = False If shtX.Cells(3, X).Value = "Дн до ОБ" Then For Y = 4 To 14 If shtX.Cells(Y, X).Value = 3 Then For Z = 2 To shtY.Cells(shtY.Rows.Count, 1).End(xlUp).Row If shtX.Cells(1, X - 3).Value = shtY.Cells(Z, 1).Value Then Mail_Name = shtY.Cells(Z, 2).Value Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = Mail_Name .CC = "" .Subject = "Finished bron" .Body = "Text of the letter" .Attachments.Add "C:\Users\buzdugan\Desktop\.......xlsm" .Send End With On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing W = True End If If W = True Then Exit For Next Z End If If W = True Then Exit For Next Y End If Next X
Голубчик Мой, Вы просто ГЕНИЙ!!!!:) Огромное Вам спасибо, вот теперь все заработало, как нужно! Очень Вам Благодарен Rioran!!! (к сожалению не знаю Вашего имени).
Голубчик Мой, Вы просто ГЕНИЙ!!!!:) Огромное Вам спасибо, вот теперь все заработало, как нужно! Очень Вам Благодарен Rioran!!! (к сожалению не знаю Вашего имени).Bulava81
Я для более унифицированного подхода, хотел еще один интересный вопрос решить -это вставка подписи в отправляемое письмо. И в принципе даже нашел часть макроса по извлечению подписи из txt файла, но к сожалению мои знания не позволяют интегрировать эту часть макроса с Вашим творением, к тому же в данном макросе у меня не до конца получалось реализовать эту функцию, вместо извлеченной подписи у меня в теле письма прикладывалась информация из первого столбца отправляемого файла. Не поможете разобраться в этом вопросе, Rioran?
[vba]
Код
Sub Mail_Workbook_1() Dim OutApp As Object Dim OutMail As Object Dim cell As Range
Application.ScreenUpdating = False Workbooks.OpenText "C:\Users\user11111\AppData\Roaming\Microsoft\Signatures\Aleksey.txt" For li = ActiveSheet.UsedRange.Row To ActiveSheet.UsedRange.Rows.Count sSignature = sSignature & vbCrLf & Cells(li, ActiveSheet.UsedRange.Column) Next li ActiveWorkbook.Close False
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon On Error GoTo cleanup
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next ' Change the mail address and subject in the macro before you run it. .......................... .......................... ........................... On Error GoTo 0
Set OutMail = Nothing cleanup: Set OutApp = Nothing
Application.ScreenUpdating = True End Sub
[/vba]
Я для более унифицированного подхода, хотел еще один интересный вопрос решить -это вставка подписи в отправляемое письмо. И в принципе даже нашел часть макроса по извлечению подписи из txt файла, но к сожалению мои знания не позволяют интегрировать эту часть макроса с Вашим творением, к тому же в данном макросе у меня не до конца получалось реализовать эту функцию, вместо извлеченной подписи у меня в теле письма прикладывалась информация из первого столбца отправляемого файла. Не поможете разобраться в этом вопросе, Rioran?
[vba]
Код
Sub Mail_Workbook_1() Dim OutApp As Object Dim OutMail As Object Dim cell As Range
Application.ScreenUpdating = False Workbooks.OpenText "C:\Users\user11111\AppData\Roaming\Microsoft\Signatures\Aleksey.txt" For li = ActiveSheet.UsedRange.Row To ActiveSheet.UsedRange.Rows.Count sSignature = sSignature & vbCrLf & Cells(li, ActiveSheet.UsedRange.Column) Next li ActiveWorkbook.Close False
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon On Error GoTo cleanup
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next ' Change the mail address and subject in the macro before you run it. .......................... .......................... ........................... On Error GoTo 0
Set OutMail = Nothing cleanup: Set OutApp = Nothing
Bulava81, это отдельный хороший вопрос. Давайте создадим для этого отдельную тему, куда будет приложен наш файл.
Также просьба отредактировать ваше сообщение № 15 - удалите всю часть связанную с VBA. Вставьте VBA код снова, выделите мышью от первого символа кода до последнего и один раз нажмите на знак "#" на панели инструментов форума, который проставит теги VBA.
Bulava81, это отдельный хороший вопрос. Давайте создадим для этого отдельную тему, куда будет приложен наш файл.
Также просьба отредактировать ваше сообщение № 15 - удалите всю часть связанную с VBA. Вставьте VBA код снова, выделите мышью от первого символа кода до последнего и один раз нажмите на знак "#" на панели инструментов форума, который проставит теги VBA.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Понедельник, 23.06.2014, 15:25
Друзья, не подскажите, как модифицировать вышеуказанный работающий макрос таким образом, чтобы рассылка происходила автоматически при неактивном файле excel и/или даже при выключенном компьютере (и вообще возможно ли это)?
Друзья, не подскажите, как модифицировать вышеуказанный работающий макрос таким образом, чтобы рассылка происходила автоматически при неактивном файле excel и/или даже при выключенном компьютере (и вообще возможно ли это)?Bulava81
Сообщение отредактировал Bulava81 - Понедельник, 07.07.2014, 07:21
С помощью метода .ApplicationOnTime можно вечером включить макрос, а в заранее указанное время он сработает и отправит рассылку. Если компьютер пожизненно включен (то есть, работу макроса ничто не прервёт), можно задать программе например: "А отправляй-ка ты мне рассылку каждый день в 9:00".
Без компьютера обойтись вряд ли получится - код должен где-то отрабатываться. Вы можете арендовать сервер, на котором будут происходить все вычисления и операции, если хотите от этого избавить Вашу машину.
Bulava81, есть такой вариант.
С помощью метода .ApplicationOnTime можно вечером включить макрос, а в заранее указанное время он сработает и отправит рассылку. Если компьютер пожизненно включен (то есть, работу макроса ничто не прервёт), можно задать программе например: "А отправляй-ка ты мне рассылку каждый день в 9:00".
Без компьютера обойтись вряд ли получится - код должен где-то отрабатываться. Вы можете арендовать сервер, на котором будут происходить все вычисления и операции, если хотите от этого избавить Вашу машину.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Роман, добрый день! Рад Вас видеть:) То есть получается, чтобы в назначенное время макрос производил рассылку необходимо, чтобы файл был всегда открыт или это условие необязательно? (соответственно с ПК понятно, чтобы он был всегда включен) А Вы не могли бы подсказать в каком виде будет выглядеть метод .ApplicationOnTime, если к примеру необходимо, чтобы макрос производил рассылку в 8:00 каждый день, в соответствии с теми условиями, которые мы совместно с Вами уже благополучно прописали в макросе? Есть еще один вопрос макрос автоматически не отправляет письма, а выводит их на дисплей, то есть как с функцией .Display, хотя у меня прописано .Send? поэтому мне приходится каждое письмо подтверждать при отправке, а хотелось бы автоматизировать данную процедуру по назначенному времени:) Буду Вам премного благодарен за помощь!!! Еще раз привожу ниже текст макроса: [vba]
Код
Sub Send_Mail ()
Dim W As Boolean 'Äëÿ ïðîâåðêè íà äóáëè Dim X As Long 'Äëÿ ïåðåáîðà ñòîëáöîâ áàçû äàííûõ Dim Y As Long 'Äëÿ ïåðåáîðà ñòðîê áàçû äàííûõ Dim Z As Long 'Äëÿ ïåðåáîðà ñòðîê ïî ñïèñêàì àäðåñîâ ïîëó÷àòåëåé Dim shtX As Worksheet 'Äëÿ ëèñòà "Áàçû Äàííûõ" Dim shtY As Worksheet 'Äëÿ ëèñòà "Ñïèñêè" ñ àäðåñàìè ïîëó÷àòåëåé Dim Mail_Name As String 'Èìÿ àäðåñàòà äëÿ îòïðàâêè ïèñüìà
Dim OutApp As Object Dim OutMail As Object
Set shtX = ThisWorkbook.Sheets("Áàçà Äàííûõ") Set shtY = ThisWorkbook.Sheets("Ñïèñêè")
For X = 1 To shtX.Cells(3, shtX.Columns.Count).End(xlToLeft).Column W = False If shtX.Cells(3, X).Value = "Äí äî ÎÁ" Then For Y = 4 To 2000 If shtX.Cells(Y, X).Value = 1 Or shtX.Cells(Y, X).Value = 2 Or shtX.Cells(Y, X).Value = 3 Or shtX.Cells(Y, X).Value = 4 Then For Z = 2 To shtY.Cells(shtY.Rows.Count, 1).End(xlUp).Row If shtX.Cells(1, X - 3).Value = shtY.Cells(Z, 1).Value Then Mail_Name = shtY.Cells(Z, 2).Value Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .Display .To = Mail_Name .CC = "a.buzdugan@awt.ru" .Subject = "Îêîí÷àíèå Áðîíè íà îáîðóäîâàíèå" .HTMLBody = "Óâàæàåìûå Êîëëåãè! Ïðîøó Âàñ ïðîâåðèòü ñîñòîÿíèå áðîíè â ñîîòâåòñòâèè ñ âëîæåííûì ôàéëîì. Ñíÿòü/ïðîäëèòü.  äåíü îêîí÷àíèÿ áðîíè Âàøà áðîíü àâòîìàòè÷åñêè óäàëÿåòñÿ ñèñòåìîé." & .HTMLBody .Attachments.Add "\\Files\documents\-ÍÎÂÀß ÑÒÐÓÊÒÓÐÀ-\Äåïàðòàìåíò ïîñòàâîê è òîðãîâûõ îïåðàöèé\Îáîðóäîâàíèå\Áðîíèðîâàíèå è íàëè÷èå îáîðóäîâàíèÿ\Áðîíèðîâàíèå è íàëè÷èå îáîðóäîâàíèÿ\Íàëè÷èå îáîðóäîâàíèÿ íà ñêëàäå.xlsm" .Send End With On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing W = True End If If W = True Then Exit For Next Z End If If W = True Then Exit For Next Y End If Next X End Sub
[/vba]
Роман, добрый день! Рад Вас видеть:) То есть получается, чтобы в назначенное время макрос производил рассылку необходимо, чтобы файл был всегда открыт или это условие необязательно? (соответственно с ПК понятно, чтобы он был всегда включен) А Вы не могли бы подсказать в каком виде будет выглядеть метод .ApplicationOnTime, если к примеру необходимо, чтобы макрос производил рассылку в 8:00 каждый день, в соответствии с теми условиями, которые мы совместно с Вами уже благополучно прописали в макросе? Есть еще один вопрос макрос автоматически не отправляет письма, а выводит их на дисплей, то есть как с функцией .Display, хотя у меня прописано .Send? поэтому мне приходится каждое письмо подтверждать при отправке, а хотелось бы автоматизировать данную процедуру по назначенному времени:) Буду Вам премного благодарен за помощь!!! Еще раз привожу ниже текст макроса: [vba]
Код
Sub Send_Mail ()
Dim W As Boolean 'Äëÿ ïðîâåðêè íà äóáëè Dim X As Long 'Äëÿ ïåðåáîðà ñòîëáöîâ áàçû äàííûõ Dim Y As Long 'Äëÿ ïåðåáîðà ñòðîê áàçû äàííûõ Dim Z As Long 'Äëÿ ïåðåáîðà ñòðîê ïî ñïèñêàì àäðåñîâ ïîëó÷àòåëåé Dim shtX As Worksheet 'Äëÿ ëèñòà "Áàçû Äàííûõ" Dim shtY As Worksheet 'Äëÿ ëèñòà "Ñïèñêè" ñ àäðåñàìè ïîëó÷àòåëåé Dim Mail_Name As String 'Èìÿ àäðåñàòà äëÿ îòïðàâêè ïèñüìà
Dim OutApp As Object Dim OutMail As Object
Set shtX = ThisWorkbook.Sheets("Áàçà Äàííûõ") Set shtY = ThisWorkbook.Sheets("Ñïèñêè")
For X = 1 To shtX.Cells(3, shtX.Columns.Count).End(xlToLeft).Column W = False If shtX.Cells(3, X).Value = "Äí äî ÎÁ" Then For Y = 4 To 2000 If shtX.Cells(Y, X).Value = 1 Or shtX.Cells(Y, X).Value = 2 Or shtX.Cells(Y, X).Value = 3 Or shtX.Cells(Y, X).Value = 4 Then For Z = 2 To shtY.Cells(shtY.Rows.Count, 1).End(xlUp).Row If shtX.Cells(1, X - 3).Value = shtY.Cells(Z, 1).Value Then Mail_Name = shtY.Cells(Z, 2).Value Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .Display .To = Mail_Name .CC = "a.buzdugan@awt.ru" .Subject = "Îêîí÷àíèå Áðîíè íà îáîðóäîâàíèå" .HTMLBody = "Óâàæàåìûå Êîëëåãè! Ïðîøó Âàñ ïðîâåðèòü ñîñòîÿíèå áðîíè â ñîîòâåòñòâèè ñ âëîæåííûì ôàéëîì. Ñíÿòü/ïðîäëèòü.  äåíü îêîí÷àíèÿ áðîíè Âàøà áðîíü àâòîìàòè÷åñêè óäàëÿåòñÿ ñèñòåìîé." & .HTMLBody .Attachments.Add "\\Files\documents\-ÍÎÂÀß ÑÒÐÓÊÒÓÐÀ-\Äåïàðòàìåíò ïîñòàâîê è òîðãîâûõ îïåðàöèé\Îáîðóäîâàíèå\Áðîíèðîâàíèå è íàëè÷èå îáîðóäîâàíèÿ\Áðîíèðîâàíèå è íàëè÷èå îáîðóäîâàíèÿ\Íàëè÷èå îáîðóäîâàíèÿ íà ñêëàäå.xlsm" .Send End With On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing W = True End If If W = True Then Exit For Next Z End If If W = True Then Exit For Next Y End If Next X End Sub