2014-09-23 1 views
0

Может ли кто-нибудь помочь мне разобраться, что происходит не так и как его исправить?Получение «Object variable или With block variable not set» при первом использовании document.TypeText с сообщением Outlook

Я пытаюсь автоматизировать отправку электронной почты с информацией о повседневном состоянии. Я попытался автоматизировать это из Access, но продолжал работать (известные, но, видимо, нерешенные) проблемы с GetObject (, «Outlook.Application») с Windows 8.1 64 и Outlook 2013. Поэтому я решил автоматизировать работу с Outlook.

Во всяком случае, я переместил код создания почтового сообщения в Outlook vba и начал запускать Access и запустить код доступа. Это все хорошо и хорошо, пока я не получу создание почтового сообщения. Все начинается нормально, пока не доходит до написания тела сообщения (используя Word в качестве редактора тела). При первой команде «TypeText» я получаю сообщение об ошибке в заголовке. Если я нажму кнопку «Отладка» в диалоговом окне уведомления об ошибках, а затем пропустим одну строчку через строку кода, о которой идет речь, она работает нормально. Я думал, что существует некоторая проблема с синхронизацией, поэтому я застрял в коде 2 секунды. Не повезло. Код в вопросе, с некоторыми другими странностей, связанных с тестированием (в частности, пытается напечатать, а затем удалить текст), ниже:

Public Sub CreateMetrics() 
    ' Mail-sending variables 
    Dim mailApp As Outlook.Application 
    Dim accessApp As Access.Application 

    Dim mail As MailItem 
    Dim wEditor As Word.Document 
    Dim boolCreatedApp As Boolean 

    Dim i As Integer 

    Set mailApp = Application 

    ' Create an Access application object and open the database 
    Set accessApp = CreateObject("Access.Application") 
    accessApp.OpenCurrentDatabase dbLoc 
    accessApp.Visible = True 

    ' Open the desired form and run the click event hander for the start button 
    accessApp.DoCmd.OpenForm ("ProcessStatus") 
    accessApp.Forms![ProcessStatus].StartButton_Click 

    ' Create the outgoing mail message 
    Set mail = Application.CreateItem(olMailItem) 
    mail.Display 
    mail.BodyFormat = olFormatHTML 
    Set wEditor = mailApp.ActiveInspector.WordEditor 

    With accessApp.Forms![ProcessStatus] 
     Debug.Print .lblToList.Caption 
     Debug.Print .lblSubject.Caption 
     Debug.Print .lblIntroduction.Caption 
     Debug.Print .lblAttachFilepath.Caption 
    End With 

     mail.To = accessApp.Forms![ProcessStatus].lblToList.Caption 
     mail.Recipients.ResolveAll 

     mail.Subject = accessApp.Forms![ProcessStatus].lblSubject.Caption 
     mail.Attachments.Add accessApp.Forms![ProcessStatus].lblAttachFilepath.Caption 

     Sleep 2000 

     ' Error occurs in the next line *********************************************** 
     wEditor.Application.Selection.TypeText Text:="Test" 
     wEditor.Application.Selection.HomeKey 
     wEditor.Application.Selection.Delete Count:=4 

     wEditor.Application.Selection.PasteSpecial DataType:=wdPasteBitmap 
     wEditor.Application.Selection.HomeKey 
     wEditor.Application.Selection.TypeText accessApp.Forms![ProcessStatus].lblIntroduction.Caption 
     wEditor.Application.Selection.TypeText Text:=Chr(13) & Chr(13) 
     wEditor.Application.Selection.EndKey 

'  wEditor.Application.Selection.EndKey 
'  wEditor.Application.Selection.TypeText Text:=Chr(13) 
'  wEditor.Application.Selection.TypeText Text:=configs("EmailSignature") 
' End With 

    With mailApp.Session.Accounts 
     i = 1 
     Do While i <= .Count 
      ' Use either the specified email address OR the last outlook email address 
      If RegEx_IsStringMatching(.Item(i).SmtpAddress, accessApp.Forms![ProcessStatus].lblSenderRegex.Caption) Or i = .Count Then 
       mail.SendUsingAccount = .Item(i) 
       i = .Count + 1 
      Else 
       i = i + 1 
      End If 
     Loop 
    End With 
    mail.Save 

    accessApp.Quit 
End Sub 

ответ

0

Я добавил «mail.Display» непосредственно перед линией, которая была причиной неудачи , который, как представляется, неправильно исправил проблему.

Я решил эту проблему, выполнив document.select в документе, связанном с созданным мной электронным письмом. Чтобы выбрать нужный документ (похоже, нет какой-либо гарантии, которая была бы в коллекции wEditor.Application.Documents, хотя она была, как правило, первой), я создал почти наверняка уникальный фрагмент текста и назначил его тело письма, которое я мог бы найти и найти. Вот новый код, который я добавил в код выше: Dim ADOC Как Word.Document Dim strUniqueID As String

. . . 

mail.Attachments.Add accessApp.Forms![ProcessStatus].lblAttachFilepath.Caption 
strUniqueID = accessApp.Forms![ProcessStatus].lblSubject.Caption & Rnd(Now()) & Now() 
mail.Body = strUniqueID 

' Search for the unique text. aDoc.Content has extra characters at the 
' end, so compare only for the length of the unique text 
For Each aDoc In wEditor.Application.Documents 
    If Left(aDoc.Content, Len(strUniqueID)) = strUniqueID Then 
     aDoc.Select 
     mail.Body = "" 
    End If 
Next aDoc 

wEditor.Application.Selection.TypeText Text:="Test" 
. . . 

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