Ошибка выполнения слияния Excel Mail 4198 - PullRequest
4 голосов
/ 05 ноября 2011

Был предыдущий вопрос о stackoverflow:
«Можно ли запустить MAIL MERGE из макроса Excel (нажав кнопку на листе) У меня есть лист Excel с данными и я хочу экспортировать его в новое слово doc».На это ответ 29 сентября 2009 г. в 12:39 от dendarii 772.

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

К сожалению, код Дендари, измененныйс подходящим путем, завершается с ошибкой времени выполнения 4198 в операторе .OpenDataSource.

Запись Синди Мейстер в форме Microsoft Office для формы для разработчиков> ..> Word 2010 VBA предположил, что ошибки 4198 могут быть связаны с проблемами синхронности.Я безуспешно справился с этим.

Эндрю Полсон, пишущий в Mr Excel, рекомендует участнику Снечу сравнивать свое заявление о слиянии VBA .OpenDataSource с записью макроса Word.Что думают авторы?Моя строка .OpenDataSource кажется стандартной.В моем файле источника данных Excel есть строка заголовков, за которой следуют две строки элементов данных.

У нас есть Office 2010.

Буду очень признателен за любые предложения относительно исправления 4198 и еслиКто-нибудь знает об общих диагностических процедурах.Мы два человека, работающие на благотворительную организацию.Любая помощь приветствуется!

 Sub RunMerge()  
     
    Dim wd As Object   
    Dim wdocSource As Object  
       
    Dim strWorkbookName As String  
     
    On Error Resume Next   
    Set wd = GetObject(, "Word.Application")   
    If wd Is Nothing Then   
    Set wd = CreateObject("Word.Application")   
    End If   
    On Error GoTo 0   
       
    Set wdocSource = wd.Documents.Open("C:\Users\george\Desktop\VBA Project\Mergeletter.docx")   
       
    strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name   
        
    wdocSource.MailMerge.MainDocumentType = wdFormLetters   
       
    wdocSource.MailMerge.OpenDataSource _   
    Name:=strWorkbookName, _   
    AddToRecentFiles:=False, _   
    Revert:=False, _   
    Format:=wdOpenFormatAuto, _      
    Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _  
    SQLStatement:="SELECT * FROM `Sheet1$`"    

    With wdocSource.MailMerge

    .Destination=wdSendToNewDocument

    .SuppressBlankLines = True  
    With .DataSource  
    .FirstRecord = wdDefaultFirstRecord  
    .LastRecord = wdDefaultLastRecord  
    End With  
    .Execute Pause:=False  
    End With  
        
    wd.Visible = True  
    wdocSource.Close SaveChanges:=False     
       
    Set wdocSource = Nothing  
    Set wd = Nothing     

    End Sub  

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

У вас есть набор ссылок на библиотеку объектов Word? Если нет, то макрос завершится ошибкой, потому что вы используете определенные элементы, найденные в этой библиотеке (например, wdOpenFormatAuto).

Чтобы добавить ссылку на библиотеку, в редакторе Excel VBA нажмите Инструменты> Ссылки и прокрутите вниз, пока не найдете «Библиотеку объектов Word Micrsoft», щелкните поле слева, чтобы «проверить его», и нажмите «ОК» , С ним будет связан номер версии ... вероятно, 14.0, так как вы используете Office 2010.

Добавьте эту ссылку, и это должно решить вашу проблему.

Если у вас уже есть этот набор, сообщите нам.

1 голос
/ 05 ноября 2011

Как насчет искусственной задержки непосредственно перед вызовом OpenDataSource, чтобы дать методу Open возможность наверстать упущенное? Это довольно уродливо, и, возможно, его нужно немного почистить, чтобы соответствовать синтаксису VBA, но вот так:

For nI As Integer = 0 To 2500
  DoEvents()
Next

Вы также можете проверить даты и дать заданный промежуток времени (то есть 2 секунды), прежде чем продолжить (это больше кода VB.Net, чем что-либо другое):

Dim dtDate As Date = Date.Now

Do While Date.Now.Subtract(dtDate).TotalSeconds < 2
  DoEvents()
Loop
...