Страница 1 из 1
Как программно что-то записать в шаблон Word?
Добавлено: 27 май 2004, 13:16
VG
В программе я пишу письмо, а вывести его надо в виде документа Ворд, на бланке фирмы. Когда беру файл бланка и добавляю к тексту письма, то все настройки шрифтов теряются. В формате RTF не получается "слепить" два файла. Может кто-нибудь решал эту проблему?
Добавлено: 27 май 2004, 23:47
Naeel Maqsudov
Вопрос поставлен не совсем корректно. Не "писать в шаблон", а "создавать документ ена основе шаблона и писать в него".
Новый документ-ворд может быть создан на основе шаблона.
Код: Выделить всё
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
Normal заменть на нужный шаблон.
Разумеется к проекту надо подключить Microsoft Word Object Library.
Добавлено: 31 май 2004, 10:43
VG
wrd.Documents.Add "Normal", , , False
Библиотека MS Word загружена. Но прога подсвечивает слово Add в этой строке и пишет Runtime error...
Добавлено: 31 май 2004, 18:32
Naeel Maqsudov
Не может такого быть. Приведите полный список подключенных (на против которых стоят флажки) к проекту библиотек.
Кроме того какая именно RunTime-ошибка? (Полный текст ошибки).
Добавлено: 01 июн 2004, 10:26
VG
Подключенные библиотеки:
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
Добавлено: 02 июн 2004, 01:48
Naeel Maqsudov
Ну вот! А говорили, что в .Add ошибка!
Впрочем это я сам виноват, прошу прощения. "Object variable or With block variable not set" означает, что переменная doc не ссылается ни на какой объект.
надо не
wrd.Documents.Add "Normal", , , False
а разумеется
set doc=wrd.Documents.Add("Normal", , , False)
Еще раз извиняюсь, досадная оплошность...
Не забудьте
doc=Nothing для осовобождения памяти.
Добавлено: 03 июн 2004, 11:05
VG
Ну вот! А говорили, что в .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
Что делать?
Добавлено: 04 июн 2004, 08:29
Naeel Maqsudov
doc.Text НЕ БЫВАЕТ.
MSDN говорит, что это ошибка OLE-Automation, и ссылается на сервиспак. Но там упоминается о возникновении ошибки в Microsoft Exchange.
Проверьте, правильную ли библиотеку с объектами word вы подключили.
Не знаю уж чего тут посоветовать. У меня-то этот код работает на ура!
Добавлено: 04 июн 2004, 11:23
VG
Вот этот вариант у меня заработал
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
Только программа пишет перед шаблоном, а надо после него, а еще лучше в любое место шаблона. Как это сделать, пока не знаю. Спасибо за помощь!
Добавлено: 08 июн 2004, 07:41
Naeel Maqsudov
Когда документ только что создан, то selection находится в самом начале и имеет нулевую длину.
Соответственно место после Selection - это место перед первым символом.
перепрыгнуть в конец можно так:
Код: Выделить всё
ActiveWindow.Document.Range.Select
Selection.Collapse wdCollapseEnd
Что касается любого места, то это тоже пожалуйста.
Документ может рассматриваться как набор абзацев (ActiveWindow.Document.Paragraphs(i)),
разделов (.Sections), слов (.Words), символов (.Characters), предложений (.Sentences) и т.п.
Обращаемся к нужному элементу, и добавляем что надо впереди или после него.
Правда есть некоторые нелогичные моменты, например:
Код: Выделить всё
ActiveWindow.Document.Paragraphs(2).Range.InsertAfter "111"
Вставит "111" не в конце второго абзаца, а в начале третьего, так как Paragraphs(2).Range - это весь второй абзац, включая символ конца абзаца.