Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа c Word-ом  (Прочитано 32519 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Доцент
Участник

ru
Offline Offline

« : 20-10-2008 17:08 » 

С помощью VB открываю Word и создаю документ. Затем задаю параметры страницы и работаю с ним. Затем закрываю документ и сам Word (ядро). При этом возникает необходимость опять открыть Word и создать новый документ, вот тут начинается непонятное. Все открывается (создается), но как только действие доходит до параметров страницы выдается ошибка:
«Ошибка во время выполнения программы 462
Удаленный сервер не существует или не доступен».
   Если при закрытии документа не закрывать сам Word, то все нормально, но при каждом новом открытии добавляется в список процессов WINWORD.EXE. Так их может накапливаться значительное количество.
Если кто решал такую проблему, объясните где я не прав.
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #1 : 21-10-2008 12:09 » 

С этой бедой вроде разобрался, но возникла другая. Сейчас под одним ядром Word-а могу открывать несколько документов, но как переключаться с одного на другой - непонятно. Или как удалить (закрыть) один из них? Может кто подскажет!?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 21-10-2008 12:34 » 

Ctrl+F4 - закрываем
Ctrl+F6 - преключаем

Help - hot key - горячие клавиши
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Доцент
Участник

ru
Offline Offline

« Ответ #3 : 21-10-2008 17:05 » 

Не совсем понятно. Мне это надо сделать програмно, а не нажимая на кнопки. Можно по подробнее?
Записан
HandKot
Молодой специалист

ru
Online Online

« Ответ #4 : 23-10-2008 13:22 » 

Documents(I).Activate
Documents(I).Close
должно вроде работать
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #5 : 01-11-2008 10:23 » 

Спасибо за подсказку. Вроде разобрался. Но если кто знает, как можно расположить текст в ячейке таблицы, созданной в Word-е?
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #6 : 03-11-2008 20:06 » 

 Прошу прощения за неполный текст. Необходимо поменять расположение ткста в ячейке таблицы, т.е. с горизонтального расположения на вертикальное. А вот как - это вопрос.
Записан
HandKot
Молодой специалист

ru
Online Online

« Ответ #7 : 05-11-2008 05:25 » 

Необходимо поменять расположение ткста в ячейке таблицы, т.е. с горизонтального расположения на вертикальное.
кажется это ворд не поддерживает
если же Вы уверены, что это возможно, то просто откройте ворд, включите запись макроса, проделайте нужные действия и посмотрите полученный код
Записан

I Have Nine Lives You Have One Only
THINK!
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 05-11-2008 10:26 » 

Вот простейший пример - изменить ориентацию текста во второй клетки первой строки первой таблицы в документе:

Код:
ActiveDocument.Tables(1).Cell(1, 2).Range.Orientation = wdTextOrientationUpward
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Доцент
Участник

ru
Offline Offline

« Ответ #9 : 07-11-2008 09:58 » 

Запускаю ядро Word-а, затем запускаю документ, форматирую его, вставляю таблицы и т.д. Затем закрываю документ и Word. При последующей попытке открыть новый документ все проходит нормально, но как только программа доходит до форматирования параметров страницы, таблиц и т.д., появляется ошибка «Недоступен сервер» и т.д.
При новом запуске программы все повторяется опять – первый запуск проходит нормально, а второй глючит.
Подскажите, как можно от этого избавиться.
Записан
HandKot
Молодой специалист

ru
Online Online

« Ответ #10 : 10-11-2008 05:02 » 

кажется все-таки Word не был закрыт
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #11 : 11-11-2008 15:49 » 

Word закрыт был. При объявлении в форме(или в программе) возможности открытия Word-а и создания таблиц приходится делать ссылку на это(через проект-и. т.д.). Поэтому напрашивается вывод - если я закрываю в программе Word, то отключается эта самая ссылка. Т.е. при повторном запуске Word-а и форматировании документа программа выдает ошибку. А так, если в программе открывать сколько угодно существующих файлов и закрывать их, то все нормально. А вот, опять таки, форматировать страницу, создавать таблицы и форматировать их уже не получиться. Поэтому сейчас пришлось перестроить программу, так, чтобы ядро ord-а работало постоянно, а просмотр документов был на заключительной стадии. Правда есть один неприятный момент - если в процессе работы программы приходится открыть Word напрямую, посмотреть необходимую информацию, а потом его закрыть, в программе так же возникает ошибка. В связи с этим у меня вопрос, а возможно перед запуском программы закрыть все открытые файлы Word-а и не позволять запускать его минуя программу?
Записан
HandKot
Молодой специалист

ru
Online Online

« Ответ #12 : 12-11-2008 05:19 » 

покажите код
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #13 : 18-11-2008 19:42 » 

Главная форма
Set WordApp = New Word.Application ' создаем новый экземпляр документа Word
 WordApp.Visible = False 'делаем созданный экземпляр Word-а невидимым

Форма 1
Set DocWord = WordApp.Documents.Add 'создаем новый документ в экземпляре Word-а
DocWord.SaveAs "C:\Orion\SAVE\komGSM.doc" 'сохраняем созданный файл отчета
    '--- форматирование документа Word ---
DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2)  'отступ слева 2 см
DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1.5)  'отступ справа 1.5 см
DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(2)  'отступ сверху 2 см
DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(2)
…..
….
….
DocWord.Save 'сохраняем изменения в документе
WordApp.Quit False '  закрываем Word (без запроса на сохранение)
Переходим к главной форме.
Из нее перехожу в форме 2 или:
Главная – 2 форма – главная – 1 форма.
Форма 2
Set DocWord = WordApp.Documents.Add 'создаем новый документ в экземпляре Word-а
DocWord.SaveAs "C:\Orion\SAVE\komSSS.doc" 'сохраняем созданный файл отчета
    '--- форматирование документа Word ---
как только действие доходит до этой строчки, то появляется ошибка!!!
DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(1)  'отступ слева 1 см
DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1)  'отступ справа 1 см
DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(1)  'отступ сверху 1 см
DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(1)
…..
….
….
DocWord.Save 'сохраняем изменения в документе
WordApp.Quit False '  закрываем Word (без запроса на сохранение)

объявление Word-а, я не показал, думаю и так понятно.
Записан
HandKot
Молодой специалист

ru
Online Online

« Ответ #14 : 19-11-2008 05:12 » 

Цитата
объявление Word-а, я не показал, думаю и так понятно.
т.е, я так прнимаю, в каждой форме есть строки

Код:
Set WordApp = New Word.Application ' создаем новый экземпляр документа Word
 WordApp.Visible = False 'делаем созданный экземпляр Word-а невидимым
...
WordApp.Quit False

тогда, вероятно ошибка появляется из-за того, что у вас в каждой форме и главной и дочерних используется одно и тоже имя дя объекта, который до конца и не вычищается

предложение:
1) до вызова форм делать set WordApp = nothing
2) объявить переменную для Word в модуле (только один раз как паблик) и этим объектом пользоватся во всех формах

ИМХО, использовать 2 вариант
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #15 : 19-11-2008 05:26 » 

Объявление Word-а у меня как раз в модуле и именно через паблик. Пробовал делать сначала nothing
сначала для документа Word, а потом и для самого Word-а, но эффект один и тот же.
На самом деле у меня 8 форм, каждая решает свои задачи, да и код становиться компактнее при редактировании.
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #16 : 19-11-2008 05:41 » 

первая строчка представленных блоков выглядит, так (не скопировалась первый раз)
Set WordApp = New Word.Application
Set DocWord = WordApp.Documents.Add 'создаем новый документ в экземпляре Word-а
т.е. создаю сначала сам Word, а потом его документ.
Записан
HandKot
Молодой специалист

ru
Online Online

« Ответ #17 : 19-11-2008 10:47 » 

я и спрашивал, зачем каждый раз (в каждой форме) делать
Set WordApp = New Word.Application
если у вас оно объявлено в модуле, да еще и паблик?
Записан

I Have Nine Lives You Have One Only
THINK!
HandKot
Молодой специалист

ru
Online Online

« Ответ #18 : 19-11-2008 11:29 » 

кстати такой еще вопрос
перед тем как вываливается ошибка, у вас идет сохранение файла.
Этот фапйл появляется?
Записан

I Have Nine Lives You Have One Only
THINK!
Доцент
Участник

ru
Offline Offline

« Ответ #19 : 19-11-2008 19:23 » 

Немного сам напутал, т.к разные варианты пробую. Set WordApp = New Word.Application -
только в одной форме (главной). А во всех остальных только объявление нового документа
Set DocWord = WordApp.Documents.Add . После создания документа файл сохраняется. Сейчвас приходиться оставлять работающий Word, а закрывать и открывать только документ. Но это не совсем удобно.
Поэтому для пробы сделал одну форму с двумя кнопками.

Private WordApp As Word.Application 'объявляем экземпляр приложения Word
Private DocWord As Word.Document  ' объявлям экземпляр документа Word

кнопка 1 - открывает новый Word
Set WordApp = New Word.Application
Set DocWord = WordApp.Documents.Add
DocWord.SaveAs "C:\Orion\SAVE\komGSM.doc" 'сохраняем созданный файл отчета trGSM
'--- форматирование документа Word ---
    DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2)  'отступ слева 2 см
    DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1.5)  'отступ справа 1.5 см
    DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(2)  'отступ сверху 2 см
    DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(2)  'отступ снизу 2 см
DocWord.Save
кнопка 2 - закрывает и документ и ядро.
DocWord.Close
WordApp.Quit

Первый раз все проходит нормально, а при повторном нажатии 1 кнопки опять ошибка.
« Последнее редактирование: 19-11-2008 20:53 от Доцент » Записан
Naghual
Модератор

ua
Offline Offline
Пол: Мужской
ОПТИМИСТ


WWW
« Ответ #20 : 19-11-2008 21:41 » 

После строки: WordApp.Quit
Добавь строки:
 Set DocWord = Nothing
 Set WordApp = Nothing
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #21 : 20-11-2008 10:52 » 

Попробовал результат тот же. Как только при втором запуске документа доходит до строки
DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2)  'отступ слева 2 см
пишет ошибку.
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #22 : 20-11-2008 11:35 » 

В режиме отладки навожу курсор с строке
Public WordApp As Word.Application
пишет отсутствует сервер Word.Application, т.е. при вторичном его использовании
обрывается с ним связь (странно). Где то слышал краем уха, что динамические библиотеки
сохраняются(держаться) в памяти в единственном экземпляре. Может потому при закрытии Word-а
и связь сней теряется. Слышал так же, что возможно создать экзешник библиотеки и
запускать его по мере надобности. Хотя может я и не правильно что-то понял???
Но если это так, то как это сделать?
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 20-11-2008 12:56 » 

По идее, создается и используется DCOM соединение. Возможно, какая-то несогласованность с кешированием этого соединения. Надо аккуратно создавать и уничтожать объекты.

Я попробовал пример кода, но вынес инициализацию и финализацию ворда в события Initialize и Terminate главной формы. У меня работает без проблем. Word 2007 русский

вот пример формы с двумя кнопками. Одна кнопка обрабатывает документ, вторая кнопка закрывает форму.
Объект word создается при создании клавной формы и завершается при закрытии главной формы. Глобального объекта DocWord нет, он убран как переменная в тот метод, в котором используется.

Я попробовал несколько раз, работает без сбоев.

Код:
Dim word As Application
Private Sub CommandButton1_Click()
    Dim DocWord As Document
    Set DocWord = word.Documents.Add
    DocWord.SaveAs "C:\tmp\zzz.doc"

    DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2) 
    DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1.5) 
    DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(2) 
    DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(2)
    DocWord.Save
    DocWord.Close
    Set DocWord = Nothing
    MsgBox "Clicked"
End Sub


Private Sub CommandButton2_Click()
    Unload UserForm1
End Sub

Private Sub UserForm_Initialize()
    Set word = New Application
    MsgBox "Initialized"
End Sub

Private Sub UserForm_Terminate()
    word.Quit (False)
    Set word = Nothing
    MsgBox "Terminated"
End Sub

* userform.frx (2.52 Кб - загружено 1116 раз.)
* userform.frm (1.49 Кб - загружено 1162 раз.)
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Доцент
Участник

ru
Offline Offline

« Ответ #24 : 20-11-2008 18:28 » 

В одной форме это действительно работает. Но я попробовал сделать переход к другой форме с аналогичным кодом. Ошибка таже. Возможно придется сделать главную форму, а из нее запускать экзешники остальных по одной. Тогда при их новом открытии и последующем закрытии все будет нормально. Неудобно конечно!
Записан
Naghual
Модератор

ua
Offline Offline
Пол: Мужской
ОПТИМИСТ


WWW
« Ответ #25 : 20-11-2008 21:57 » 

Создай модуль. Опиши в нем глобальные переменные. Из него вызывай формы.
Записан
Доцент
Участник

ru
Offline Offline

« Ответ #26 : 21-11-2008 08:29 » 

Я пробовал так делать, результат тот же. С этого я и начинал. Файлы создаются, но отформатировать страницу или ячейки таблицы не получается. Хотя существующий файл ворда на диске можно открыть в любом месте программы и сколько угодно раз (для просмотра).Вероятно происходит какой то сбой при работе с Microsoft Word Object Library, она ведь подключается ко всему проекту один раз независимо сколько модулей или форм. Поэтому пока вижу два выхода: 1 - работать на одном ядре Word-а создавая и закрывая только документы; 2 - или делать каждую рабочую форму отдельно как экзешник и запускать их из главной, тогда все нормально.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines