И снова здравствуйте, Господа!
Настроено слияние данных 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 вопрос какой-то или Вы нашли решение и выложили решение?
Ну Вы предложили "поколдовать" макрорекордером в Word-де...
Вот я и выложил рабочий вариант.
Код, находящийся в Excel, открывает Document.doc, а код в Word запускает слияние...