nataxa777 0 / 0 / 0 Регистрация: 14.11.2012 Сообщений: 26 |
||||
1 |
||||
07.06.2013, 14:12. Показов 41124. Ответов 3 Метки нет (Все метки)
user-defined type not defined — эта ошибка возникает тогда из Excel должен создаться документ отчета у Word, а при запуске на исполнение на первой строчке нижнего примера возникает ошибка.
Заранее благодарна!!!
__________________
0 |
Pavel55 971 / 353 / 135 Регистрация: 27.10.2006 Сообщений: 764 |
||||
07.06.2013, 15:51 |
2 |
|||
1 |
0 / 0 / 0 Регистрация: 14.11.2012 Сообщений: 26 |
|
07.06.2013, 16:09 [ТС] |
3 |
Pavel55, спасибо Вам огромное!!! все получилось
0 |
Hugo121 6874 / 2806 / 533 Регистрация: 19.10.2012 Сообщений: 8,552 |
||||
18.02.2016, 22:15 |
4 |
|||
Кстати, если уж исправлять ошибки книжек, то можно ещё и так:
Но! Сперва подключите библиотеку Ворда в Tools->References!
0 |
Обзор
При использовании оператора New или функции CreateObject в Microsoft Visual Basic для создания экземпляра приложения Microsoft Office, может появиться следующее сообщение об ошибке:
Ошибка выполнения ‘429’: компоненту ActiveX не удается создать объект
Эта ошибка возникает, когда запрошенный объект автоматизации не может быть создан с помощью COM и, следовательно, является недоступным для Visual Basic. Сообщение об ошибке обычно отображается на определенных компьютерах, но не другие.
Эта статья содержит советы по устранению неполадок для диагностики и устранения неполадок, вызывающих возникновение этой ошибки.
Дополнительные сведения
В отличие от некоторых ошибок в Visual Basic нет не одной из причин об ошибке 429. Проблема возникает из-за ошибки в конфигурации системы или приложения или компонента отсутствует или поврежден. Поиск точная причина заключается в возможности устранения. При возникновении этой ошибки на клиентском компьютере, существует ряд вещей, которые необходимо проверить для выявления и устранения ошибки.
Позже, элементы предоставляют некоторые практические советы по устранению данной ошибки при работе с приложениями Office. Часть этой информации также относится к серверам Microsoft Office COM также, но в данной статье предполагается, что вы пытаетесь автоматизации Microsoft Office.
Проверка кода
Первое место, чтобы начать поиск проблемы — в коде. До устранения ошибки, необходимо знать, где произошла ошибка. Попробуйте сузить до одной строки кода.
Найдя код, который не удается, попробуйте сделать следующее:
-
Убедитесь, что в коде используется явное создание объекта. Любые проблемы проще найти и определить, если проблема сведена до отдельного действия. Например не выполните следующее:
Application.Documents.Add 'DON'T USE THIS!!
или:
Dim oWordApp As New Word.Application 'DON'T USE THIS!!
'... some other code
oWordApp.Documents.AddОба эти метода используется неявное создание объекта. Microsoft Word не начинается, пока переменная называется по крайней мере один раз. Поскольку переменная может вызываться в разных частях программы, это может сделать проблему трудно локализовать. Кроме того неясно, связана ли проблема с созданием объекта приложения или объекта документа.
Вместо этого указать явные вызовы для создания каждого объекта в отдельности:
Dim oWordApp As Word.Application
Dim oDoc As Word.Document
Set oWordApp = CreateObject("Word.Application")
'... some other code
Set oDoc = oWordApp.Documents.AddЭто упрощает выявление проблемы и делает код более удобным для чтения.
-
При создании экземпляра приложения Microsoft Office, используйте вместо New CreateObject . CreateObject более точно соответствует процесс создания, используемый большинство клиентов Visual C++ и позволяет возможные изменения CLSID сервера между версиями. Функция CreateObject можно использовать с объектами с ранним связыванием и поздним связыванием.
-
Проверьте правильность строки ProgID, передаваемые CreateObject , а также является независимость от версии (то есть использовать «Excel.Application» вместо «Excel.Application.8»). Возможно, что система, которую дает сбой имеет более старой или новой версии Microsoft Office до версии, указанной в идентификатор ProgID.
-
Для упрощения отладки приложений, которые не запускаются в Интегрированной среде разработки, команда Erl сообщить номер строки, который не проходит. Например следующий код сообщит, какой объект автоматизации невозможно (Word или Excel):
Dim oWord As Word.Application
Dim oExcel As Excel.ApplicationOn 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Используйте сочетание окон сообщений и номеров строк для отслеживания ошибки.
-
Попробуйте использовать позднее связывание (то есть Dim oWordApp как объект). Объекты с ранней привязкой требуют их настраиваемые интерфейсы были переданы через границы процессов. Если маршалинг пользовательского интерфейса во время CreateObject или Создатьпроблемы, вы получите сообщение об ошибке 429. Позднее присоединенного объекта использует определенный системой интерфейс (IDispatch), не требуется настраиваемый прокси для маршалинга. Попробуйте использовать позднее присоединенного объекта для просмотра, если это делает разницу.
Если проблема возникает только в том случае, когда объект является раннее связывание, проблема связана с серверного приложения и обычно можно исправить путем переустановки приложения (см. ниже).
-
При автоматизации из ASP или компонента MTS используйте CreateObject вместо Server.CreateObject(). Используя Server.CreateObject будет создан экземпляр приложения Office с использованием идентификатора пакета MTS, который приводит к проблемам с Microsoft Office.
Проверка сервера автоматизации
Самые распространенные причины возникновения ошибки CreateObject или New , проблем с самим приложением сервера. Как правило эти проблемы являются конфигурации или установки приложения. Ниже приведены некоторые элементы для проверки.
-
Проверьте Microsoft Office, приложение, которое требуется автоматизация установлена на локальном компьютере и убедитесь в том, что можно запустить приложение с самого начала и запустить диалоговое окно. Если программа не может быть запущена вручную, он не будет работать через автоматизацию.
-
Перерегистрируйте приложение, введя путь к серверу в начале и затем запустить диалоговое окно и затем добавить к концу строки/regserver . Нажмите кнопку ОК. Это без вмешательства пользователя необходимо запустить приложение и повторно зарегистрировать его как COM-сервер. Если неполадка связана с раздел реестра отсутствует, это обычно будет исправить.
-
Проверьте LocalServer32 в разделе CLSID для приложения, которое требуется автоматизация. Убедитесь, что он указывает на правильное расположение приложения и убедитесь, что указан путь в формате короткого пути (DOS 8.3). Хотя он не является обязательным требованием, на сервере будет зарегистрирован с помощью краткого пути, длинные имена путей, включающие пробелы известны возникновение проблем в некоторых системах (см. ниже).
Чтобы проверить раздел пути, хранящиеся на сервере, запустите редактор реестра Windows, введя команду regedit в начале, а затем запустите диалоговое окно. Перейдите к разделу HKEY_CLASSES_ROOTClsid. В этом разделе вы найдете CLSID для зарегистрированных серверов автоматизации в системе. Позже с помощью значений, найти ключ, представляющий приложение Office требуется Автоматизация и проверьте его раздел LocalServer32 пути.
+========================+=========================================+
| Office Server | CLSID Key |
+========================+=========================================+
| Access.Application | {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9} |
+————————+——————————————+
| Excel.Application | {00024500-0000-0000-C000-000000000046} |
+————————+——————————————+
| FrontPage.Application | {04DF1015-7007-11D1-83BC-006097ABE675} |
+————————+——————————————+
| Outlook.Application | {0006F03A-0000-0000-C000-000000000046} |
+————————+——————————————+
| PowerPoint.Application | {91493441-5A91-11CF-8700-00AA0060263B} |
+————————+——————————————+
| Word.Application | {000209FF-0000-0000-C000-000000000046} |
+————————+——————————————+
Соответствует ли путь фактическое расположение файла? Имейте в виду, что в короткое имя создать впечатление, что путь указан правильно, когда он не может быть. Например Microsoft Office и Microsoft Internet Explorer (если он установлен в расположениях по умолчанию) будет иметь короткий путь «C:PROGRA~1MICROS~X» где X — некоторое число. Это не очевидно, что вы находитесь на короткое имя.Можно проверить правильность пути действительно скопировать значение из реестра и вставки в начало, а затем диалоговое окно Запуск (удалить переключатель/Automation до запуска приложения). Запускается ли приложение при нажатии кнопки ОК? Если Да, сервер зарегистрирован правильно. Если нет, следует заменить значение раздела LocalServer32 на правильный путь (используйте краткий путь, если это возможно).
-
Известны проблемы возникает при автоматизации Word или Excel, если шаблон Normal.dot (Word) или файл ресурсов Excel.xlb (Excel), был поврежден. Чтобы проверить, если произошло повреждение, поиск локальных жестких дисков для поиска всех экземпляров Normal.dot или *.xlb. (Обратите внимание, что при запуске Windows 2000, Windows NT или Windows 95 или Windows 98 с включенными профилями, может оказаться несколько копий этих файлов для каждого профиля пользователя в системе.) Временно переименуйте файлы Normal.dot или файлы *.xlb и повторно запустите проверку автоматизации (Word и Excel создаст эти файлы, если они не может их найти). Код теперь работать? Если Да, выберите файлы, которые вы переименовали следует удалить, так как они повреждены. Если это не так, переименуйте их обратно в их исходные имена, будут потеряны все пользовательские параметры, сохраненные в этих файлах.
-
При работе в Windows NT, Windows 2000, Windows XP или Windows Server 2003 система, запустите приложения под учетной записью администратора. Серверов Office требуется доступ на чтение и запись в реестре и на диске и могут не загружаться должным образом, если ваши текущие параметры безопасности запрещают эту привилегию.
Проверка системы
Конфигурация системы также может вызвать проблемы с созданием out-of-process COM-серверов. Ниже приведены несколько советов по проверке систем место возникновения ошибки.
-
Проблема происходит с любым сервером out-of-process? Если у вас есть приложение, которое использует только определенный COM-сервер (например, Word), вы захотите проверить на другой сервер out-of-process, чтобы убедиться, что проблема не связана с COM сам слой. Если нет out-of-process COM-сервера могут быть созданы в этой системе, переустановке системы OLE файлов (см. ниже), или для устранения этой проблемы потребуется переустановка операционной системы.
-
Проверьте номера версий системных файлов OLE, которые управляют автоматизацией. Эти файлы обычно устанавливаются как набор и должно соответствовать номера построений. Неправильно настроенная программа установки может ошибочно установить файлы по отдельности, к ним становятся несоответствие. Чтобы избежать проблем при автоматизации, следует проверять файлы, убедитесь, что файлы совпадают построений.
Файлы автоматизации можно найти в каталоге WindowsSystem или WinntSystem32. Ниже приведен список файлов для проверки:
+—————+————-+—————-+
| File Name | Version | Date Modified |
+—————+————-+—————-+
| Asycfilt.dll | 2.40.4275 | March 08, 1999 |
| Oleaut32.dll | 2.40.4275 | March 08, 1999 |
| Olepro32.dll | 5.0.4275 | March 08, 1999 |
| Stdole2.tlb | 2.40.4275 | March 08, 1999 |
+—————+————-+—————-+
Проверьте версию файла, щелкните правой кнопкой мыши файл в обозревателе и при выборе свойства из всплывающего меню. Наиболее важные значения, последние четыре цифры в версии файла (номер сборки) и дату последнего изменения. Необходимо убедиться, что эти значения одинаковы для всех файлов автоматизации.Обратите внимание, что номера версии и даты, приведенном выше, например исключительно в целях. Значения могут отличаться. Важно, что эти значения соответствуют друг другу, а не в этой таблице.
Если файлы не соответствуют номера сборок или даты изменений, вы можете загрузить самораспаковывающийся программа обновит файлы автоматизации. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
290887 VBRun60sp6.exe устанавливает файлы времени выполнения Visual Basic 6.0 SP6
-
Windows NT 4.0 имеет известные проблемы с запуском серверы автоматизации, которые находятся в папке, которая содержит пробелы в имени и напоминает другую папку, совпадают с первыми 8 символами. Например сервер, живущих в C:Program FilesSomeFolder может не запуститься во время вызова к CreateObject, если система называется C:Program StuffSomeFolder другую папку. Дополнительные сведения см в следующей статье базы знаний:Дополнительные сведения об этой проблеме и действия, чтобы избежать этого, щелкните следующий номер статьи базы знаний Майкрософт:
Ошибка 185126 : COM и OLE-сервер не запускается в Windows NT 4.0
Переустановка Microsoft Office.
Если ни один из предыдущих шагов позволяет устранить проблему, рассмотрите возможность удаления и переустановки Microsoft Office. Корпорация Майкрософт рекомендует сначала удалить существующую версию, а затем переустановите с исходных установочных дисков.
Полный список удаляемых элементов можно найти в следующих статьях базы знаний:
219423 OFF2000: как полностью удалить Microsoft Office 2000
158658 OFF97: как полностью удалить Microsoft Office 97
Ссылки
Дополнительные сведения об устранении неполадок при сообщении об ошибке ‘429’ щелкните следующий номер статьи базы знаний Майкрософт:
240377 HOWTO: Убедитесь в правильности установки Jet 3.5 (часть I)
Последние сведения и примеры кода по автоматизации Microsoft Office можно найти на сайте поддержки Microsoft Online по:
http://support.microsoft.com/ofd
- Remove From My Forums
-
Question
-
Hello all I’m trying to do a mail merge into Word. When I click on the button I’m getting the a Compile Error
Please see the code below.
Private Sub MailMergeButton_Click()
On Error GoTo Err_MailMergeButton_Click
Dim objwordApp As Word.Application
Dim objWordDoc As Word.Document
If AddressAlocationType = 3 Then Exit Sub
Set objwordApp = CreateObject(«objword.application»)
wordApp.Visible = True
Select Case [AddressAlocationType]
Case 1
Set objWordDoc = wordApp.Documents.Add(«c:databaseW_L_G.dot»)
Case 2
Set objWordDoc = wordApp.Documents.Add(«c:databaseW_L_P.dot»)
Case 3
Exit Sub
End Select
Exit_MailMergeButton_Click:
Exit SubErr_MailMergeButton_Click:
MsgBox Err.Description
Resume Exit_MailMergeButton_Click
End SubCan someone be so kind to let me know what I’m doing wrong…
Many thanks
Answers
-
You need to go in VBE windows, then menu Tools > References > then search for Microsoft Word xx.0 Object Library
The xx is a Number, which can vary depending on which version of Office you have installed.
To make use of the Word Object Library, you must have installed Word on your PC, I assume you have.
You might use Late binding, to avoid using Word Object Library, but thats another topic.
Daniel van den Berg | Washington, USA | «Anticipate the difficult by managing the easy»
-
Marked as answer by
Thursday, November 10, 2011 3:26 PM
-
Marked as answer by
Here is my code in Form1.vb:
Imports Word = Microsoft.Office.Interop.Word
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim oWord As Word.Application
Dim oWord1 As Microsoft.Office.Interop.Word.Application
Dim oWord2 as Application
I’m using VStudio2012 and Office 2010 and following the sample from https://support.microsoft.com/kb/316383
The declaration of oWord is flagged by intellisense as «Type ‘Word.Application’ is not defined,
while oWord1 and oWord2 are accepted. Intellisense provides several error correction options — two of which I’ve tried (oWord1 and oWord2) — the other options don’t seem to apply.
In short, I am confused about why the use of the namespace alias Word on the Imports statement does not satisfy the syntax Dim oWord As Word.Application as described in the KB article. Is there some «master knob» to turn in the project properties dialog or something?
asked Jan 3, 2014 at 19:24
John AdamsJohn Adams
4,72325 gold badges89 silver badges128 bronze badges
5
You will need to add a reference to import the DLL for this namespace. In Visual Studio 2012
, in your solution explorer` right click on the project name > click «Add Reference» > Choose «Assemblies» > «Extensions» > «Microsoft.Office.Interop.Word». There may be multiple version of the Interop Libraries (Office 2003, 2007, 2010, etc), choose the appropriate one.
I believe these assemblies are originally installed when you do your installation of Microsoft Office from the DVD. So you will need to have Word installed I believe.
Edit: this works for me, with Intellisense:
Imports Word = Microsoft.Office.Interop.Word
Module Module1
Sub Main()
Dim oWord As Word.Application
End Sub
End Module
answered Jan 3, 2014 at 19:29
4
Instead of ‘Imports Word = Microsoft.Office.Interop.Word’ I used ‘Imports Microsoft.Office.Interop’ and it worked fine
answered Jan 2, 2015 at 11:52
JoeJoe
1,8214 gold badges27 silver badges43 bronze badges
|
|
Hello All,
I have some VBA code that I need help refining. The problem I am having is inconsistent and unexplained errors, from my research it appears that the issue is with the clipboard crashing.
How the VBA code works:
I have an embedded Word documents with various bookmarks and reference texts. The bookmarks correspond to named ranges in the Excel workbook. My VBA code opens the embedded Word document, copies the various named ranges in the Excel workbook and pastes the content of the clipboard at the appropriate bookmark in the Word document.
I have a RUN ALL macro set up to create multiple word documents, but it crashes constantly during this process.
I’ve research how to fix this and may have found the answer (Do Loop to retry the copy/paste operation) but as I am very new to VBA I’m not sure how to implement it into my code.
Would greatly appreciate any help with this.
Here is my VBA code:
VBA Code:
Sub Full_policy_document()
Dim wdApp As Word.Application
Dim Wks As Excel.Worksheet
Dim wddoc As Word.Document
Set Wks = ActiveSheet
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = False
Set wddoc = wdApp.Documents.Open(Environ("UserProfile") & "Google DriveSMS TEMPLATES1 POLICIES01 H&S Full Policy Document.docx")
Call ReplaceWords2(wddoc, Wks, False)
Call CopyPasteImage2(wddoc, Wks, False) 'switch back to true
wdApp.Quit
Set wddoc = Nothing
Set wdApp = Nothing
End Sub
Sub ReplaceWords2(oDoc As Word.Document, Wks As Excel.Worksheet, Optional boolCloseAfterExec As Boolean = True)
Dim wdRng As Word.Range
Dim varTxt As Variant
Dim varRngAddress As Variant
Dim i As Long
varTxt = Split("cp1,na1,po2,id1,rd1,bd1,an1,ns1,ct1,bc1,pt1,vd1,me1,mc1,po1", ",")
varRngAddress = Split("C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17", ",")
For Each wdRng In oDoc.StoryRanges
With wdRng.Find
For i = 0 To UBound(varTxt)
.Text = varTxt(i)
.Replacement.Text = Wks.Range(varRngAddress(i)).Value
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
Next i
End With
Next wdRng
oDoc.SaveAs2 Environ("UserProfile") & "desktop01 H&S Full Policy Document"
If boolCloseAfterExec Then
oDoc.Close
oDoc.Parent.Quit
End If
End Sub
Sub CopyPasteImage2(oDoc As Word.Document, Wks As Excel.Worksheet, Optional boolCloseAfterExec As Boolean = True)
With oDoc
.Activate
.ActiveWindow.View = wdNormalView
Wks.Range("K2:L15").CopyPicture Appearance:=xlScreen, Format:=xlPicture
.Bookmarks("CompanyLogo").Select
.Parent.Selection.Paste
.Parent.Selection.TypeParagraph
Wks.Range("N11:O15").CopyPicture Appearance:=xlScreen, Format:=xlPicture
.Bookmarks("ConsulSig").Select
.Parent.Selection.Paste
.Parent.Selection.TypeParagraph
Wks.Range("N02:O07").CopyPicture Appearance:=xlScreen, Format:=xlPicture
.Bookmarks("ClientSig").Select
.Parent.Selection.Paste
.Parent.Selection.TypeParagraph
Wks.Range("N02:O07").CopyPicture Appearance:=xlScreen, Format:=xlPicture
.Bookmarks("ClientSig2").Select
.Parent.Selection.Paste
.Parent.Selection.TypeParagraph
.Save
If boolCloseAfterExec Then
oDoc.Close
oDoc.Parent.Quit
End If
End With
End Sub
Here is the code I need help implementing.
VBA Code:
On Error GoTo 0 ' Normal error handling
Application.CutCopyMode = False ' Clear clipboard before copy
Range(excel_range_name).CopyPicture
n = 1 ' Set counter to 1
Do Until n > 3 'Attempt paste function three times before falling out
If n < 3 Then ' suspend normal error handling
On Error Resume Next
Else
On Error GoTo 0 ' on last attempt, reinstate normal error handling
End If
newWord.Bookmarks(bookmark_name).Range.Characters.Last.Paste ' Paste into Word
If Err.Number = 0 Then
On Error GoTo 0 'reinstate normal error handling
Exit Do ' Exit if no error encountered
End If
n = n + 1 ' Increment counter and repeat the Do Until Loop
DoEvents
Loop
On Error GoTo 0 ' Just to make sure that normal error handling is reinstated