#vba #outlook #attachment #email-attachments
Вопрос:
Я хочу, чтобы приведенный ниже код запускался при появлении в электронном письме определенной темы
, а также запускался только в том случае, если в этом письме есть вложение.
Outlook игнорирует часть правила о вложении и пытается запустить код, даже если вложения там нет (похоже, его интересует только тема).
Как включить проверку на вложение в код?
Public Sub SaveAttachmentsThenOpen(MItem As Outlook.MailItem)
Dim oMail As Variant
Dim oReply As Outlook.MailItem
Dim oItems As Outlook.Items
Dim Msg As Outlook.MailItem
Dim oAttachment As Outlook.Attachment
Dim StrBody As String
Dim oRep As MailItem
Dim sSaveFolder As String
Dim Att As String
Dim Attname As String
Dim sht As Object
Dim Rng As Range
Dim s As String
Dim myAttachments As Outlook.Attachments
Dim XLApp As Object
Dim XlWK As Object
Dim strPaste As Variant
Set oApp = New Outlook.Application
Set oNs = oApp.GetNamespace("MAPI")
Set XLApp = CreateObject("Excel.Application")
With XLApp
.Visible = True
.ScreenUpdating = True
.Workbooks.Open ("C:Directorydata.xlsx")
.Workbooks.Open ("C:DirectoryWB.xlsb")
End With
Dim strText As String
strText = ".xls"
sSaveFolder = "C:DirectoryTPS_Reports"
For Each oAttachment In MItem.Attachments
If InStr(1, oAttachment.FileName, strText) > 0 Then
oAttachment.SaveAsFile sSaveFolder amp; oAttachment.FileName
Attname = oAttachment.FileName
Att = sSaveFolder amp; oAttachment.FileName
Exit For
End If
Next oAttachment
Set oAttachment = Nothing
XLApp.Workbooks.Open (Att)
XLApp.Visible = True
XLApp.Run ("WB.XLSB!MacroName")
Set sht = XLApp.Workbooks(Attname).ActiveSheet
Set Rng = sht.UsedRange
s = "<table border=1 bordercolor=black cellspacing=0>"
For rw = Rng.Row To Rng.Rows.Count
s = s amp; "<tr>"
For col = Rng.Column To Rng.Columns.Count
s = s amp; "<td>" amp; sht.Cells(rw, col) amp; "</td>"
Next
s = s amp; "</tr>"
Next
s = s amp; "</table>"
Set oRep = MItem.ReplyAll
With oRep
StrBody = "Hello"
.HTMLBody = s
.Send
End With
With XLApp
.DisplayAlerts = False
End With
XLApp.Workbooks(Attname).Save
XLApp.Quit
With XLApp
.DisplayAlerts = True
End With
End Sub
Комментарии:
1. Если вы не можете найти/получить ответ на superuser.com затем вы можете добавить
If MItem.Attachments.Count = 0 Then Exit Sub
в код.2. Спасибо! Где это должно быть указано в коде??
3. @MarkFisher Добавление этой строки в качестве первой строки должно быть в порядке (ниже
Public Sub SaveAttachmentsThenOpen(MItem As Outlook.MailItem)
)4. Я добавил в код, и он все еще работает неправильно. Когда я только что провел тест, книги Excel все еще открывались, а затем появилась ошибка, потому что в outlook не было вложения для открытия.
5. Правило считает, что есть привязанность.
MItem.Attachments.Count
не равно нулю. Вывод в том, что есть привязанность. Какая строка генерирует ошибку и что это за сообщение об ошибке?
Ответ №1:
Попробуйте дождаться, пока письмо окажется в папке «Входящие», прежде чем проверять наличие вложения.
Код для модуля ThisOutlookSession
Перезапустите Outlook или запустите Application_Startup
его вручную.
Private WithEvents myItems As Items
Private Sub Application_Startup()
Dim myInbox As folder
Set myInbox = Session.GetDefaultFolder(olFolderInbox)
Set myItems = myInbox.Items
End Sub
Private Sub myItems_ItemAdd(ByVal Item As Object)
If TypeOf Item Is mailItem Then
If Item.Attachments.Count > 0 Then
SaveAttachmentsThenOpen Item
End If
End If
End Sub
Private Sub test()
myItems_ItemAdd ActiveInspector.currentItem
End Sub