Как программно что-то записать в шаблон Word?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
VG
Сообщения: 13
Зарегистрирован: 27 май 2004, 13:00

В программе я пишу письмо, а вывести его надо в виде документа Ворд, на бланке фирмы. Когда беру файл бланка и добавляю к тексту письма, то все настройки шрифтов теряются. В формате RTF не получается "слепить" два файла. Может кто-нибудь решал эту проблему?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вопрос поставлен не совсем корректно. Не "писать в шаблон", а "создавать документ ена основе шаблона и писать в него".
Новый документ-ворд может быть создан на основе шаблона.

Код: Выделить всё

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.
VG
Сообщения: 13
Зарегистрирован: 27 май 2004, 13:00

wrd.Documents.Add "Normal", , , False
Библиотека MS Word загружена. Но прога подсвечивает слово Add в этой строке и пишет Runtime error...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Не может такого быть. Приведите полный список подключенных (на против которых стоят флажки) к проекту библиотек.

Кроме того какая именно RunTime-ошибка? (Полный текст ошибки).
VG
Сообщения: 13
Зарегистрирован: 27 май 2004, 13:00

Подключенные библиотеки:
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 для осовобождения памяти.
VG
Сообщения: 13
Зарегистрирован: 27 май 2004, 13:00

Ну вот! А говорили, что в .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 вы подключили.

Не знаю уж чего тут посоветовать. У меня-то этот код работает на ура!
VG
Сообщения: 13
Зарегистрирован: 27 май 2004, 13:00

Вот этот вариант у меня заработал

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.Range.Select
  Selection.Collapse wdCollapseEnd
Что касается любого места, то это тоже пожалуйста.
Документ может рассматриваться как набор абзацев (ActiveWindow.Document.Paragraphs(i)),
разделов (.Sections), слов (.Words), символов (.Characters), предложений (.Sentences) и т.п.
Обращаемся к нужному элементу, и добавляем что надо впереди или после него.
Правда есть некоторые нелогичные моменты, например:

Код: Выделить всё

ActiveWindow.Document.Paragraphs(2).Range.InsertAfter "111"
Вставит "111" не в конце второго абзаца, а в начале третьего, так как Paragraphs(2).Range - это весь второй абзац, включая символ конца абзаца.
Ответить