Страницы: 1
RSS
Проблема с работой объекта word.application в новом 2016 офисе
 
Добрый день, столкнулся со следующей проблемой в 2016 офисе.

Есть макрос, выполняющий роль заполнялки документов по шаблону. Выполняется макрос из excel файлика, среди шаблонов есть Word документы, соответсвенно приходится в самом макросе оперировать с этими word объектами через Word.Application. Макрос корректно работал на версии офиса 2010 и младше. Сейчас установили 2016 офис и возникла проблема - при выполнении одной из строк кода возникает ошибка
Код
Run-Time Error 4605
Данная команда недоступна

Начальная инициализация
Код
Dim WordApp As Object

Set WordApp = CreateObject("Word.Application")
With WordApp
        .Visible = False
        .WindowState = wdWindowStateNormal
        .ScreenUpdating = False
End With
Проблемная функция
Код
Private Sub WordReplacement(word_selection As String, _
                            replacement_text As String, _
                            appobject As Object)
                             
    appobject .Application.Selection.Find.ClearFormatting
    appobject .Application.Selection.Find.Replacement.ClearFormatting

    With appobject.Application.Selection.Find
        .Text = word_selection
        .Replacement.Text = replacement_text
        appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll
    End With

Проблемная строка на которой светится ошибка 4605
Код
 appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Буду рад любой помощи
 
А на этой строке нет ошибки?
.WindowState = wdWindowStateNormal
точно? Зачем Вам позднее связывание, если внутри кода напихали констант ворда?
Советую ознакомиться: Как из Excel обратиться к другому приложению

проблема в том, что Excel ничего не знает о константах Word-а, в том числе и про эту: wdReplaceAll
Изменено: The_Prist - 02.09.2016 12:29:09
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist
Да, все верно, именно поэтому приходится в начале инициализировать экземпляр объекта Word.Application
.WindowState = wdWindowStateNormal - на эту строку не ругается
Инициализация объекта Word.Application идет в самом начале макроса. Если я убираю вот эту строку из кода
Код
appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll

То макрос выполняется без ошибок. Шаблон с Word документом сохраняется с нужным мне именем. Однако нужных мне замен в этом шаблоне не производится.

ПОдключенные библиотеки
 
Вместо констант пишите явно значение этих констант.
Код
Const wdReplaceAll = 2
    Member of Word.WdReplace
Изменено: Hugo - 02.09.2016 13:00:20
 
Проблема решена  - поменял формат шаблонов на .docx и переместил их с системного диска в документы пользователя.
 
Цитата
postrelll написал: Проблема решена
не хотите Вы прислушиваться и читать...Она обязательно может всплыть в другой раз. Т.к. библиотека Word 16 может не подхватиться на более ранних.
Сказать, почему макрос выполняется без ошибок? потому что все остальные переменные Word-а, возможно, тупо как 0 воспринимаются, т.к. директива Option Explicit не объявлена. И это тоже может повлечь свои ошибки.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist
Да, я понимаю значение директивы Option Explicit.
Макрос выполняется корректно и результат так же корректен.

Проблема была в "безопасном режиме" шаблона, который открывался. В моем случае макрос открывал шаблон из указанного пути. В шаблоне в цикле делал замены в нужные места документов и затем сохранял шаблон под определенным именем. Ошибка изначально была связана с тем, что при открытии шаблона в безопасном режиме его невозможно редактировать, соответственно и делать замены в нём так же нельзя. А этот безопасный режим появился только в 2016 офисе (возможно и в 2013 он так же есть), поскольку в 2010 все открывалось нормально в обычном режиме. Стоит так же сказать, что шаблоны были в .doc формате для лучшей совместимости с более старыми офисами, поскольку макросом пользуются на самых разных ПК. Из-за этого и выползала ошибка.

Плюс я изначально все шаблоны загонял в отдельную папку на диске С.  Учитывая, что макрос сейчас запускается из-под WIn 10, проблему так же создавала встроенная защита системы, поскольку она любит подтверждать через UAC все процедуры перезаписи/удаления. Поэтому и перенес папку с шаблонами в документы пользователя.
Изменено: postrelll - 02.09.2016 17:05:03
 
У меня была похожая проблема со вставкой неформатированных значений из ячеек в размеченные закладками места в Word. Ошибки периодически вылазили на этой строке:
Код
.Application.Selection.PasteAndFormat (wdFormatPlainText)

Перенос файла шаблона в папку шаблонов по умолчанию не помог. Насколько понимаю проблемы возникают при вызове функций Word из VBA, запущенном в Excel, но до конца в причинах я так и не разобрался. Заменил Copy/Paste на вставку значения текстовой переменной. Самое интересное, что один Selection.Copy / Selection.PasteAndFormat (wdFormatPlainText) в самом конце макроса работает корректно, но как только вставляю в макрос несколько - вылазят ошибки.
Код
Sub CreateLetter()
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Dim SaveAsName As String

Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Set wdDoc = wdApp.Documents.Add(Template:="C:\____.dotx", NewTemplate:=False, DocumentType:=0)

With wdDoc
       
    Text = Cells(6, 2).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Должность"
    .Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Application.Selection.InsertAfter (Text)
       
    Text = Cells(6, 1).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Организация"
    .Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Application.Selection.InsertAfter (Text)

    Text = Cells(6, 3).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Кому"
    .Application.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(6, 4).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Обращение"
    .Application.Selection.InsertAfter (Text)
           
    Text = Cells(2, 11).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Должность_подписант"
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(2, 10).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Подписант"
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(1, 10).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Исполнитель"
    .Application.Selection.InsertAfter (Text)
    
    Text = Cells(1, 11).Text
    .Application.Selection.Goto wdGoToBookmark, , , "Телефон"
    .Application.Selection.InsertAfter (Text)
    
    ActiveSheet.PivotTables("Заезжающие").PivotSelect _
        "'[#Inbox люди].[Фамилия Имя Отчество].[Фамилия Имя Отчество]'[All]", _
        xlLabelOnly + xlFirstRow, True
    Selection.Copy
    .Application.Selection.Goto wdGoToBookmark, , , "Список"
    .Application.Selection.PasteAndFormat (wdFormatPlainText)
    
    .SaveAs2 Filename:=("D:\_______ & Format(Now, "yyyy-mm-dd hh-mm-ss") & ".docx"), _
    FileFormat:=wdFormatXMLDocument, AddtoRecentFiles:=False
    
    .Close
End With

wdApp.Quit

End Sub
Изменено: Сергей Редькин - 19.01.2022 10:39:43
Страницы: 1
Читают тему
Наверх