открыть документ Word для слияния данных с Excel

Автор Илья, 20 мая 2014, 09:42

Илья

И снова здравствуйте, Господа!

Настроено слияние данных Word и Excel, ранее из Excel открывал Word через созданную гиперссылку, теперь, когда создал пользовательскую форму, появилась необходимость открывать Word кнопкой - CommandButton1.

Есть следующий код:

Private Sub CommandButton1_Click()
Dim objWrd As Object, objDoc As Object
    Dim objWrdDoc As Object
    On Error Resume Next
    Set objWrdApp = GetObject(, "Word.Application")
        If objWrdApp Is Nothing Then
            Set objWrdApp = CreateObject("Word.Application")
            Set objWrdDoc = objWrdApp.Documents.Open("C:\Document.doc")
            objWrdApp.Visible = False
        End If
    Set objWrdDoc = objWrdApp.Documents.Open("C:\Document.doc")
    Set objWrdDoc = Nothing
    Set objWrdApp = Nothing
End Sub

но этот код открывает Document.doc без слияния данных, приходится заново прописывать путь к данным Excel.
Разъясните пожалуйста, что и куда в коде прописать для достижения нужной мне цели!?

Администратор

Илья, опишите от А до Я какие действия (без макроса - просто пользователь) нужно сделать в программе "Word" или "Excel", чтобы сделать слияние.
На основе этих действий я буду примерно знать, о каком слиянии Вы пишите.

Илья

Итак, слияние заранее настроено, все поля расставлены, действия следующие: 1. вносим сведения в "База.xls"; 2. открываем форму; 3. нажимаем кнопку для открытия документа "Document.doc"; 4. "Document.doc" открывается и появляется возможность выбора записей (из "База.xls") на панели инструментов "Слияние" (см. скриншот в архиве).

Примечание 1
В приложении (архивеZip) находится папка "Слияние" (для удобства, ее нужно скопировать на диск С:), в ней 3 файла - "База.xls", "Document.doc" и "Скриншот.png"

Примечание 2
Указанный мной в первом сообщении код почему-то в этом примере отказывается работать...

[вложение удалено администратором]

Администратор

Илья, это не ответ на Ваш вопрос, а просто комментарий к коду.
В этом коде:
Код
Private Sub CommandButton1_Click()
Dim objWrd As Object, objDoc As Object
    Dim objWrdDoc As Object
    On Error Resume Next
    Set objWrdApp = GetObject(, "Word.Application")
        If objWrdApp Is Nothing Then
            Set objWrdApp = CreateObject("Word.Application")
            Set objWrdDoc = objWrdApp.Documents.Open("C:\Слияние\Document.doc")
            objWrdApp.Visible = False
        End If
    Set objWrdDoc = objWrdApp.Documents.Open("C:\Слияние\Document.doc")
    Set objWrdDoc = Nothing
    Set objWrdApp = Nothing
End Sub
[свернуть]
вот эта строка:
Set objWrdDoc = objWrdApp.Documents.Open("C:\Слияние\Document.doc")

два раза выполняется. Нужно внести изменения в макрос, чтобы макрос делал логические действия или объясните, почему у Вас так.

Илья

Объяснить не смогу, код не мой, нашел на просторах интернета.
Возможно у вас есть другой код, подходящий для данной задачи?!

Илья

Получилось!
Спойлер
ThisWorkbook.FollowHyperlink Address:="C:\Document.doc", NewWindow:=True
[свернуть]
Через гиперссылку реализовал!

Илья

И сразу другой вопрос.
Как изменить код, чтобы порядковый номер на панели "Слияние" в Document.doc (см. приложение) был равным значению активной ячейки Excel из столбца: "Порядковый номер"?

[вложение удалено администратором]

Администратор

Илья, это не ответ на Ваш вопрос. Я просмотрел код, который Вы выложили. Я внёс изменения и вот такой код открывает Word-файл со слиянием:
Код
Private Sub CommandButton1_Click()

    'В константе нужно указать полное имя Word-документа.
    Const strDocFullName As String = "C:\Users\User\Desktop\Слияние\Document.doc"

    Dim objWrdApp As Object
    Dim objWrdDoc As Object
   
    'VBA-наименование уже запущенной программы "Word".
    'Включение обработчика ошибок, чтобы макрос не останавливался,
        'если будет ошибка. Ошибка возникнет, если не запущена программа "Word".
    On Error Resume Next
        Set objWrdApp = GetObject(Class:="Word.Application")
    'Отключение обработчика ошибок, чтобы отслеживать другие ошибки.
    On Error GoTo 0
   
    'Если программа "Word" не запущена.
    If objWrdApp Is Nothing Then
        'Запуск и VBA-наименование программы "Word".
        Set objWrdApp = CreateObject(Class:="Word.Application")
    End If
   
    'Открытие и VBA-наименование Word-документа.
    Set objWrdDoc = objWrdApp.Documents.Open(strDocFullName)
   
End Sub
[свернуть]
Вы будете пользоваться этим кодом или Вы хотите использовать код из ответа #5?

Илья

Код из ответа #5 будет временным, дабы не усложнять свою работу в таблице.
В последствии конечно буду пользоваться Вашим кодом.
Проверив код, я обнаружил, что после открытия Document.doc, панель "СЛИЯНИЕ" неактивна (см. вложение).

[вложение удалено администратором]

Администратор

Илья, не ответ на Ваш вопрос из ответа #8.
Внёс изменения в код, чтобы программа "Word" отображалась на мониторе.

Код
Private Sub CommandButton1_Click()

    'В константе нужно указать полное имя Word-документа.
    Const strDocFullName As String = "C:\Users\User\Desktop\Слияние\Document.doc"

    Dim objWrdApp As Object
    Dim objWrdDoc As Object
   
    'VBA-наименование уже запущенной программы "Word".
    'Включение обработчика ошибок, чтобы макрос не останавливался,
        'если будет ошибка. Ошибка возникнет, если не запущена программа "Word".
    On Error Resume Next
        Set objWrdApp = GetObject(Class:="Word.Application")
    'Отключение обработчика ошибок, чтобы отслеживать другие ошибки.
    On Error GoTo 0
   
    'Если программа "Word" не запущена.
    If objWrdApp Is Nothing Then
        'Запуск и VBA-наименование программы "Word".
        Set objWrdApp = CreateObject(Class:="Word.Application")
        'Отображение программы "Word" на мониторе.
        objWrdApp.Visible = True
    End If
   
    'Открытие и VBA-наименование Word-документа.
    Set objWrdDoc = objWrdApp.Documents.Open(strDocFullName)
   
End Sub
[свернуть]

Администратор

Илья, на некоторое время забудьте о программе "Excel". Сначала Вам надо будет получить код в программе "Word", а затем этот код надо будет перенести в программу "Excel".

После действий макроса из ответа #9 будет открыт Word-документ.
В программе "Word" включите макрорекордер и сделайте действия, которые решат Вашу задачу. Посмотрите, сформировал ли макрорекордер код.

Если сформировал, то попробуйте подставить этот код в код из ответа #9.

Администратор

Некоторые наблюдения.

Рассматривается программа "Word", программа "Excel" вообще не рассматривается сейчас.

Если открывать Word-документ, в котором есть слияние, с помощью макроса или вручную, появляется сообщение, предлагающее осуществить слияние, или не осуществить.

Если отказаться от слияния, то в документе не будет слияния. Это же делает и код из ответа #9.

Илья

Понял. "Потанцую" с Word-ом, посмотрим что получится.

Илья

Ваш код не менял. Макрорекордером записал код, который указывает ворду путь слияния с экселем и поставил его в автозапуск документа - Document.doc

Код
Private Sub Document_Open()
    ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    ActiveDocument.MailMerge.OpenDataSource Name:="C:\Слияние\База.xls", _
        ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
        AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
        WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
        Format:=wdOpenFormatAuto, Connection:= _
        "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\Слияние\База.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35;Jet " _
        , SQLStatement:="SELECT * FROM `Лист1$`", SQLStatement1:="", SubType:= _
        wdMergeSubTypeAccess
    ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
    WordBasic.MailMergeShadeFields
End Sub
[свернуть]

[вложение удалено администратором]

Администратор

Илья, в ответе #13 вопрос какой-то или Вы нашли решение и выложили решение?