#excel #vba
#excel #vba
Вопрос:
Я пытаюсь сгенерировать электронное письмо на основе ввода данных в электронную таблицу, чтобы создать предложение о работе. Но когда я это делаю, я продолжаю получать ту же ошибку: ошибка компиляции, пользовательский тип не определен
Я зашел в «Инструменты»> Ссылки и установил флажок «Библиотека объектов Microsoft Outlook 16.0», но получаю ту же ошибку. Когда я пытаюсь найти другие ответы на эту тему, это кажется решением для большинства.
Option Explicit
Private Sub Generate_offer()
Dim strFile As String
Dim OutApp As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Set OutApp = CreateObject("Outlook.Application")
Set objOutlookMsg = OutApp.CreateItem(olMailItem)
With objOutlookMsg
.SentOnBehalfOfName = ""
.To = ""
.Subject = "xxxxxxxx"
.Body = "Dear " amp; vbNewLine amp; vbNewLine amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "C").Value amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "J").Value amp; " - " amp; Cells(ActiveCell.Row, "K").Value amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "M").Value amp; "xxxxxxxx" amp; vbNewLine _
amp; "Notes: " amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine amp; "xxxxxxxx"
.display
End With
'objOutlookMsg.Send
Set OutApp = Nothing
End Sub
Любая помощь приветствуется.
Комментарии:
1. В какой строке ошибка. Когда я пытаюсь это сделать, он работает нормально, когда отмечена ссылка на библиотеку объектов MS Outlook 16.0. И, пожалуйста, покажите небольшой скриншот ваших отмеченных ссылок.
Ответ №1:
Ваш код использует «раннее связывание».. где для использования Dim Something As Outlook.Something
Excel необходимо ссылаться на библиотеку Outlook.
У вас есть два варианта.
Вы можете исправить это либо
Добавление ссылки — В окне редактора VB, убедившись, что выполнение кода полностью остановлено, перейдите в меню Инструменты> Ссылки и отметьте Microsoft Outlook x.x Object Library (x.x будет зависеть от установленной версии).
Или используйте позднюю привязку — которая сохраняет объявления открытыми (как объекты), которые привязываются при их использовании:
Option Explicit
Private Sub Generate_offer()
Dim strFile As String
Dim OutApp As Object
Dim objOutlookMsg As Object
Dim olMailItem As Long
olMailItem = 0 ' (0 = Mail item, 1 = Appointment, 2 = Contact etc..)
Set OutApp = CreateObject("Outlook.Application")
Set objOutlookMsg = OutApp.CreateItem(olMailItem)
With objOutlookMsg
.SentOnBehalfOfName = ""
.To = ""
.Subject = "xxxxxxxx"
.Body = "Dear " amp; vbNewLine amp; vbNewLine amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "C").Value amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "J").Value amp; " - " amp; Cells(ActiveCell.Row, "K").Value amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "M").Value amp; "xxxxxxxx" amp; vbNewLine _
amp; "Notes: " amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine amp; "xxxxxxxx"
.display
End With
'objOutlookMsg.Send
Set OutApp = Nothing
End Sub
Примечание — основная причина, по которой я бы использовал позднюю привязку, заключается в том, что макрос будет использоваться на нескольких компьютерах с установленными разными версиями Excel. Если используется ранняя привязка и ссылка указывает на определенную версию, которая не установлена, вы получите сообщение об ошибке. Позднее связывание найдет любую версию, которая предоставляет Outlook.
Комментарии:
1. Один недостаток
Late Binding
заключается в том, что вы не получаете intellisense . Но есть способы обойти это .. т. е. Вы могли бы просто использоватьEarly Binding
, когда находитесь в dev2. Согласен, я должен был более четко указать, что раннее связывание обычно считается предпочтительным.
Ответ №2:
Я не получаю ошибок при изменении вашего Dim на Objects
Option Explicit
Private Sub Generate_offer()
Dim strFile As String
Dim OutApp As Object
Dim objOutlookMsg As Object
Set OutApp = CreateObject("Outlook.Application")
Set objOutlookMsg = OutApp.CreateItem(0)
With objOutlookMsg
.SentOnBehalfOfName = ""
.To = ""
.Subject = "xxxxxxxx"
.Body = "Dear " amp; vbNewLine amp; vbNewLine amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "C").Value amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "J").Value amp; " - " amp; Cells(ActiveCell.Row, "K").Value amp; vbNewLine _
amp; "xxxxxxxx" amp; Cells(ActiveCell.Row, "M").Value amp; "xxxxxxxx" amp; vbNewLine _
amp; "Notes: " amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine _
amp; "xxxxxxxx" amp; vbNewLine amp; vbNewLine amp; "xxxxxxxx"
.display
End With
'objOutlookMsg.Send
Set OutApp = Nothing
End Sub