Как программно что-то записать в шаблон Word?
Модератор: Naeel Maqsudov
В программе я пишу письмо, а вывести его надо в виде документа Ворд, на бланке фирмы. Когда беру файл бланка и добавляю к тексту письма, то все настройки шрифтов теряются. В формате RTF не получается "слепить" два файла. Может кто-нибудь решал эту проблему?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Вопрос поставлен не совсем корректно. Не "писать в шаблон", а "создавать документ ена основе шаблона и писать в него".
Новый документ-ворд может быть создан на основе шаблона.
Normal заменть на нужный шаблон.
Разумеется к проекту надо подключить Microsoft Word Object Library.
Новый документ-ворд может быть создан на основе шаблона.
Код: Выделить всё
Sub qwe()
Dim wrd As Word.Application, doc As Word.Document
Set wrd = New Word.Application
wrd.Documents.Add "Normal", , , False
doc.Range.Text = "записать что-то"
wrd = Nothing
End Sub
Разумеется к проекту надо подключить Microsoft Word Object Library.
Библиотека MS Word загружена. Но прога подсвечивает слово Add в этой строке и пишет Runtime error...wrd.Documents.Add "Normal", , , False
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Не может такого быть. Приведите полный список подключенных (на против которых стоят флажки) к проекту библиотек.
Кроме того какая именно RunTime-ошибка? (Полный текст ошибки).
Кроме того какая именно RunTime-ошибка? (Полный текст ошибки).
Подключенные библиотеки:
Visual Basic For Applications
Visual Basic runtime objects and proctdures
Visual Basic objects and proctdures
OLE Automation
Microsoft Word 10.0 Object Library
При запуске высвечивает желтым строку
doc.Range.Text = "записать что-то"
и выдает ошибку
Run-time error '91'
Object variable or With block variable not set
Visual Basic For Applications
Visual Basic runtime objects and proctdures
Visual Basic objects and proctdures
OLE Automation
Microsoft Word 10.0 Object Library
При запуске высвечивает желтым строку
doc.Range.Text = "записать что-то"
и выдает ошибку
Run-time error '91'
Object variable or With block variable not set
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Ну вот! А говорили, что в .Add ошибка!
Впрочем это я сам виноват, прошу прощения. "Object variable or With block variable not set" означает, что переменная doc не ссылается ни на какой объект.
надо не
wrd.Documents.Add "Normal", , , False
а разумеется
set doc=wrd.Documents.Add("Normal", , , False)
Еще раз извиняюсь, досадная оплошность...
Не забудьте
doc=Nothing для осовобождения памяти.
Впрочем это я сам виноват, прошу прощения. "Object variable or With block variable not set" означает, что переменная doc не ссылается ни на какой объект.
надо не
wrd.Documents.Add "Normal", , , False
а разумеется
set doc=wrd.Documents.Add("Normal", , , False)
Еще раз извиняюсь, досадная оплошность...

Не забудьте
doc=Nothing для осовобождения памяти.
Извиняюсь. Эта ошибка была на другом компе.Ну вот! А говорили, что в .Add ошибка!
Но после изменений, прога опять высвечивает желтым строку
doc.Range.Text = ""записать что-то"
и ругается
Run-time error '-2147417851 (80010105)':
Method 'Text' of object 'Range' failed
изменил строку на
doc.Text = "записать что-то"
и опять ругается
Run-time error '438':
Object doesn't supprt this property or method
Что делать?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
doc.Text НЕ БЫВАЕТ.
MSDN говорит, что это ошибка OLE-Automation, и ссылается на сервиспак. Но там упоминается о возникновении ошибки в Microsoft Exchange.
Проверьте, правильную ли библиотеку с объектами word вы подключили.
Не знаю уж чего тут посоветовать. У меня-то этот код работает на ура!
MSDN говорит, что это ошибка OLE-Automation, и ссылается на сервиспак. Но там упоминается о возникновении ошибки в Microsoft Exchange.
Проверьте, правильную ли библиотеку с объектами word вы подключили.
Не знаю уж чего тут посоветовать. У меня-то этот код работает на ура!
Вот этот вариант у меня заработал
Option Explicit
Private Sub Command1_Click()
Dim wrd As Word.Application, doc As Word.Document
Set wrd = New Word.Application
wrd.Visible = True
Set doc = wrd.Documents.Add(App.Path & "\Normal.doc", , , True)
doc.Activate
doc.ActiveWindow.Selection.InsertAfter "Записать что-то."
Set wrd = Nothing
End Sub
Только программа пишет перед шаблоном, а надо после него, а еще лучше в любое место шаблона. Как это сделать, пока не знаю. Спасибо за помощь!
Option Explicit
Private Sub Command1_Click()
Dim wrd As Word.Application, doc As Word.Document
Set wrd = New Word.Application
wrd.Visible = True
Set doc = wrd.Documents.Add(App.Path & "\Normal.doc", , , True)
doc.Activate
doc.ActiveWindow.Selection.InsertAfter "Записать что-то."
Set wrd = Nothing
End Sub
Только программа пишет перед шаблоном, а надо после него, а еще лучше в любое место шаблона. Как это сделать, пока не знаю. Спасибо за помощь!
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Когда документ только что создан, то selection находится в самом начале и имеет нулевую длину.
Соответственно место после Selection - это место перед первым символом.
перепрыгнуть в конец можно так:
Что касается любого места, то это тоже пожалуйста.
Документ может рассматриваться как набор абзацев (ActiveWindow.Document.Paragraphs(i)),
разделов (.Sections), слов (.Words), символов (.Characters), предложений (.Sentences) и т.п.
Обращаемся к нужному элементу, и добавляем что надо впереди или после него.
Правда есть некоторые нелогичные моменты, например:
Вставит "111" не в конце второго абзаца, а в начале третьего, так как Paragraphs(2).Range - это весь второй абзац, включая символ конца абзаца.
Соответственно место после Selection - это место перед первым символом.
перепрыгнуть в конец можно так:
Код: Выделить всё
ActiveWindow.Document.Range.Select
Selection.Collapse wdCollapseEnd
Документ может рассматриваться как набор абзацев (ActiveWindow.Document.Paragraphs(i)),
разделов (.Sections), слов (.Words), символов (.Characters), предложений (.Sentences) и т.п.
Обращаемся к нужному элементу, и добавляем что надо впереди или после него.
Правда есть некоторые нелогичные моменты, например:
Код: Выделить всё
ActiveWindow.Document.Paragraphs(2).Range.InsertAfter "111"