Проблемы
При запуске кода Microsoft Visual Basic, использующего автоматизацию для управления microsoft Word, может появиться одно из следующих сообщений об ошибке:
Сообщение об ошибке 1
Ошибка времени выполнения «-2147023174» (800706ba)
Ошибка автоматизации
Сообщение об ошибке 2
Ошибка времени выполнения «462»: удаленный сервер не существует или недоступен
Причина
Visual Basic установил ссылку на Word из-за строки кода, которая вызывает объект, метод или свойство Word, не квалифицируя его с помощью Word объектной переменной. Visual Basic не выпускает эту ссылку до завершения программы. Эта неправданная ссылка вмешивается в код автоматизации, когда код выполняется более одного раза.
Решение
Измените код так, чтобы каждый вызов объекта, метода или свойства Word был квалифицирован с помощью соответствующей объектной переменной.
Статус
Такое поведение является особенностью данного продукта.
Дополнительная информация
Чтобы автоматизировать Word, необходимо установить переменную объекта, которая обычно ссылается на объект Word Application или Document. Затем можно задать другие переменные объекта для ссылки на объект Selection, Range или другие объекты в Word объектной модели. При написании кода для использования объекта, метода или свойства Word следует всегда перед вызовом использовать соответствующую переменную объекта. В противном случае Visual Basic использует ссылку на скрытую глобальную переменную, которую он задает для текущего запущенного экземпляра. Если Word завершено или объявленная переменная объекта освобождена, скрытая глобальная переменная будет ссылаться на недопустимый (уничтоженный) объект. При повторном запуске кода автоматизации вызовы этой переменной скрытого объекта завершатся ошибкой, указанной выше.
Ниже показано, как воспроизвести эту проблему и как ее устранить.
Действия по воспроизведению поведения
-
Запустите новый проект EXE уровня «Стандартный» в Visual Basic. Форма Form1 создается по умолчанию.
-
Выберите ссылки в меню Проект , а затем выберите один из следующих параметров:
-
Для Office Word 2007 щелкните Библиотека объектов Microsoft Word 12.0.
-
Для Word 2003 щелкните Библиотека объектов Microsoft Word 11.0.
-
Для Word 2003 щелкните Библиотека объектов Microsoft Word 10.0.
-
Для Word 2000 щелкните Библиотека объектов Microsoft Word 9.0.
-
Для Word 97 щелкните Библиотека объектов Microsoft Word 8.0.
-
-
Поместите элемент CommandButton в Form1.
-
Скопируйте следующий код в окно кода Формы 1:
Option Explicit Private Sub Command1_Click() Dim oWord As Word.Application Dim oDoc As Word.Document Dim oRange as Word.Range Set oWord = CreateObject("Word.Application") With oWord .Visible = True .Activate .WindowState = wdWindowStateNormal End With Set oDoc = oWord.Documents.Add MsgBox "Document open", vbMsgBoxSetForeground With oDoc .PageSetup.LeftMargin = InchesToPoints(1.25) End With ' This example inserts text at the end of section one. Set oRange = ActiveDocument.Sections(1).Range With oRange .MoveEnd Unit:=wdCharacter, Count:= -1 .Collapse Direction:=wdCollapseEnd .InsertParagraphAfter .InsertAfter "End of section." End With With oDoc .Saved = True End With Set oRange = Nothing Set oDoc = Nothing oWord.Quit Set oWord = Nothing End Sub
-
В меню Выполнить щелкните Пуск или нажмите клавишу F5, чтобы запустить программу.
-
Щелкните Элемент CommandButton. Ошибка не возникает. Однако ссылка на Word создана и не выпущена.
-
Еще раз щелкните Элемент CommandButton и обратите внимание, что вы получили сообщение об ошибке, описанной ранее.
Примечание. Ошибка возникает из-за того, что код ссылается на метод InchesToPoints без предварительного вызова с помощью объектной переменной oWord.
-
Остановите проект и измените следующую строку:
.PageSetup.LeftMargin = InchesToPoints(1.25)
.PageSetup.LeftMargin = oWord.InchesToPoints(1.25)
-
Запустите программу еще раз. Затем щелкните элемент CommandButton. Ошибка не возникает.
-
Снова щелкните Элемент CommandButton и обратите внимание, что появится сообщение об ошибке.
Примечание. Ошибка возникает из-за того, что код ссылается на объект ActiveDocument Section one’s Range без предварительного вызова с переменной объекта oWord.
-
Остановите проект и измените следующую строку:
Set oRange = ActiveDocument.Sections(1).Range
-Кому-
Set oRange = oWord.ActiveDocument.Sections(1).Range
-
Запустите программу еще раз. Обратите внимание, что код можно выполнить несколько раз без ошибок.
Если при создании проекта Visual Basic, автоматичного Word, если в проекте есть ссылка на библиотеку объектов Microsoft Word, пример кода для объектов, методов и свойств объектной модели Word доступен в файле справки Word. Когда курсор находится над ключевым словом в коде, вы увидите любой применимый текст справки, нажав клавишу F1.
Примером кода в разделе справки будет код microsoft Word Visual Basic для приложений. В нем не будут отображаться ссылки на объекты, необходимые для кода Visual Basic. Необходимо добавить квалификаторы соответствующим образом.
Ссылки
Дополнительные сведения см. в следующих статьях базы знаний Майкрософт:
178510 PRB: сбой метода автоматизации Excel объекта «_Global»
Чтобы получить дополнительные сведения об автоматизации приложений Office, щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:
Общие сведения об объектной модели Word
Нужна дополнительная помощь?
Нужны дополнительные параметры?
Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.
В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.
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
15.7k5 gold badges45 silver badges67 bronze badges
asked Jul 30, 2012 at 20:13
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.
answered Jul 1, 2013 at 19:24
ForceMagicForceMagic
6,23012 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 viaTools->References...
, then create a typed variable and initialize it with the VBANew
operator:Dim appWD as New Word.Application
or
Dim appWD as Word.Application <...> Set appWd = New Word.Application
CreateObject
is equivalent toNew
here, it only introduces code redundancy
A typed variable will give you autocomplete.
answered Sep 1, 2017 at 17:27
ivan_pozdeevivan_pozdeev
34k19 gold badges107 silver badges152 bronze badges
- Remove From My Forums
-
Question
-
I have 2 different word files (both .docx) , one with one page another one with 2 pages.
My user selects the file to be one-page or 2-page , then My app writes some content to the word file and prints it with bellow code :
Dim oWord As Word.Application Dim oDoc As Word.Document oWord = CreateObject("Word.Application") oWord.Visible = False If twopageword.Checked = true Then ' Checkbox oDoc = oWord.Documents.Add(Application.StartupPath & "\twopageword.docx") Else oDoc = oWord.Documents.Add(Application.StartupPath & "\onepageword.docx") End If oDoc.Bookmarks.Item("text1").Range.Text = textbox1.text
oDoc.Bookmarks.Item("text2").Range.Text = textbox2.text Dim p As New PrintDialog
If p.ShowDialog = Windows.Forms.DialogResult.OK Then
oWord.WordBasic.FilePrintSetup(Printer:=p.PrinterSettings.PrinterName, DoNotSetAsSysDefault:=1)
oWord.PrintOut(False)
oWord.Quit(False)
oWord = Nothing
end if
The problem is that regardless to the checkbox , it always prints the file with 2 pages!
What’s the matter ?
-
Edited by
Tuesday, March 6, 2018 11:43 PM
-
Edited by
Answers
-
So were you able to determine that the correct document is always printing out, and not just twopageword.docx. Could there be enough content being inserted that causes an automatic page break, regardless of which document is used? Keep in mind that Word
will cause a page break to occur automatically if there is sufficient content to warrant it.Perhaps you want Word.Application.Documents.Open instead of Add?
Paul ~~~~ Microsoft MVP (Visual Basic)
-
Marked as answer by
Kevin993
Wednesday, March 7, 2018 4:28 PM
-
Marked as answer by
Summary
When you use the New operator or the CreateObject function in Microsoft Visual Basic to create an instance of a Microsoft Office application, you may receive the following error message:
Run-time error ‘429’: ActiveX component can’t create object
This error occurs when the Component Object Model (COM) cannot create the requested Automation object, and the Automation object is, therefore, unavailable to Visual Basic. This error does not occur on all computers.
This article describes how to diagnose and resolve common problems that may cause this error.
More Information
In Visual Basic, there are several causes of error 429. The error occurs if any of the following conditions is true:
-
There is a mistake in the application.
-
There is a mistake in the system configuration.
-
There is a missing component.
-
There is a damaged component.
To find the cause of the error, isolate the problem. If you receive the «429» error message on a client computer, use the following information to isolate and resolve the error in Microsoft Office applications.
Note Some of the following information may also apply to non-Office COM servers. However, this article assumes that you want to automate Office applications.
Examine the code
Before you troubleshoot the error, try to isolate a single line of code that may be causing the problem.
If you discover that a single line of code may be causing the problem, complete these procedures:
-
Make sure that the code uses explicit object creation.
Problems are easier to identify if they are narrowed down to a single action. For example, look for implicit object creation that’s used as one of the following.
Code sample 1
Application.Documents.Add 'DON'T USE THIS!!
Code sample 2
Dim oWordApp As New Word.Application 'DON'T USE THIS!! '... some other code oWordApp.Documents.Add
Both of these code samples use implicit object creation. Microsoft Office Word 2003 does not start until the variable is called at least one time. Because the variable may be called in different parts of the program, the problem may be difficult to locate. It may be difficult to verify that the problem is caused when the Application object is created or when the Document object is created.
Instead, you can make explicit calls to create each object separately, as follows.
Dim oWordApp As Word.Application Dim oDoc As Word.Document Set oWordApp = CreateObject("Word.Application") '... some other code Set oDoc = oWordApp.Documents.Add
When you make explicit calls to create each object separately, the problem is easier to isolate. This may also make the code easier to read.
-
Use the CreateObject function instead of the New operator when you create an instance of an Office application.
The CreateObject function closely maps the creation process that most Microsoft Visual C++ clients use. The CreateObject function also permits changes in the CLSID of the server between versions. You can use the CreateObject function with early-bound objects and with late-bound objects.
-
Verify that the «ProgID» string that is passed to
CreateObject is correct, and then verify that the «ProgID» string is version independent. For example, use the «Excel.Application» string instead of using the «Excel.Application.8» string. The system that fails may have an older version of Microsoft Office or a newer version of Microsoft Office than the version that you specified in the «ProgID» string. -
Use the Erl command to report the line number of the line of code that does not succeed. This may help you debug applications that cannot run in the IDE. The following code tells you which Automation object cannot be created (Microsoft Word or Microsoft Office Excel 2003):
Dim oWord As Word.Application Dim oExcel As Excel.Application On Error Goto err_handler 1: Set oWord = CreateObject("Word.Application") 2: Set oExcel = CreateObject("Excel.Application") ' ... some other code err_handler: MsgBox "The code failed at line " & Erl, vbCritical
Use the MsgBox function and the line number to track the error.
-
Use late-binding as follows:
Dim oWordApp As Object
Early-bound objects require their custom interfaces to be marshaled across process boundaries. If the custom interface cannot be marshaled during CreateObject or during New, you receive the «429» error message. A late-bound object uses the IDispatch system-defined interface that does not require a custom proxy to be marshaled. Use a late-bound object to verify that this procedure works correctly.
If the problem occurs only when the object is early-bound, the problem is in the server application. Typically, you can reinstall the application as described in the «Examine the Automation Server» section of this article to correct the problem.
Examine the automation server
The most common reason for an error to occur when you use CreateObject or New is a problem that affects the server application. Typically, the configuration of the application or the setup of the application causes the problem. To troubleshoot, use following methods:
-
Verify that the Office application that you want to automate is installed on the local computer. Make sure that you can run the application. To do this, click Start, click
Run, and then try to run the application. If you cannot run the application manually, the application will not work through automation. -
Re-register the application as follows:
-
Click Start, and then click Run.
-
In the Run dialog box, type the path of the server, and then append /RegServer to the end of the line.
-
Click OK.
The application runs silently. The application is re-registered as a COM server.
If the problem occurs because a registry key is missing, these steps typically correct the problem.
-
-
Examine the LocalServer32 key under the CLSID for the application that you want to automate. Make sure that the LocalServer32 key points to the correct location for the application. Make sure that the path name is in a short path (DOS 8.3) format. You do not have to register a server by using a short path name. However, long path names that include embedded spaces may cause problems on some systems.
To examine the path key that is stored for the server, start the Windows Registry Editor, as follows:
-
Click Start, and then click Run.
-
Type regedit, and then click OK.
-
Move to the HKEY_CLASSES_ROOTCLSID key.
The CLSIDs for the registered automation servers on the system are under this key.
-
Use the following values of the CLSID key to find the key that represents the Office application that you want to automate. Examine the LocalServer32 key of the CLSID key for the path.
Office server
CLSID key
Access.Application
{73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}
Excel.Application
{00024500-0000-0000-C000-000000000046}
Outlook.Application
{0006F03A-0000-0000-C000-000000000046}
PowerPoint.Application
{91493441-5A91-11CF-8700-00AA0060263B}
Word.Application
{000209FF-0000-0000-C000-000000000046}
-
Check the path to make sure that it matches the actual location of the file.
Note Short path names may seem correct when they are not correct. For example, both Office and Microsoft Internet Explorer (if they are installed in their default locations) have a short path that is similar to C:PROGRA~1MICROS~X (where
X is a number). This name may not initially appear to be a short path name.To determine whether the path is correct, follow these steps:
-
Click Start, and then click Run.
-
Copy the value from the registry, and then paste the value in the Run dialog box.
Note Remove the /automation switch before you run the application.
-
Click OK.
-
Verify that the application runs correctly.
If the application runs after you click OK, the server is registered correctly. If the application does not run after you click OK, replace the value of the LocalServer32 key with the correct path. Use a short path name if you can.
-
-
Test for possible corruption of the Normal.dot template or of the Excel.xlb resource file. Problems may occur when you automate Microsoft Word or Microsoft Excel if either the Normal.dot template in Word or the Excel.xlb resource file in Excel is corrupted. To test these files, search the local hard disks for all instances of Normal.dot or of Excel.xlb.
Note You may find multiple copies of these files. There is one copy of each of these files for each user profile that is installed on the system.
Temporarily rename the Normal.dot files or the Excel.xlb files, and then rerun your automation test. Word and Excel both create these files if they cannot find them. Verify that the code works. If the code works when a new Normal.dot file is created, delete the files that you renamed. These files are corrupted. If the code does not work, you must revert these files to their original file names to save any custom settings that are saved in these files.
-
Run the application under the Administrator account. Office servers require Read/Write access to the registry and to the disk drive. Office servers may not load correctly if your current security settings deny Read/Write access.
Examine the system
System configuration may also cause problems for the creation of out-of-process COM servers. To troubleshoot, use the following methods on the system on which the error occurs:
-
Determine whether the problem occurs with any out-of-process server. If you have an application that uses a particular COM server (such as Word), test a different out-of-process server to make sure that the problem is not occuring in the COM layer itself. If you cannot create an out-of-process COM server on the computer, reinstall the OLE system files as described in the «Reinstalling Microsoft Office» section of this article, or reinstall the operating system to resolve the problem.
-
Examine the version numbers for the OLE system files that manage automation. These files are typically installed as a set. These files must match build numbers. An incorrectly configured setup utility can mistakenly install the files separately. This causes the files to be mismatched. To avoid problems in automation, examine the files to make sure that the files builds are matched.
The automation files are located in the WindowsSystem32 directory. Examine the following files.
File name
Version
Date modified
Asycfilt.dll
10.0.16299.15
September 29, 2017
Ole32.dll
10.0.16299.371
March 29, 2018
Oleaut32.dll
10.0.16299.431
May 3, 2018
Olepro32.dll
10.0.16299.15
September 29, 2017
Stdole2.tlb
3.0.5014
September 29, 2017
To examine the file version, right-click the file in Windows Explorer, and then click Properties. Note the last four digits of the file version (the build number) and the date that the file was last modified. Make sure that these values are the same for all the automation files.
Note The following files are for Windows 10 Version 1709, build 16299.431. These numbers and dates are examples only. Your values may be different.
-
Use the System Configuration utility (Msconfig.exe) to examine the services and system startup for third-party applications that might restrict running code in the Office application
Note Disable the antivirus program only temporarily on a test system that is not connected to the network.
Alternatively, follow these steps in Outlook to disable third-party add-ins:
If this method resolves the problem, contact the third-party antivirus vendor for more information about an update to the antivirus program.
-
On the File menu, click Options, and then click Add-ins.
-
Click Manage COM add-ins, and then click Go.
Note The COM add-ins dialog box opens.
-
Clear the check box for any third-party add-in, and then click OK.
-
Restart Outlook.
-
Reinstall Office
If none of the previous procedures resolve the problem, remove and then reinstall Office.
For more information, see the following Office article:
Download and install or reinstall Office 365 or Office 2016 on a PC or Mac
References
For more information about Office automation and code samples, go to the following Microsoft website:
Getting started with Office development
Формулировка задачи:
user-defined type not defined — эта ошибка возникает тогда из Excel должен создаться документ отчета у Word, а при запуске на исполнение на первой строчке нижнего примера возникает ошибка.
Вот фрагмент (сам код большой и это пример из книжки). Помогите пожалуйста разобраться в чем ошибка и как ее устранить?
Заранее благодарна!!!
Код к задаче: «Как устранить ошибку: «user-defined type not defined»?»
textual
Dim oWord As New Word.Application oWord.Visible = True
Полезно ли:
6 голосов , оценка 4.833 из 5