Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
1

Формирование писем из таблицы excel по условиям

27.04.2015, 10:26. Показов 4784. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
добрый день ! очень прошу помощи
есть таблица короткий пример во вложении. нужно чтобы формировал письма адресат берется из столбца ФИО
а вот в теле данные из столбцов "дело1 дата дело1 результат
" из соответствующих ФИО строк то есть у васи пупкина будет выглядеть так
......
.To = "ВасяПупкин@mail.ru"
.Body = 123 01.04.2015 +
123 03.04.2015 -
.Display

Писем должно быть столько сколько уникальных записей по колонке ФИО а в теле данные из указанных столбцов со всей таблицы напротив этого уникального имени . То есть по данному примеру должно быть 4 письма : Васе Маше льву и Игорь , а вот в теле писем все нужные данные касающиеся их.

Уважаемый KoGG ответил на мой вопрос
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Отправить_письма_уникальным_адресатам()
    Const olMailItem% = 0
    Const FirstRow% = 2
    Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object
    Set OutlookApp = CreateObject("Outlook.Application")
    With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With
    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.CompareMode = 1
    For i = FirstRow To LastRow
        ' n-я строка письма: дело1, дата дела1, результат дела 1 , перевод строки
        T = Cells(i, 2) & " " & Cells(i, 4) & " " & Cells(i, 5) & vbCrLf
        ' (n+1)-я строка письма: дело2, дата дела2, результат дела 2
        T = T & Cells(i, 3) & " " & Cells(i, 6) & " " & Cells(i, 7) & vbCrLf
        vX = Trim$(Cells(i, 1))
        Dic.Item(vX) = Dic.Item(vX) & T
    Next i
    For Each vX In Dic.Keys
        With OutlookApp.CreateItem(olMailItem)
            .To = vX
            .Subject = "Результаты дел" 'Тема
            .Body = Dic.Item(vX)
            .Send
        End With
        For j = 1 To 30: DoEvents: Next
    Next vX
    Set OutlookApp = Nothing
    Set Dic = Nothing
End Sub
Миниатюры
Формирование писем из таблицы excel по условиям  
Вложения
Тип файла: rar primer.rar (6.8 Кб, 25 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2015, 10:26
Ответы с готовыми решениями:

Выборка из таблицы по нескольким условиям MS Excel
Уважаемые эксперты, подскажите пожалуйста как сделать в данном случае. Есть 4 критерия - 4 столбца...

Создание таблицы в Excel, данные берем из писем Outlook
Здравствуйте! Имеется ряд писем в outlookе вида: Имя: Загрузка реестра Статус: процесс запущен...

Формирование сводной таблицы в Excel
Добрый день :) Мне нужно создать в Excel сводную таблицу и загрузить в неё данные из регистров...

Макрос Excel. Формирование КП из расчетной таблицы
Доброго дня, форумчане. Помогите с кодом. Задача выглядит так: 1. Есть эксель книга с...

12
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
27.04.2015, 11:00 2
Код работает, ошибок нет.

For Each vX In Dic.Keys
Debug.Print vX
Debug.Print Dic.Item(vX)

вывело

вася пупкин
123 01.04.2015 +
213 02.04.2015 -
123 03.04.2015 -
123 04.04.2015 +

маша иванова
23 02.04.2015 -
432 03.04.2015 +
123 06.04.2015 -
1244 07.04.2015 -

лев сорокин
234 04.04.2015 +
423 05.04.2015 +
444 07.04.2015 -
2134 08.04.2015 +

игорь иванов
234 05.04.2015 +
12 06.04.2015 -


А оутлука у меня нет.
0
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
27.04.2015, 11:56  [ТС] 3
прошу прощения код и правда работает без ошибок !!!!
спасибо огромное KoGG!!!!!!

если не сложно ответите на несколько вопросов :
1 где указывает столбец каким номером идет столбец с фио ?
2 аутлоок открывает окно с запросом разрешения на отправку и нужно нажимать "разрешить" можно это как нибудь обойти ?
0
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
28.04.2015, 10:44  [ТС] 4
спасибо всем огромное
особая благодарность KoGG!!!!!
ответ на мой первый вопрос сам разобрался
vX = Trim$(Cells(i, 1)) - 1 это номер столбца
со вторым вопросом обойти нельзя т к у нас запрещено это админами на сервере... поэтому просто вместо .Send написал .Display и отправляю ручками нажимая кнопку ОТПРАВИТЬ!

еще раз спасибо огромное KoGG

Добавлено через 21 час 44 минуты
очередной раз прошу помощи !
немного подредактировал код четко под свои нужды , смысл в чем в 26 столбце указано ФИО а в 27 емайл на который нужно отсылать . я сделал проверку что отправлять письмо только в случае если в 27 колонке напротив фио записан емайл НО если ситуация что ФИО встречается второй раз в списке и емайл соответственно написаон то создается второе письмо точно такое же как первое (((( а письмо должно создаваться только один раз одному ФИО (
если убрать мои for и if то писмо создается один раз как и должно (
в чем моя ошибка подскажите пожалуйста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Sub Макрос1()
 
 
 Const olMailItem% = 0
    Const FirstRow% = 3
    Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object
    Set OutlookApp = CreateObject("Outlook.Application")
    With ActiveSheet: LastRow = .Cells(.Rows.Count, 26).End(xlUp).Row: End With
    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.CompareMode = 1
    For i = FirstRow To LastRow
        ' n-я строка письма: дело1, дата дела1, результат дела 1 , перевод строки
        T = T & Cells(i, 3) & " " & Cells(i, 4) & " " & Cells(i, 9) & " " & Cells(i, 10) & " " & Cells(i, 18) & " " & Cells(i, 20) & vbCrLf
         '(n+1)-я строка письма: дело2, дата дела2, результат дела 2
        'T = T & Cells(i, 3) & " " & Cells(i, 4) & " " & Cells(i, 9) & " " & Cells(i, 10) & " " & Cells(i, 18) & " " & Cells(i, 20) & vbCrLf
         
        vX = Trim$(Cells(i, 26))
        
        Dic.Item(vX) = Dic.Item(vX) & T
    Next i
    For Each vX In Dic.Keys
          
          For i = FirstRow To LastRow
           
           If (Cells(i, 26) = vX) And (Not IsEmpty(Cells(i, 27))) Then
                    
           With OutlookApp.CreateItem(olMailItem)
            .to = Cells(i, 27).Value
            .Subject = "Уважаемый  " & vX 'Тема
            .Body = "  " & vbCrLf & vbCrLf & Dic.Item(vX)
            .display
           End With
        
           End If
          Next i
 
 
        
       
        'For j = 1 To 30: DoEvents: Next
 
    Next vX
    Set OutlookApp = Nothing
    Set Dic = Nothing
End Sub
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.04.2015, 11:17 5
Так словарь для того и используется, чтоб выбрать ФИО или что там собирают без повторов.
Вообще без примера файла (тот архив не в счёт, там нет емйлов и пропусков) трудно подсказать код, но предлагаю строки без емейлов пропускать и не заносить в словарь.
0
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
28.04.2015, 12:28  [ТС] 6
в примере файл с колонкой email и макросом ... письма для маши и васи создаются 2 раза (
помогите пожалйста
Вложения
Тип файла: rar email.rar (15.1 Кб, 14 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.04.2015, 12:44 7
Лучший ответ Сообщение было отмечено soulthiefer как решение

Решение

Может так?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Sub Макрос1()
 
 
    Const olMailItem% = 0
    Const FirstRow% = 2
    Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object
    Set OutlookApp = CreateObject("Outlook.Application")
    With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With
    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.CompareMode = 1
    For i = FirstRow To LastRow
        If Not IsEmpty(Cells(i, 2)) Then
            ' n-я строка письма: дело1, дата дела1, результат дела 1 , перевод строки
            T = Cells(i, 3) & " " & Cells(i, 5) & " " & Cells(i, 6) & vbCrLf
            '(n+1)-я строка письма: дело2, дата дела2, результат дела 2
            'T = T & Cells(i, 3) & " " & Cells(i, 4) & " " & Cells(i, 9) & " " & Cells(i, 10) & " " & Cells(i, 18) & " " & Cells(i, 20) & vbCrLf
 
            vX = Cells(i, 1) & "|" & Trim$(Cells(i, 2))
 
            Dic.Item(vX) = Dic.Item(vX) & T
        End If
    Next i
 
    For Each vX In Dic.Keys
        arr = Split(vX, "|")
        '        Debug.Print arr(1)
        '        Debug.Print arr(0)
        '        Debug.Print "  " & vbCrLf & vbCrLf & Dic.Item(vX)
 
        With OutlookApp.CreateItem(olMailItem)
            .to = arr(1)
            .Subject = "Уважаемый  " & arr(0)    'Тема
            .Body = "  " & vbCrLf & vbCrLf & Dic.Item(vX)
            .display
        End With
 
 
        'For j = 1 To 30: DoEvents: Next
 
    Next vX
    Set OutlookApp = Nothing
    Set Dic = Nothing
End Sub
1
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
28.04.2015, 12:46  [ТС] 8
Уважаемый Hugo121, ГЕНИАЛЬНО! огромная благодарность . попробую разобраться в коде что вы сделали ...
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.04.2015, 12:54 9
Если на одну ФИО будут разные мейлы или наоборот - будут разные письма.
Я сделал как и писал - если мыла нет, то строка пропускается.
Но и ещё - как ключ словаря берётся сочетание ФИО|мыло, из него позже извлекаются части для куда и для кому.

Добавлено через 2 минуты
Т.е. строка
лев сорокин 234 423 04.04.2015 + 05.04.2015 +
пропала. Может быть это нужно "подкрутить".
0
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
28.04.2015, 14:24  [ТС] 10
ОГО!!! и правда ... а почему она пропала эта строчка ?!
у Маши если я уберу в одной строке email то эта строчка которая без email тоже пропадет .....
может я не правильно объясняю что нужно .... (((
есть ФИО и напротив email. если хоть раз у повторяющегося ФИО есть email то все строчки должны попасть в тело письма не смотря на то что у повторов этого ФИО может быть не заполнено поле email(но т к один раз email был написан то мы знаем куда отправить письмо) . а вот если ФИО встречается 1 раз в списке и у него нет email то соответственно письмо создавать не нужно т к отправить его будет некуда (

"Если на одну ФИО будут разные мейлы или наоборот - будут разные письма." - исходим из того что такого быть не может ( я такого не встречал ни разу ) . одно ФИО одинаковый email.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.04.2015, 14:43 11
А если Иван Ивановмч Иванов?
Некогда пока думать...
0
0 / 0 / 0
Регистрация: 29.10.2009
Сообщений: 17
28.04.2015, 15:18  [ТС] 12
значит будет иванов иван иванович и иванов иван иванович 2)

по другому все как то нерешаемо вовсе (((
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.04.2015, 16:39 13
Лучший ответ Сообщение было отмечено soulthiefer как решение

Решение

Вот где-то так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Sub Макрос1()
 
 
    Const olMailItem% = 0
    Const FirstRow% = 2
    Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object, Dic2 As Object
    Set OutlookApp = CreateObject("Outlook.Application")
    With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With
    Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1
    Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1
    For i = FirstRow To LastRow
        ' n-я строка письма: дело1, дата дела1, результат дела 1 , перевод строки
        T = Cells(i, 3) & " " & Cells(i, 5) & " " & Cells(i, 6) & vbCrLf
        '(n+1)-я строка письма: дело2, дата дела2, результат дела 2
        'T = T & Cells(i, 3) & " " & Cells(i, 4) & " " & Cells(i, 9) & " " & Cells(i, 10) & " " & Cells(i, 18) & " " & Cells(i, 20) & vbCrLf
 
        vX = Cells(i, 1)
 
        Dic.Item(vX) = Dic.Item(vX) & T
        If Not IsEmpty(Cells(i, 2)) Then Dic2.Item(vX) = Cells(i, 2)
 
    Next i
 
    For Each vX In Dic.Keys
 
        If Len(Dic2.Item(vX)) Then
'            Debug.Print vX & " " & Dic2.Item(vX)
'            Debug.Print Dic.Item(vX)
 
                    With OutlookApp.CreateItem(olMailItem)
                        .to = Dic2.Item(vX)
                        .Subject = "Уважаемый  " & vX    'Тема
                        .Body = "  " & vbCrLf & vbCrLf & Dic.Item(vX)
                        .display
                    End With
        End If
 
        'For j = 1 To 30: DoEvents: Next
 
    Next vX
    Set OutlookApp = Nothing
    Set Dic = Nothing
End Sub
Только у пупкина из всех мейлов останется один последний - т.е. нужно следить за ними, чтоб были уникальные. Лучше им ID всем придумать.
Ну а текст из где "без мейла" добавится по ФИО к тому единственному последнему мейлу.
1
28.04.2015, 16:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2015, 16:39
Помогаю со студенческими работами здесь

Формирование списка в Word на основании таблицы Excel
Добрый день! Столкнулся с проблемой: Мне нужно создать в Word список из одинаковых строк и...

Формирование матрицы по заданным условиям
Здравствуйте всем! Помогите решить проблему. Задача из области строительной механики, но вопрос...

Выборочный перенос данных из общей таблицы в таблицы по условиям
Добрый день спецы Excel. Прошу помочь мне в следующей задаче. Существует общая таблица на...

Фильтр таблицы по условиям
Здравствуйте, нужно отфильтровать таблицу (формулой или макросом) по условиям (см. рисунок)....

Вставка данных по условиям в excel
Здравствуйте, Подскажите, пожалуйста, как можно вставить данные из access в excel. Есть таблица...

Выборка из таблицы по двум условиям
Уважаемые эксперты! Прошу помощи с небольшой задачей в Excel: Имеется 2 выпадающих меню с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru