Excel и Outlook VBA: получать сообщения перед отправкой почты в Outlook на основе данных в файле Excel - PullRequest
0 голосов
/ 03 января 2019

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

Контекст: мы в основном работаем с аутсорсингами и фрилансерами, ииногда трудно отследить, кто недоступен и до какого времени.Вот почему я собрал воедино файл Excel, в котором пользовательская форма упрощает ввод дат, в которые люди (введенные через их адрес электронной почты) недоступны на листе Excel.Это был мой первый опыт VBA.

Теперь, следующий шаг - это тот, для которого я изо всех сил пытаюсь найти решение.Я хотел бы «подключить» этот файл Excel к Outlook, чтобы при нажатии «Отправить» или вводе адреса электронной почты макрос:

  1. проверял, введен ли введенный адрес электронной почтынаходится в рабочей таблице файла Excel
  2. проверяет, находится ли текущий момент между датами недоступности рядом с этим именем
  3. выдает сообщение, когда оба условия выполнены, чтобы сказать мне, что этот человекнедоступен, и позвольте мне отменить отправку электронного письма.
  4. необязательно: в приглашении к сообщению есть поля, заполненные соответствующим периодом недоступности для этого человека

Возможно ли подключитьсяExcel в Outlook таким образом, чтобы мы могли продолжать использовать Outlook для написания наших писем?Если да, то какая-то помощь или ссылка на уже существующее руководство было бы поразительным, поскольку мне не удалось найти что-либо жизнеспособное.

Упрощенно, это должно выглядеть примерно так:

    Click “Send” in Outlook email window
Before sending, call Excel file (does not need to be visible)
Check e-mail address column (column A)
 Matches “To” field in Outlook email window?
    If No, Send email
    If Yes, Check “From” date column (column C) next to corresponding email address
     Present date is equal to or later than “From” date?
        If No, Send Email
        If Yes, Check “Until” Date column (column D): present date is earlier than or equal to present date?
            If Yes, message prompt: “Name (column B) is not available from “From” until “Until”. Do you still want to send the e-mail?
            Buttons:
                Yes: Send Email
                No: Close prompt, do not send email, but keep email open.
            If No, Send Email

Кроме того, вот мой код для пользовательской формы в файле Excel:

Private Sub CommandDate1_Click()

DatePicker1.Show
AbsencePlannerUserForm.StartTextBox.SetFocus

End Sub


Private Sub CancelButton_Click()

Unload Me

End Sub

Private Sub ClearButton_Click()

Call AbsencePlannerUserForm_Initialize

End Sub

Private Sub CommandDate2_Click()

DatePicker2.Show
AbsencePlannerUserForm.EndTextBox.SetFocus

End Sub

Private Sub EndTextBox_Change()

End Sub

Private Sub ExtraInfoTextBox_Change()

End Sub

Private Sub OKButton_Click()

Dim M_Date As Date
Dim M_Item As String

M_Date1 = StartTextBox
M_Date2 = EndTextBox
M_Item = EmailTextBox
M_Info = ExtraInfoTextBox
Application.ScreenUpdating = False
LastRow = Abwesenheit1.Cells(Rows.Count, "D").End(xlUp).Row

For rw = 2 To LastRow
If Abwesenheit1.Cells(rw, "A") = M_Item And Cells(rw, "C") = M_Date1   

And Cells(rw, "D") = M_Date2 And Cells(rw, "E") = M_Info Then GoTo Passem
Next rw
GoTo NO_Dups

Passem:
 Application.ScreenUpdating = True

MsgBox "Der Urlaub für " & M_Item & " vom " & M_Date1 & " bis zum " & M_Date2 & " ist schon eingetragen."
Exit Sub

NO_Dups:

Dim emptyRow As Long

'Make Abwesenheit1 active
Abwesenheit1.Activate

'Determine emptyRow
emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1

'Transfer information
Cells(emptyRow, 1).Value = EmailTextBox.Value
Cells(emptyRow, 3).Value = StartTextBox.Value
Cells(emptyRow, 4).Value = EndTextBox.Value
Cells(emptyRow, 5).Value = ExtraInfoTextBox.Value

Application.Visible = True
Me.Hide

End Sub

Private Sub AbsencePlannerUserForm_Click()

End Sub

Private Sub AbsencePlannerUserForm_Initialize()


'Empty EmailTextBox
EmailTextBox.Value = ""

'Empty StartTextBox
StartTextBox.Value = ""

'Empty EndTextBox
EndTextBox.Value = ""

'Empty ExtraInfoTextBox
ExtraInfoTextBox.Value = ""

'Set Focus on EmailTextBox
EmailTextBox.SetFocus

End Sub

Sub open_form()
    Application.Visible = False
    UserForm1.Show vbModeless
End Sub
Private Sub StartTextBox_Change()

End Sub

Private Sub UserForm_Click()

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.Visible = True
Me.Hide
End Sub

С нетерпением ждем вашего более опытного ввода!

1 Ответ

0 голосов
/ 03 января 2019

Это можно сделать. Вам нужно будет создать ссылку на Outlook через Excel в среде VBA. Для этого:

Активируйте библиотеку outlook из Сервис / Ссылки

 (Номер библиотеки может отличаться на вашем компьютере)

А затем позвоните в Outlook:

https://docs.microsoft.com/en-us/office/vba/outlook/concepts/getting-started/automating-outlook-from-a-visual-basic-application

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

Если вы разместите код, с ним будет легче работать, но в основном вызовите outlook, создайте пользовательскую форму с кнопкой, чтобы закрыть все, если это необходимо.

...