Один из вопросов на форуме подтолкнул меня к более развёрнутому решению, нежели запрашивалось пользователем =)
Макрос во вложении позволяет из ячеек подготовленной таблицы Excel создавать задачи в Outlook автоматически. Кнопка справа от таблицы.
Для корректной работы макроса надо заполнить имеющиеся в таблице поля. Строки должны идти подряд друг за другом, без пробелов. Особенность - в графу "напомнить в Х часов" надо вводить целое число, как и в графу по минутам. Заранее настроил возможность ввода только корректных значений.
И пусть работать Вам станет легче!
[vba]
Код
Sub OutTask_Manager()
'Автоматическое добавление задач в Outlook 'Сделал Роман "Rioran" Воронов (voronov_rv@mail.ru) 'Для пользователей форума www.excelworld.ru
Dim OutApp As Object 'Для обращений к приложению Outlook Dim OutTsk As Object 'Для создания задачи в Outlook Dim shtX As Worksheet 'Для обращения к конкретному листу Dim X As Long 'Для перебора создаваемых задач
Set shtX = ThisWorkbook.Worksheets("Задачник") X = 2
Do While shtX.Cells(X, 1).Value <> 0
Set OutApp = CreateObject("Outlook.Application") Set OutTsk = OutApp.CreateItem(3)
With OutTsk .Subject = shtX.Cells(X, 1).Value 'Заголовок задачи .Body = shtX.Cells(X, 2).Value 'Текст задачи .ReminderSet = True 'Включить напоминание
Select Case shtX.Cells(X, 3).Value 'Выбираем важность Case "Низкая": .Importance = 0 Case "Обычная": .Importance = 1 Case "Высокая": .Importance = 2 End Select
.StartDate = DateAdd("h", 10, shtX.Cells(X, 4).Value) 'Когда начать задачу .DueDate = DateAdd("h", 10, shtX.Cells(X, 5).Value) 'Дата завершения .ReminderTime = DateAdd("n", shtX.Cells(X, 7).Value * 60 + shtX.Cells(X, 8).Value, shtX.Cells(X, 6).Value) 'Дата напоминания .Save End With X = X + 1 Loop
Set OutApp = Nothing Set OutTsk = Nothing
End Sub
[/vba]
Всем привет и хорошего настроения!
Один из вопросов на форуме подтолкнул меня к более развёрнутому решению, нежели запрашивалось пользователем =)
Макрос во вложении позволяет из ячеек подготовленной таблицы Excel создавать задачи в Outlook автоматически. Кнопка справа от таблицы.
Для корректной работы макроса надо заполнить имеющиеся в таблице поля. Строки должны идти подряд друг за другом, без пробелов. Особенность - в графу "напомнить в Х часов" надо вводить целое число, как и в графу по минутам. Заранее настроил возможность ввода только корректных значений.
И пусть работать Вам станет легче!
[vba]
Код
Sub OutTask_Manager()
'Автоматическое добавление задач в Outlook 'Сделал Роман "Rioran" Воронов (voronov_rv@mail.ru) 'Для пользователей форума www.excelworld.ru
Dim OutApp As Object 'Для обращений к приложению Outlook Dim OutTsk As Object 'Для создания задачи в Outlook Dim shtX As Worksheet 'Для обращения к конкретному листу Dim X As Long 'Для перебора создаваемых задач
Set shtX = ThisWorkbook.Worksheets("Задачник") X = 2
Do While shtX.Cells(X, 1).Value <> 0
Set OutApp = CreateObject("Outlook.Application") Set OutTsk = OutApp.CreateItem(3)
With OutTsk .Subject = shtX.Cells(X, 1).Value 'Заголовок задачи .Body = shtX.Cells(X, 2).Value 'Текст задачи .ReminderSet = True 'Включить напоминание
Select Case shtX.Cells(X, 3).Value 'Выбираем важность Case "Низкая": .Importance = 0 Case "Обычная": .Importance = 1 Case "Высокая": .Importance = 2 End Select
.StartDate = DateAdd("h", 10, shtX.Cells(X, 4).Value) 'Когда начать задачу .DueDate = DateAdd("h", 10, shtX.Cells(X, 5).Value) 'Дата завершения .ReminderTime = DateAdd("n", shtX.Cells(X, 7).Value * 60 + shtX.Cells(X, 8).Value, shtX.Cells(X, 6).Value) 'Дата напоминания .Save End With X = X + 1 Loop
Alterak, старые записи тогда удаляйте. Этот файл может загружать очень много задач сразу, следить чтобы они все были новые - это уже компетенция пользователя. *9:50 - хотя можно написать код, который проверяет существующие задачи по заголовку. Но для меня это уже тянет не на спортивную, а на рабочую разработку под заказ*
Выложил файл повторно - добавил кнопку очистки. Убирает все задачи долой с экрана.
Alterak, старые записи тогда удаляйте. Этот файл может загружать очень много задач сразу, следить чтобы они все были новые - это уже компетенция пользователя. *9:50 - хотя можно написать код, который проверяет существующие задачи по заголовку. Но для меня это уже тянет не на спортивную, а на рабочую разработку под заказ*
Выложил файл повторно - добавил кнопку очистки. Убирает все задачи долой с экрана.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Четверг, 03.07.2014, 09:52
Rioran, Да вот в том то и дело что старые записи удалять не нужно... есть файл, в котором ежедневно дополняются пару десятков записей, в каждой записи ставится дата, иногда одна и та же дата, вот пользователь и хотел что бы в указанную дату появлялась напоминалка.
Rioran, Да вот в том то и дело что старые записи удалять не нужно... есть файл, в котором ежедневно дополняются пару десятков записей, в каждой записи ставится дата, иногда одна и та же дата, вот пользователь и хотел что бы в указанную дату появлялась напоминалка.Alterak
Создайте тему в разделе "Ексель и другие приложения", опишите подробно что должна делать программа и мы с форумчанами посмотрим, что можно сделать =)
nika, здравствуйте.
Создайте тему в разделе "Ексель и другие приложения", опишите подробно что должна делать программа и мы с форумчанами посмотрим, что можно сделать =)Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
[offtop] По коду сообщения № 1. Наверное, Set OutApp = CreateObject("Outlook.Application") вполне достаточно перед циклом (один раз) выполнить. А Set OutTsk = Nothing, наоборот, концептуальнее в цикл включить и делать на каждом шаге. В любом случае "носинговать" "бест практичнее" в порядке, обратном созданию: сначала OutTsk, потом OutApp.
[offtop] По коду сообщения № 1. Наверное, Set OutApp = CreateObject("Outlook.Application") вполне достаточно перед циклом (один раз) выполнить. А Set OutTsk = Nothing, наоборот, концептуальнее в цикл включить и делать на каждом шаге. В любом случае "носинговать" "бест практичнее" в порядке, обратном созданию: сначала OutTsk, потом OutApp.Gustav
Alterak, Rioran, уважаемые господа)))) а мне то может кто-нибудь ответит?)) плиз))) у меня задача точь в точь как у Alterak, есть в итоге готовое решение?
Alterak, Rioran, уважаемые господа)))) а мне то может кто-нибудь ответит?)) плиз))) у меня задача точь в точь как у Alterak, есть в итоге готовое решение?happinesss123
Добрый день. Подскажите, пожалуйста, есть ли способ назначать задачи другим пользователям? Например, при отправке обычного письма указывается просто .To = "email.address". Можно ли аналогично указать "адресата" задачи? Спасибо.
Добрый день. Подскажите, пожалуйста, есть ли способ назначать задачи другим пользователям? Например, при отправке обычного письма указывается просто .To = "email.address". Можно ли аналогично указать "адресата" задачи? Спасибо.jscd
К сожалению, сейчас нет времени дорабатывать своё решение. Но зацепку с удовольствием дам.
Следующий код можно найти через автономную справку Outlook VBA-редактора. Внутри мои комментарии, это более чем достаточно, чтобы совместить с моим решением.
[vba]
Код
Sub AssignTask()
Dim myItem As Outlook.TaskItem 'Для создания задачи Dim myDelegate As Outlook.Recipient 'Для добавления исполнителя
Set myItem = Application.CreateItem(olTaskItem) 'Создаётся задача myItem.Assign 'Возводит задачу в ранг запроса к пользователям (TaskRequestItem) Set myDelegate = myItem.Recipients.Add("Dan Wilson") 'Добавляется исполнитель myDelegate.Resolve 'Проверяет, может ли указанный исполнитель получить задачу (корректно ли указано имя или адрес)
'Если исполнитель успешно добавлен, то готовим задачу If myDelegate.Resolved Then myItem.Subject = "Prepare Agenda For Meeting" myItem.DueDate = Now + 30 myItem.Display myItem.Send End If
End Sub
[/vba]
jscd, здравствуйте.
К сожалению, сейчас нет времени дорабатывать своё решение. Но зацепку с удовольствием дам.
Следующий код можно найти через автономную справку Outlook VBA-редактора. Внутри мои комментарии, это более чем достаточно, чтобы совместить с моим решением.
[vba]
Код
Sub AssignTask()
Dim myItem As Outlook.TaskItem 'Для создания задачи Dim myDelegate As Outlook.Recipient 'Для добавления исполнителя
Set myItem = Application.CreateItem(olTaskItem) 'Создаётся задача myItem.Assign 'Возводит задачу в ранг запроса к пользователям (TaskRequestItem) Set myDelegate = myItem.Recipients.Add("Dan Wilson") 'Добавляется исполнитель myDelegate.Resolve 'Проверяет, может ли указанный исполнитель получить задачу (корректно ли указано имя или адрес)
'Если исполнитель успешно добавлен, то готовим задачу If myDelegate.Resolved Then myItem.Subject = "Prepare Agenda For Meeting" myItem.DueDate = Now + 30 myItem.Display myItem.Send End If
Rioran, спасибо. На самом деле, свою задачу уже решил (как раз с использованием приведенного примера) и зашел, чтобы себе же и ответить:) Очень много времени потратил на поиск хоть какого-то описания TaskRequestItem, но так и не нашел. Не поясните следующий момент - реквест нельзя создать как отдельный объект? Он получается только назначением TaskItem другому пользователю? И еще один интересный момент .Add("Dan Wilson"). Порадовало, что можно указывать и почтовый адрес, и имя контакта. Но не совсем понятно что произойдет, если есть два контакта с одним именем, но разными адресами. Resolve как-то решит эту ситуацию или задачи уйдут сразу всем?
Rioran, спасибо. На самом деле, свою задачу уже решил (как раз с использованием приведенного примера) и зашел, чтобы себе же и ответить:) Очень много времени потратил на поиск хоть какого-то описания TaskRequestItem, но так и не нашел. Не поясните следующий момент - реквест нельзя создать как отдельный объект? Он получается только назначением TaskItem другому пользователю? И еще один интересный момент .Add("Dan Wilson"). Порадовало, что можно указывать и почтовый адрес, и имя контакта. Но не совсем понятно что произойдет, если есть два контакта с одним именем, но разными адресами. Resolve как-то решит эту ситуацию или задачи уйдут сразу всем?jscd
1). TaskRequestItem - информация есть на официальном сайте Microsoft на английском языке. Там говорится, что объект TaskRequestItem обозначает объект во ВХОДЯЩЕЙ почтовой папке. Объект TaskRequestItem характеризует изменения в списке задач пользователя, проводимые другой стороной или в результате групповой работы с задачами.
В отличие от других объектов Microsoft Outlook, этот создать невозможно. Объект TaskRequestItem появляется только после применения методов .Assign и .Send к уже знакомому нам TaskItem (он же нумер 3) при назначении задачи другому пользователю. И только после того, как задача была получена конечным пользователем.
Represents an item in an Inbox (mail) folder. A TaskRequestItem object represents a change to the recipients Tasks list initiated by another party or as a result of a group tasking.
Unlike other Microsoft Outlook objects, you cannot create this object. When the sender applies the Assign and Send methods to a TaskItem object to assign (delegate) the associated task to another user, the TaskRequestItem object is created when the item is received in the recipients Inbox.
[/vba]
2). Если есть два контакта с одинаковым именем? Лично не встречал такой ситуации. Во всех компаниях, где я был, дубли связок Имя + Фамилия либо дополнялись инициалами, либо писались разными алфавитами (рус / анг). В связи с чем я не уверен, что создание двух одинаковых имен принципиально возможно. Предлагаю Вам протестировать.
3). И уже предложение от меня =) Набираюсь наглости и предлагаю Вам (если, конечно, есть интерес и время на упражнения) ещё больше доработать мой код. А конкретно сделать следующее:
- Добавить столбец с указанием имени получателя задачи. - Добавить макрос на кнопке (а в идеале на горячей клавише), который при нажатии копирует строкой ниже последнюю строку таблицы, но с пустой ячейкой в столбце "Имя получателя". - При работе макроса если подряд идут одинаковые строки с разными получателями - задача создаётся только одна, но на всех пользователей. - Если в столбце "Имя получателя" пусто - создаётся отдельная задача на запускающем макрос.
По пунктам:
1). TaskRequestItem - информация есть на официальном сайте Microsoft на английском языке. Там говорится, что объект TaskRequestItem обозначает объект во ВХОДЯЩЕЙ почтовой папке. Объект TaskRequestItem характеризует изменения в списке задач пользователя, проводимые другой стороной или в результате групповой работы с задачами.
В отличие от других объектов Microsoft Outlook, этот создать невозможно. Объект TaskRequestItem появляется только после применения методов .Assign и .Send к уже знакомому нам TaskItem (он же нумер 3) при назначении задачи другому пользователю. И только после того, как задача была получена конечным пользователем.
Represents an item in an Inbox (mail) folder. A TaskRequestItem object represents a change to the recipients Tasks list initiated by another party or as a result of a group tasking.
Unlike other Microsoft Outlook objects, you cannot create this object. When the sender applies the Assign and Send methods to a TaskItem object to assign (delegate) the associated task to another user, the TaskRequestItem object is created when the item is received in the recipients Inbox.
[/vba]
2). Если есть два контакта с одинаковым именем? Лично не встречал такой ситуации. Во всех компаниях, где я был, дубли связок Имя + Фамилия либо дополнялись инициалами, либо писались разными алфавитами (рус / анг). В связи с чем я не уверен, что создание двух одинаковых имен принципиально возможно. Предлагаю Вам протестировать.
3). И уже предложение от меня =) Набираюсь наглости и предлагаю Вам (если, конечно, есть интерес и время на упражнения) ещё больше доработать мой код. А конкретно сделать следующее:
- Добавить столбец с указанием имени получателя задачи. - Добавить макрос на кнопке (а в идеале на горячей клавише), который при нажатии копирует строкой ниже последнюю строку таблицы, но с пустой ячейкой в столбце "Имя получателя". - При работе макроса если подряд идут одинаковые строки с разными получателями - задача создаётся только одна, но на всех пользователей. - Если в столбце "Имя получателя" пусто - создаётся отдельная задача на запускающем макрос.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Пятница, 20.03.2015, 10:23
Столбец с адресатом и отправка в случае наличия адресата/назначение на себя в случае отсутствия - ок. Копирование последней строчки без адресата - тоже ок, но непонятно зачем. Возможные сложности - нельзя указать в качестве адресата себя.
С назначением задачи нескольким людям непонятно. Не резолвятся сформированные адреса. Есть версия, что нельзя ставить одну задачу с указанием сроков разным людям. Проблема в том, что и без указания сроков не получается назначить. В чем здесь хитрость?
Столбец с адресатом и отправка в случае наличия адресата/назначение на себя в случае отсутствия - ок. Копирование последней строчки без адресата - тоже ок, но непонятно зачем. Возможные сложности - нельзя указать в качестве адресата себя.
С назначением задачи нескольким людям непонятно. Не резолвятся сформированные адреса. Есть версия, что нельзя ставить одну задачу с указанием сроков разным людям. Проблема в том, что и без указания сроков не получается назначить. В чем здесь хитрость?jscd
Ваш код одинаковую задачу создаёт несколько раз на каждого пользователя. А нужно в одну задачу добавлять по несколько людей. Можно перестроить логику так, чтобы программа проверяла следующую строку. Если всё, кроме адресата, совпадает - то добавляем адресата в текущую задачу.
Ваш код одинаковую задачу создаёт несколько раз на каждого пользователя. А нужно в одну задачу добавлять по несколько людей. Можно перестроить логику так, чтобы программа проверяла следующую строку. Если всё, кроме адресата, совпадает - то добавляем адресата в текущую задачу.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Создается одна задача с несколькими адресатами. В переменной rcp через точку с запятой перечисляются все адреса для одинаковых задач:
[vba]
Код
rcp = Cells(X, 9).Value
chck = 0 i = 1 While chck = 0 For j = 1 To 8
If shtX.Cells(X, j).Value <> shtX.Cells(X + i, j) Or Len(shtX.Cells(X + i, 9)) = 0 Then chck = chck + 1 End If Next j rcp = rcp + "; " + shtX.Cells(X + i, 9).Value i = i + 1 Wend
[/vba]
И после отправки задачи переходим к уже новой задаче X = X + i - 1
Создается одна задача с несколькими адресатами. В переменной rcp через точку с запятой перечисляются все адреса для одинаковых задач:
[vba]
Код
rcp = Cells(X, 9).Value
chck = 0 i = 1 While chck = 0 For j = 1 To 8
If shtX.Cells(X, j).Value <> shtX.Cells(X + i, j) Or Len(shtX.Cells(X + i, 9)) = 0 Then chck = chck + 1 End If Next j rcp = rcp + "; " + shtX.Cells(X + i, 9).Value i = i + 1 Wend
[/vba]
И после отправки задачи переходим к уже новой задаче X = X + i - 1jscd