Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2009, 20:03   #1
Madagaskar
 
Регистрация: 02.03.2009
Сообщений: 6
По умолчанию Отправка на почту данных из ячеек?

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

Задача состоит в том, что необходимо на адрес, указанный в ячейке А2 (3, 4...), отправить данные из ячеек С2 (3, 4...) - G2 (3, 4...) по щелчку в ячейке A2 (3, 4...). Т.е. чтобы открылся the BAT, в строке адреса стоял адрес из A2 (3, 4...), а в теле письма были вставленны данные из С2 (3, 4...) - G2 (3, 4...) и оставалось только нажать в the BAT "отправить".
При этом, т.к. адресатов с одинаковыми данными может быть сразу несколько (как в моем примере у ООО "Апрель" и ООО "Эверест"), чтобы можно было сэкономить время: отсортировать и пощелчку отправить нескольким адресатам их одинаковые данные.

Насколько эта задача является сложной/выполнимой? Нужно ли здесь создавать макрос или нужны какие-то другие действия.
Если есть возможность, пожалуйста, помогите!
Изображения
Тип файла: jpg пример.jpg (42.1 Кб, 206 просмотров)
Madagaskar вне форума Ответить с цитированием
Старый 02.03.2009, 20:22   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Здесь есть пример макроса для отправки почты при помощи TheBAT:
http://excelvba.ru/code/TheBAT

Смотрите также другие способы отправки почты из Excel:
http://excelvba.ru/category/mail

Только текст сообщения в том макросе надо сначала записывать в текстовый файл, а потом этот путь этого файла прописывать в командной строке (короче, надо внести в макрос небольшие изменения)

Если подойдёт такой вариант - можно попробовать.

Если устраивает отправка через Outlook, здесь есть очень много примеров макросов для этих целей.



Цитата:
(добавлено позже - может, кому пригодится)
Посмотрите самый простой способ, как организовать отправку почты (рассылку писем)
(с использованием программы заполнения документов по шаблонам, с последующей отправке по почте)

В программе есть возможность формировать письма по шаблону (с подстановкой данных из таблицы Excel),
прикреплять сформированные документы и файлы из выбранной папки, и много других возможностей.


Последний раз редактировалось EducatedFool; 12.01.2013 в 10:44.
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 22:09   #3
Madagaskar
 
Регистрация: 02.03.2009
Сообщений: 6
По умолчанию

EducatedFool, спасибо!
На вид, вроде устраивает нижеописанный макрос, но, почему-то он не срабатывает. Не подскажите, что означает пункт 1) The code is not working if your data is a List(Excel 2003). И как "выключить АвтоФильтр" (3) Turn off AutoFilter before you use the code).

Цитата:
Example 2

Important :
1) The code is not working if your data is a List(Excel 2003) or Table(Excel 2007)
2) The first row in the range must have Headers
3) Turn off AutoFilter before you use the code
4) Be sure that the sheet with the data is the active worksheet

In your worksheet you must have :

In column A : Names of the students or ?
In column B : E-mail addresses
In column C:H : Information about the student or ?

Note: Every row must have a mail address in column B

We filter the range A1:H? for every unique mail address in column B.
For every unique mail address we create a new file with only the records with that
mail address and send it to that mail address.

How do I Change filter range and filter column? :
In this example I use the filter range A1:H? (we use all the rows on the sheet)
You can change the filter range and filter column in this two code lines in the macro.

Set FilterRange = Ash.Range("A1:H" & Ash.Rows.Count)
FieldNum = 2 'Filter column = B because the filter range start in A


Copy the macro below in a Standard module.

Последний раз редактировалось Madagaskar; 02.03.2009 в 22:12.
Madagaskar вне форума Ответить с цитированием
Старый 02.03.2009, 22:42   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
На вид, вроде устраивает нижеописанный макрос, но, почему-то он не срабатывает.
Вы переоцениваете мои способности.
Я пока не умею находить ошибки в макросе, руководствуясь только его описанием...

Прикрепите файл с этим макросом - тогда посмотрим.
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 23:02   #5
Madagaskar
 
Регистрация: 02.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вы переоцениваете мои способности.
Я пока не умею находить ошибки в макросе, руководствуясь только его описанием...

Прикрепите файл с этим макросом - тогда посмотрим.
Прошу прощения, все заработало после перезагрузки.
Тем не менее макрос все равно прикрепляю.
Дело в том, что этот макрос прикрепляет информацию из ячеек в виде вложения, но мне это никак не подходит. Необходимо чтобы информация была именно в тексте письма. Нельзя ли каким-нибудь образом его подкорректировать или это невыполнимая задача?
А так было бы как раз что нужно!

Заранее извиняюсь, если прошу не возможного. Поскольку мало чего понимаю в этом не могу оценить сложность...
Вложения
Тип файла: txt Mail a row or rows to each person in a range.txt (3.7 Кб, 207 просмотров)

Последний раз редактировалось Madagaskar; 02.03.2009 в 23:08.
Madagaskar вне форума Ответить с цитированием
Старый 02.03.2009, 23:46   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Нельзя ли каким-нибудь образом его подкорректировать
Да его и корректировать не надо...
Весь этот макрос рассчитан на отправку текущей книги Excel.

Вообще, его можно заменить одной строчкой:
ThisWorkbook.SendMail "123@mail.ru", "тема письма"

Есть же множество нормальных макросов для Outlook, я уже приводил ссылку
Там макросы гораздо короче, чем тот, что Вы привели.

К сожалению, проверить пока не могу - не умею пользоваться программой Outlook
То есть, при помощи TheBat и OutlookExpress я умею отправлять почту, а в Outlook-е после написания сообщения даже кнопку "Отправить" найти не могу.
Сейчас попробую что-нибудь сделать.
Если настрою Outlook, то приведу пример рабочего макроса.
EducatedFool вне форума Ответить с цитированием
Старый 02.03.2009, 23:55   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте что-то вроде этого:
Код:
Sub ОсновнойМакрос()
    Dim ro As Range: On Error Resume Next
    For i = 2 To 5 ' перебираем строки со 2-й по 5-ю
        Set ro = ActiveSheet.Rows(i)
        ' в 1-й ячейке - адрес, во второй - текст, в третьей - тема письма
        ОтправитьСообщение ro.Cells(2), ro.Cells(1), ro.Cells(3)
    Next i
End Sub

Sub ОтправитьСообщение(Текст As String, Адрес As String, Тема As String)
    Dim OutApp As Object, OutMail As Object, strbody As String
    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.Logon: Set OutMail = OutApp.CreateItem(0)
    On Error Resume Next
    With OutMail
        .To = Адрес: .CC = "": .BCC = "": .Subject = Тема
        .Body = Текст       '.Attachments.Add ("C:\test.txt")
        .Send   'or use .Display
    End With
    On Error GoTo 0: Set OutMail = Nothing: Set OutApp = Nothing
End Sub
Запустите ОсновнойМакрос.

Если бы Вы вместо скриншота прикрепили бы к сообщению свой файл, макрос бы удалось написать конкретно под Ваши нужды.

(добавлено)
Попробуйте заменить во втором макросе строку .Send 'or use .Display
на строку .Display

Последний раз редактировалось EducatedFool; 03.03.2009 в 00:16.
EducatedFool вне форума Ответить с цитированием
Старый 03.03.2009, 00:04   #8
Madagaskar
 
Регистрация: 02.03.2009
Сообщений: 6
По умолчанию

Спасибо большое, сейчас опробую!
Madagaskar вне форума Ответить с цитированием
Старый 03.03.2009, 02:43   #9
Madagaskar
 
Регистрация: 02.03.2009
Сообщений: 6
По умолчанию

Пришлось повозиться с Outlook, не привык им пользоваться, обычно использую BAT.Так что пока разобрался... и то не до конца)).
EducatedFool,
Запустил макрос как есть, получилось что "адрес" оказался в "теме письма", "название организации" в "адресе", а "название докумета" в "теме" (см. Рис.1). Методом эксперимента догадался поменять в коде цифры местами, получилочь как примерно должно быть (см. Рис.2). Как увеличить количество строк догадался (изменениями с строке For i = 2 To 5 ), но как сделать так, чтобы в теме письма захватывался диапазон С:G (или больше) догадаться не смог. Экспериментальным путем ничего не получилось. Так что надеюсь все еще на вашу помощь. Документ-пример прикрепляю в сообщении (см. Книга 1), а код у меня получился следующий:
Код:
Sub ОсновнойМакрос()
    Dim ro As Range: On Error Resume Next
    For i = 2 To 2 ' перебираем строки со 2-й по 2-ю
        Set ro = ActiveSheet.Rows(i)
        ' в 1-й ячейке - адрес, во второй - текст, во третьей - тема письма
        ОтправитьСообщение ro.Cells(3), ro.Cells(1), ro.Cells(2)
    Next i
End Sub

Sub ОтправитьСообщение(Текст As String, Адрес As String, Тема As String)
    Dim OutApp As Object, OutMail As Object, strbody As String
    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.Logon: Set OutMail = OutApp.CreateItem(0)
    On Error Resume Next
    With OutMail
        .To = Адрес: .CC = "": .BCC = "": .Subject = Тема
        .Body = Текст       '.Attachments.Add ("C:\test.txt")
        .Display
    End With
    On Error GoTo 0: Set OutMail = Nothing: Set OutApp = Nothing
End Sub
Изображения
Тип файла: jpg Рис.1.jpg (24.7 Кб, 167 просмотров)
Тип файла: jpg Рис.2.jpg (21.9 Кб, 168 просмотров)
Вложения
Тип файла: rar Книга1.rar (8.9 Кб, 66 просмотров)
Madagaskar вне форума Ответить с цитированием
Старый 03.03.2009, 12:10   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вроде всё получилось.
Разбираться с Outlook не стал, сделал отправку через TheBAT
Получилось намного быстрее и удобнее.

В прикреплённом примере формируются письма примерно такого содержания:
Цитата:
Предоставленный документ: Правила регистрации 1998г.

Формат документа: электрон. на 4 стр.
Срок выполнения: срочно
Стоимость: 500 руб.
Дата выполнения: 28.09.2008
Вот основной код: ( в него изменения вносить не надо)
Код:
Function ОтправитьПисьмоЧерезTheBat(ByVal Email As String, _
                                    ByVal Текст As String, Optional ByVal Тема As String = "", _
                                    Optional ByVal AttachFilename As String = "") As Boolean

    strTO = "TO=" & Chr(34) & Email & Chr(34)    ' адрес получателя (можно указать список адресов)
    strSUBJECT = "SUBJECT=" & Chr(34) & Тема & Chr(34)    ' тема сообщения

    For i = 1 To 10000: DoEvents: Next ' пауза для формирования уникальных имён файлов
    ИмяФайла = ФайлДляСохраненияТекстаПисьма & "." & Replace(Timer, ",", "")
    'Debug.Print ИмяФайла
    Open ИмяФайла For Output As #1
    Print #1, Текст: Close #1    ' пишем текст в файл

    ' текст сообщения (или путь к текстовому файлу с сообщением)
    strTEXT = "TEXT=" & Chr(34) & ИмяФайла & Chr(34)    ' Chr(34) - это кавычка

    ' путь к прикреплённому файлу (можно прикрепить несколько файлов)
    If AttachFilename <> "" Then strATTACH = "ATTACH=" & Chr(34) & AttachFilename & Chr(34)

    Cmd = Chr(34) & TheBatPath & Chr(34) & " /MAIL;" & strTO & ";" & strSUBJECT & ";" & _
          strTEXT & ";" & strATTACH & " /SENDALL; /MINIMIZE;"    ' формируем командную строку
    CreateObject("WScript.Shell").Exec Cmd    ' выполняем команду
End Function
Не забудьте перед использованием макроса проверить (и при необходимости заменить) пути к файлам в первых двух строчках макроса:
Код:
Const TheBatPath = "C:\Program Files\The Bat!\thebat.exe"    ' указываем полный путь к файлу программы
Const ФайлДляСохраненияТекстаПисьма = "C:\WINDOWS\TEMP\mail"    ' любое имя файла
При необходимости внесите изменения в макрос Формирование_и_Отправка_Писем
Для запуска макроса нажмите на зелёную кнопочку в перой ячейке листа.

Не забудьте отключить соединение с Интернетом на время проверки макроса - формирование и отправка писем происходит почти моментально

На некоторых версиях TheBAT письма отправляются моментально, на некоторых - просто складываются в папку Исходящие

Письма перед отправкой формируются в файлах с именами типа
Цитата:
C:\WINDOWS\TEMP\mail.5064533
C:\WINDOWS\TEMP\mail.5064538
C:\WINDOWS\TEMP\mail.5064542
C:\WINDOWS\TEMP\mail.5064545
Внимание: папка C:\WINDOWS\TEMP\ должна существовать
(или измените путь к папке в строке Const ФайлДляСохраненияТекстаПисьма = "C:\WINDOWS\TEMP\mail")

Проверьте и отпишитесь.

(добавлено)
В макросе Формирование_и_Отправка_Писем
перед строкой ОтправитьПисьмоЧерезTheBat Адрес, Текст, Тема
добавьте строку Тема = Replace(Тема, """", "`")


Это необходимо для замены двойных кавычек в теме письма, иначе названия организаций типа OOO "Апрель" при отправке будут заменены на OOO Апрель

PS: Если у Вас включен почтовый антивирус (опция во многих антивирусах), то могут появляться сообщения о блокировке исходящих писем из-за превышения лимита.
Антивирусы не любят, когда отправляются десятки писем в секунду...
Отключите эту опцию.
Вложения
Тип файла: rar Отправка почты с использованием TheBAT.rar (14.7 Кб, 90 просмотров)

Последний раз редактировалось EducatedFool; 03.03.2009 в 12:46.
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение данных из диапазона ячеек Lal Microsoft Office Excel 8 12.08.2009 11:24
Добавление данных в диапазон ячеек denneo Microsoft Office Excel 1 08.02.2009 09:05
Отправка данных на почту Claster Общие вопросы Delphi 2 20.11.2008 21:10
отправка данных на сайт xakkkkker Работа с сетью в Delphi 3 19.11.2008 16:37
Перенос данных из ячеек gavrylyuk Microsoft Office Excel 2 05.08.2008 14:24