Попытка сгенерировать электронное письмо из данных в электронной таблице Excel, ошибка компиляции «Пользовательский тип не определен»

#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 , когда находитесь в dev

2. Согласен, я должен был более четко указать, что раннее связывание обычно считается предпочтительным.

Ответ №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