Вывод отчета в MS Word

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alex_2003
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 30.06.2003 (Пн) 9:26

Вывод отчета в MS Word

Сообщение Alex_2003 » 09.07.2003 (Ср) 10:29

Всем привет. Возникла другая проблема. Как можно проверить открытость файла MS Word? То есть, если у пользователя уже открыт файл, то выдать ему сообщение об этом и все, если нет, то можно его открывать и выводить туда отчет. Как это можно сделать? :?:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.07.2003 (Ср) 10:39

Пройтись по коллекции Documents и поискать нужный файл/документ, если не найден -- то надо открыть.
Lasciate ogni speranza, voi ch'entrate.

Alex_2003
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 30.06.2003 (Пн) 9:26

Сообщение Alex_2003 » 09.07.2003 (Ср) 10:45

Спасибо. Это, конечно, классно, только не понятно, а что значит пройтись по коллекции Documents?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.07.2003 (Ср) 11:01

Создай объект Word.Application; если надо создать, то Set objWord=CreateObject("Word.Application"), если открыть уже существующий, то Set objWord=GetObject(,"Word.Application"). И в нем юзай:
Код: Выделить всё
Dim objDoc As Object
For Each objDoc In objWord.Documents
  If objDoc.Name = "Мой любимый документ" Then Exit For
  If objDoc.Path = "C:\MyFavoriteDoc.doc" Then Exit For
Next objDoc
If objDoc Is Nothing Then
  MsgBox "Документ не найден"
Else
  MsgBox "Документ найден, objDoc.Name = " & objDoc.Name
End If


Для упрощения можешь подключить в References библиотеку "Microsoft Word ... Object library", тогда сможешь пользоваться списком свойств и т.п., но советую потом отключить эту библиотеку и использовать позднее связывание.

P.S. А если не знаешь, как создавать содержимое документа Word программно, то включи в Word запись макроса и делай, что тебе нужно. Потом полученный код вставь в свою программу и замени "ActiveDocument" на "objDoc", а "Selection" на "objWord.Selection".
Lasciate ogni speranza, voi ch'entrate.

Alex_2003
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 30.06.2003 (Пн) 9:26

Сообщение Alex_2003 » 09.07.2003 (Ср) 12:20

Спасибо большое. Только у меня две проблемы:
1. У меня почему-то цикл сразу проскакивает, то есть в цикл не входит вообще, может ObjDoc нужно как-то еще объявить? :?:
2. А что такое позднее связывание? :?:

Alex_2003
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 30.06.2003 (Пн) 9:26

Сообщение Alex_2003 » 09.07.2003 (Ср) 13:31

И еще вопрос: а как я могу посчитать количество открытых в ворде в данный момент файлов?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 09.07.2003 (Ср) 13:39

Documents.Count это ж очевидно :)

Alex_2003
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 30.06.2003 (Пн) 9:26

Сообщение Alex_2003 » 09.07.2003 (Ср) 13:42

Очевидное - невероятное. Оно у меня 0, хотя файлы есть открытые. Как быть? :(

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 09.07.2003 (Ср) 13:55

Код давай приводи который используешь, как быть то еще.

Alex_2003
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 30.06.2003 (Пн) 9:26

Сообщение Alex_2003 » 09.07.2003 (Ср) 14:00

Set objWord = GetObject(, "Word.Application")
flag1 = False
For j = 1 To objWord.Documents.Count
If objWord.Documents.Item(j).Name = "Test" And objWord.Documents.Item(j).Path = App.Path Then
flag1 = True
Exit For
End If
Next j

И еще вопрос "чайника": я изначально не знаю открыт Ворд у клиента на компьютере или нет. Как это можно узнать? Потому что если не открыт, то GetObject ошибку вываливает

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 09.07.2003 (Ср) 14:22

Так по этому признаку и узнать :) Обрабатывай ошибку и смотри - есть Ворд или нет.

Ну а если 0 то значит нет документов.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.07.2003 (Ср) 15:03

Ты что написал? Зачем счетчик, флаг.
Я же привел пример перебора документов, For Each и выглядит изящнее и работает быстрее. К тому же, зачем проверять по .Name и .Path, это я для примера привел. Полное имя файла: .FullName.
А что касается того, что количество документов у тебя 0 -- это какие-то глюки. Только что набрал этот код:
Код: Выделить всё
Dim objWord As Object, objDoc As Object
Set objWord = GetObject(, "Word.Application")
Print objWord.Documents.Count
For Each objDoc In objWord.Documents
  Print objDoc.Name
Next objDoc
Set objWord = Nothing

все работает
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 15

    TopList