Dim app as word application ошибка

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

#1

02.09.2016 12:23:58

Добрый день, столкнулся со следующей проблемой в 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

Буду рад любой помощи

 

The_Prist

Пользователь

Сообщений: 14264
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

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

Как из Excel обратиться к другому приложению

проблема в том, что Excel ничего не знает о константах Word-а, в том числе и про эту: wdReplaceAll

Изменено: The_Prist02.09.2016 12:29:09

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

#3

02.09.2016 12:43:05

The_Prist
Да, все верно, именно поэтому приходится в начале инициализировать экземпляр объекта Word.Application
.WindowState = wdWindowStateNormal — на эту строку не ругается
Инициализация объекта Word.Application идет в самом начале макроса. Если я убираю вот эту строку из кода

Код
appobject .Application.Selection.Find.Execute Replace:=wdReplaceAll

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

ПОдключенные библиотеки

 

Hugo

Пользователь

Сообщений: 23371
Регистрация: 22.12.2012

#4

02.09.2016 12:48:58

Вместо констант пишите явно значение этих констант.

Код
Const wdReplaceAll = 2
    Member of Word.WdReplace

Изменено: Hugo02.09.2016 13:00:20

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

Проблема решена  — поменял формат шаблонов на .docx и переместил их с системного диска в документы пользователя.

 

The_Prist

Пользователь

Сообщений: 14264
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

02.09.2016 13:51:39

Цитата
postrelll написал: Проблема решена

не хотите Вы прислушиваться и читать…Она обязательно может всплыть в другой раз. Т.к. библиотека Word 16 может не подхватиться на более ранних.
Сказать, почему макрос выполняется без ошибок? потому что все остальные переменные Word-а, возможно, тупо как 0 воспринимаются, т.к. директива Option Explicit не объявлена. И это тоже может повлечь свои ошибки.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

postrelll

Пользователь

Сообщений: 7
Регистрация: 28.03.2016

The_Prist
Да, я понимаю значение директивы Option Explicit.
Макрос выполняется корректно и результат так же корректен.

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

Плюс я изначально все шаблоны загонял в отдельную папку на диске С.  Учитывая, что макрос сейчас запускается из-под WIn 10, проблему так же создавала встроенная защита системы, поскольку она любит подтверждать через UAC все процедуры перезаписи/удаления. Поэтому и перенес папку с шаблонами в документы пользователя.

Изменено: postrelll02.09.2016 17:05:03

 

Сергей Редькин

Пользователь

Сообщений: 1
Регистрация: 11.07.2021

#8

19.01.2022 08:58:23

У меня была похожая проблема со вставкой неформатированных значений из ячеек в размеченные закладками места в 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

  • Remove From My Forums
  • Вопрос

  • Здравствуйте!

    Подскажите в чем ошибка. пытаюсь сделать в форме кнопку при нажатии которой должен открыться документ в Word.

    при нажатии появляется ошибка «Compile error: User defined — type not defined»  и выделяется строчка

    Code Snippet

      Dim app As Word.Application

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

      Спасибо за помощь, заранее!

Ответы

  • В редакторе VB выберите Tools->References и в открывшемся окне поставьте галку напротив Microsoft Word <версия>

Несмотря на интенсивный поиск в Google, я не могу понять, что в этом не так. Я все еще пропускаю ссылку или что-то в этом роде? Если вы видите, в чем ошибка, я буду вечно благодарен!

Рекомендации:

  • Visual Basic для приложений
  • Библиотека объектов Microsoft Excel 16.0
  • OLE автоматизация
  • Библиотека объектов Microsoft Office 16.0
  • RefEdit Control
  • Библиотека объектов Microsoft Word 16.0

Переменные:

Public appWord As Word.Application
Public sapmWord As Word.Document

Dim asNimi As String 'in this current sub

Код:

On Error Resume Next

Set appWord = GetObject(, "Word.Application")
If Err <> 0 Then
    Set appWord = CreateObject("Word.Application")
End If
On Error GoTo 0
appWord.Visible = True
Set sapmWord = appWord.documents.Open("C:ThisIsWorkingandDocOpens.docx")
'sapmWord.Activate 'doesn't make a difference

With sapmWord
    Selection.EndKey Unit = wdStory 'this line is first line to give an error. With or without a dot in the beginning of line.
    Selection.TypeText Text:=asNimi 'this line too, if previous is commented
'...and so on!
End With

sapmWord.Close savechanges:=True
Set appWord = Nothing
Set sapmWord = Nothing


Ответы
4

Чтобы использовать With, вы должны ссылаться на участников с .:

With sapmWord
    .Selection.EndKey Unit = wdStory
    .Selection.TypeText Text:=asNimi
End With

SapmWord — это текстовый документ. Текстовый документ не имеет метода selection. Он есть в объекте приложения Word, так что, вероятно, вы имеете в виду (и да, вам нужен ‘.’)

With appWord 
    .Selection.EndKey Unit:= wdStory 
    .Selection.TypeText Text:=asNimi 
    '...and so on!
End With

В конце концов, мне ничего не оставалось, как добавить закладки в документ Word и заполнить их VBA. Я до сих пор не понимаю, почему эти исходные коды не работали в моем коде, хотя они работают для других. Спасибо всем за помощь, может быть, кто-то еще получит здесь ответы.

Вам необходимо изменить sapmWord.Close savechanges: = True для appWord.quit savechanges: = True

Другие вопросы по теме

    Option Explicit

    Dim appWord As Word.Application

    Dim docWord As Word.Document

    Dim i As Integer

    Private Sub cmdStep1_Click()

    If appWord.Documents.Count = 0 Then

        Set docWord = appWord.Documents.Add

    End If

    Call InsertTable

    End Sub

    Private Sub cmdStep2_Click()

    If appWord.Documents.Count = 0 Then

        MsgBox «Run step 1, then step2.»

    Else

        Call InsertTable

    End If

    End Sub

    Private Sub cmdQuit_Click()

    Unload Me

    End Sub

    Private Sub Form_Load()

    Set appWord = New Word.Application

    appWord.Visible = False

    i = 1

    End Sub

    Sub InsertTable()

    Dim rngCurrent As Word.Range

    Dim objTable As Word.Table

    docWord.PageSetup.LeftMargin = 60

    Set rngCurrent = docWord.Range

    With rngCurrent

        .InsertParagraphAfter

        .Collapse Direction:=wdCollapseEnd

        .Text = «Table No. » & CStr(i) & «: TableName»

        i = i + 1

        .Font.Name = «Times New Roman»

        .Font.Size = 14

        .Font.Italic = True

        .ParagraphFormat.Alignment = wdAlignParagraphLeft

    End With

    Set rngCurrent = docWord.Range

    With rngCurrent

        .InsertParagraphAfter

        .Collapse Direction:=wdCollapseEnd

    End With

    Set objTable = docWord.Tables.Add(Range:=rngCurrent, NumRows:=4, NumColumns:=15)

    With objTable

        .Borders.Enable = True

        .Rows.Height = 10

        .Columns(1).Width = CentimetersToPoints(1.04)

        .Columns(2).Width = CentimetersToPoints(2.33)

        .Columns(3).Width = CentimetersToPoints(1.06)

        .Columns(4).Width = CentimetersToPoints(1.16)

        .Columns(5).Width = CentimetersToPoints(1.16)

        .Columns(6).Width = CentimetersToPoints(1.06)

        .Columns(7).Width = CentimetersToPoints(1.06)

        .Columns(8).Width = CentimetersToPoints(1.47)

        .Columns(9).Width = CentimetersToPoints(1.69)

        .Columns(10).Width = CentimetersToPoints(1.07)

        .Columns(11).Width = CentimetersToPoints(1.07)

        .Columns(12).Width = CentimetersToPoints(1.07)

        .Columns(13).Width = CentimetersToPoints(1.07)

        .Columns(14).Width = CentimetersToPoints(1.2)

        .Columns(15).Width = CentimetersToPoints(1.2)

    End With

    appWord.Visible = True

    End Sub

    Private Sub Form_Unload(Cancel As Integer)

    If docWord Is Nothing Then

        appWord.Quit wdDoNotSaveChanges

        Set appWord = Nothing

        Exit Sub

    End If

    If docWord.Saved Then

        docWord.Close wdDoNotSaveChanges

        Set docWord = Nothing

        appWord.Quit wdDoNotSaveChanges

        Set appWord = Nothing

    Else

        MsgBox «Save changes before quit.»

        Cancel = True

    End If

    End Sub

Здравствуйте, друзья! Столкнулся с такой проблемой — сделал простенькую базу в Access 2007 (mdb) в которой хранится список литературы. В базе форма с парой окон для отображения содержимого записи и кнопка «Вставить» при нажатии которой, название выбранной книги вставляется в открытый (активный) документ Word. Реализовал я сию процедуру таким образом:

Visual Basic
1
2
3
4
5
6
7
8
Private Sub InsertToWord_Click()
Dim AppWord As Word.Application
 
Set AppWord = Word.Application
 
AppWord.ActiveWindow.Selection.TypeText Text:=[Название]
 
Exit Sub

Ну соответственно подключил библиотеку Вордовскую.
И все вроде работает, да нет-нет, при попытке экспортировать текст в только что открытый документ выдает такую ошибку:
Run-time error ‘462’
The remote server machine does not exist or unavailable

И исчезает она либо после двух-трех нажатий сама, либо после перезапуска базы данных.
Пробовал без создания объекта Word.Application — та же история. Пробовал создавать объект при помощи CreateObject — пишет человечьм (русским) языком, мол ни один документ не открыт, при этом в действительности открытый документ я лицезрею своими глазами…
Причем, абсолютно та же картина при попытке повторить трюк из Excel.
Как с этим бороться ума не приложу! Может кто подскажет?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

I am trying to do some relatively simple copy and pasting from Excel 2007 into Word 2007. I’ve looked through this site and others, and keep getting hung up on the same thing- the third line n the code below keeps giving me the «User type note defined» error msg. I am really confused since I just lifted this from another solution (and had similar issues with other solutions I tried to lift). Could someone please educate me on what is causing the error, and why?

Sub ControlWord()
' **** The line below gives me the error ****
Dim appWD As Word.Application
' Create a new instance of Word & make it visible
Set appWD = CreateObject("Word.Application.12")
appWD.Visible = True

'Find the last row with data in the spreadsheet
FinalRow = Range("A9999").End(xlUp).Row
For i = 1 To FinalRow
    ' Copy the current row
    Worksheets("Sheet1").Rows(i).Copy
    ' Tell Word to create a new document
    appWD.Documents.Add
    ' Tell Word to paste the contents of the clipboard into the new document
    appWD.Selection.Paste
    ' Save the new document with a sequential file name
    appWD.ActiveDocument.SaveAs Filename:="File" & i
    ' Close this new word document
    appWD.ActiveDocument.Close
Next i
' Close the Word application
appWD.Quit
End Sub

SeanC's user avatar

SeanC

15.6k5 gold badges45 silver badges65 bronze badges

asked Jul 30, 2012 at 20:13

Tommy Z's user avatar

3

This answer was mentioned in a comment by Tim Williams.

In order to solve this problem, you have to add the Word object library reference to your project.

Inside the Visual Basic Editor, select Tools then References and scroll down the list until you see Microsoft Word 12.0 Object Library. Check that box and hit Ok.

From that moment, you should have the auto complete enabled when you type Word. to confirm the reference was properly set.

Community's user avatar

answered Jul 1, 2013 at 19:24

ForceMagic's user avatar

ForceMagicForceMagic

6,19012 gold badges66 silver badges88 bronze badges

2

As per What are the differences between using the New keyword and calling CreateObject in Excel VBA?, either

  • use an untyped variable:

    Dim appWD as Object
    appWD = CreateObject("Word.Application")
    

or

  • Add a reference to Microsoft Word <version> Object Library into the VBA project via Tools->References..., then create a typed variable and initialize it with the VBA New operator:

    Dim appWD as New Word.Application
    

    or

    Dim appWD as Word.Application
    <...>
    Set appWd = New Word.Application
    
    • CreateObject is equivalent to New here, it only introduces code redundancy

A typed variable will give you autocomplete.

answered Sep 1, 2017 at 17:27

ivan_pozdeev's user avatar

ivan_pozdeevivan_pozdeev

33.5k17 gold badges105 silver badges150 bronze badges

Форумы

Минимизировать
 Ошибка типа The remote server machine does not exist or is unavailable при выводе в Word
 
 02.07.2011 14:27:45

Добрый день!

на основе кода по » Создание документа Word по шаблону» http://www.leadersoft.ru/Rus/help/code/Default.aspx?go=product&ProductID=11875
мною создан код выводящий отчет из нескольких таблиц и данных. Отчеты типовые и вывод нужно производить многократно из Формы, содержащей список отчетов.

При однократном созданни документа в MsWord, код создает файл MsWord заполняя его необходимыми данными и сохраняет его.
При повторном созданни документа в MsWord из открытой формы, код создает файл MsWord, но уже не заполняет его необходимыми данными,
MsWord отображает только пустой шаблон.
Access выдают надпись «The remote server machine does not exist or is unavailable»

повторно можно создать документ MsWord только перезагрузив БД или, НЕ перезагрузив БД, если в коде сознательно сделать ошибку в самом конце кода, добавив строку, прирывающую выполнения кода

например, когда появляется окно

«Object variable or with block variable not set»
далее OK, Debug ( попадаем в редактирование кода ), закрываем код

мой код заканчивается строками следующими строками:

With app.ActiveDocument
.Saved = True
End With

Set rng = Nothing
Set tbl = Nothing
Set app = Nothing

app.Quit
Err.Clear

Exit Sub
999:
MsgBox Err.Description ‘Ошибка
Err.Clear
app.Quit
End Sub

Как я понял это распространненая проблема «The remote server machine does not exist or is unavailable», но как ее разрешить эту проблему — не могу понять.

Есть предложения по ее решению ?

С уважением,
Василий

 02.07.2011 20:32:37

Проблема заключается в создании ссылок на объекты, т.е. необходимо освобождать переменные Set Word =  Nothing и в коде указывать полный путь до приложения. Например, Вы ссылаетесь на Selection, то лучше будет oWord.Selection или ActiveWindow то надо писать oWord.ActiveWindow. Права доступа надо проверить.

 03.07.2011 14:24:25

[QUOTE]Admin1написал

Проблема заключается в создании ссылок на объекты, т.е. необходимо освобождать переменные Set Word =  Nothing и в коде указывать полный путь до приложения.

в начале кода я присваиваю переменной app

Dim app As Word.Application
Set app = New Word.Application ‘Новое приложение Word

в конце кода освобождаю переменную app
Set app = Nothing

Все верно ?

 Admin1написал «в коде указывать полный путь до приложения

Вопрос: Как указать в коде путь к приложению ?

Например, Вы ссылаетесь на Selection, то лучше будет oWord.Selection или ActiveWindow то надо писать oWord.ActiveWindow. Права доступа надо проверить.

В Вашем примере, как я понимаю oWord, то же самое что аpp если у меня в коде
Dim app As Word.Application
Верно ?

С уважением, Василий

 03.07.2011 19:09:28

1. Да. Желательно очень аккуратно работать с переменными, т.е. надо закрывать doc файл (close), выходить из приложения app.quit и каждый раз уничтожать переменные присваивая им значение Nothing.

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

3. Вообще каких-то проблем при работе с несколькими документами Word из Access незамечено. У Вас какой-то особенный случай.

john.9.williams


  • #1

Hi

I am using this daclaration in a program

«Dim Appword As word.application»

when i run my program i get this error assigned to this

«Compile error userdefined type not defined»

I know i have to do something but not sure what, any help greatly
received

Johny

Advertisements

AA2e72E


  • #2

Use:

Set AppWord=CreateObject(«Word.Application»)

OR:

Add the Word object library reference to your project

Bob Phillips


  • #3

Have you created a reference to the Word type library? Go to
Tools>References, scroll down to Microsoft Word, and check it.

Bob Phillips


  • #4

AA2e72E said:

Use:

Set AppWord=CreateObject(«Word.Application»)

You would also need

Dim AppWord As Object

john.9.williams


  • #5

Where would i use the Set appWord = CreateObject(«Word.Application»)
syntax

Harald Staff


Advertisements

Bob Phillips


  • #7

You would do that instead of

Set AppWord = New Word.Application

but note my other post.

HTH

RP
(remove nothere from the email address if mailing direct)

Tom Ogilvy


Advertisements

Chip Pearson


  • #9

You need to set a reference to the Word object library. In VBA,
go to the Tools menu, choose References, and scroll down to
Microsoft Word. Check that box.


Cordially,
Chip Pearson
Microsoft MVP — Excel
Pearson Software Consulting, LLC
www.cpearson.com

Want to reply to this thread or ask your own question?

You’ll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.


Ask a Question

Понравилась статья? Поделить с друзьями:
  • Diiregisterserver код ошибки 0x80004005
  • Digora код ошибки 10
  • Digma ошибка сим карты
  • Digma ошибка диска
  • Digma 201 ошибка подключения к сети