Доцент
Участник
Offline
|
|
« : 20-10-2008 17:08 » |
|
С помощью VB открываю Word и создаю документ. Затем задаю параметры страницы и работаю с ним. Затем закрываю документ и сам Word (ядро). При этом возникает необходимость опять открыть Word и создать новый документ, вот тут начинается непонятное. Все открывается (создается), но как только действие доходит до параметров страницы выдается ошибка: «Ошибка во время выполнения программы 462 Удаленный сервер не существует или не доступен». Если при закрытии документа не закрывать сам Word, то все нормально, но при каждом новом открытии добавляется в список процессов WINWORD.EXE. Так их может накапливаться значительное количество. Если кто решал такую проблему, объясните где я не прав.
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #1 : 21-10-2008 12:09 » |
|
С этой бедой вроде разобрался, но возникла другая. Сейчас под одним ядром Word-а могу открывать несколько документов, но как переключаться с одного на другой - непонятно. Или как удалить (закрыть) один из них? Может кто подскажет!?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #2 : 21-10-2008 12:34 » |
|
Ctrl+F4 - закрываем Ctrl+F6 - преключаем
Help - hot key - горячие клавиши
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #3 : 21-10-2008 17:05 » |
|
Не совсем понятно. Мне это надо сделать програмно, а не нажимая на кнопки. Можно по подробнее?
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Online
|
|
« Ответ #4 : 23-10-2008 13:22 » |
|
Documents(I).Activate Documents(I).Close должно вроде работать
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #5 : 01-11-2008 10:23 » |
|
Спасибо за подсказку. Вроде разобрался. Но если кто знает, как можно расположить текст в ячейке таблицы, созданной в Word-е?
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #6 : 03-11-2008 20:06 » |
|
Прошу прощения за неполный текст. Необходимо поменять расположение ткста в ячейке таблицы, т.е. с горизонтального расположения на вертикальное. А вот как - это вопрос.
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Online
|
|
« Ответ #7 : 05-11-2008 05:25 » |
|
Необходимо поменять расположение ткста в ячейке таблицы, т.е. с горизонтального расположения на вертикальное.
кажется это ворд не поддерживает если же Вы уверены, что это возможно, то просто откройте ворд, включите запись макроса, проделайте нужные действия и посмотрите полученный код
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
npak
|
|
« Ответ #8 : 05-11-2008 10:26 » |
|
Вот простейший пример - изменить ориентацию текста во второй клетки первой строки первой таблицы в документе: ActiveDocument.Tables(1).Cell(1, 2).Range.Orientation = wdTextOrientationUpward
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #9 : 07-11-2008 09:58 » |
|
Запускаю ядро Word-а, затем запускаю документ, форматирую его, вставляю таблицы и т.д. Затем закрываю документ и Word. При последующей попытке открыть новый документ все проходит нормально, но как только программа доходит до форматирования параметров страницы, таблиц и т.д., появляется ошибка «Недоступен сервер» и т.д. При новом запуске программы все повторяется опять – первый запуск проходит нормально, а второй глючит. Подскажите, как можно от этого избавиться.
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Online
|
|
« Ответ #10 : 10-11-2008 05:02 » |
|
кажется все-таки Word не был закрыт
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #11 : 11-11-2008 15:49 » |
|
Word закрыт был. При объявлении в форме(или в программе) возможности открытия Word-а и создания таблиц приходится делать ссылку на это(через проект-и. т.д.). Поэтому напрашивается вывод - если я закрываю в программе Word, то отключается эта самая ссылка. Т.е. при повторном запуске Word-а и форматировании документа программа выдает ошибку. А так, если в программе открывать сколько угодно существующих файлов и закрывать их, то все нормально. А вот, опять таки, форматировать страницу, создавать таблицы и форматировать их уже не получиться. Поэтому сейчас пришлось перестроить программу, так, чтобы ядро ord-а работало постоянно, а просмотр документов был на заключительной стадии. Правда есть один неприятный момент - если в процессе работы программы приходится открыть Word напрямую, посмотреть необходимую информацию, а потом его закрыть, в программе так же возникает ошибка. В связи с этим у меня вопрос, а возможно перед запуском программы закрыть все открытые файлы Word-а и не позволять запускать его минуя программу?
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Online
|
|
« Ответ #12 : 12-11-2008 05:19 » |
|
покажите код
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Доцент
Участник
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
Молодой специалист
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!
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #15 : 19-11-2008 05:26 » |
|
Объявление Word-а у меня как раз в модуле и именно через паблик. Пробовал делать сначала nothing сначала для документа Word, а потом и для самого Word-а, но эффект один и тот же. На самом деле у меня 8 форм, каждая решает свои задачи, да и код становиться компактнее при редактировании.
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #16 : 19-11-2008 05:41 » |
|
первая строчка представленных блоков выглядит, так (не скопировалась первый раз) Set WordApp = New Word.Application Set DocWord = WordApp.Documents.Add 'создаем новый документ в экземпляре Word-а т.е. создаю сначала сам Word, а потом его документ.
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Online
|
|
« Ответ #17 : 19-11-2008 10:47 » |
|
я и спрашивал, зачем каждый раз (в каждой форме) делать Set WordApp = New Word.Application если у вас оно объявлено в модуле, да еще и паблик?
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
HandKot
Молодой специалист
Online
|
|
« Ответ #18 : 19-11-2008 11:29 » |
|
кстати такой еще вопрос перед тем как вываливается ошибка, у вас идет сохранение файла. Этот фапйл появляется?
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Доцент
Участник
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
|
|
« Ответ #20 : 19-11-2008 21:41 » |
|
После строки: WordApp.Quit Добавь строки: Set DocWord = Nothing Set WordApp = Nothing
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #21 : 20-11-2008 10:52 » |
|
Попробовал результат тот же. Как только при втором запуске документа доходит до строки DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2) 'отступ слева 2 см пишет ошибку.
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #22 : 20-11-2008 11:35 » |
|
В режиме отладки навожу курсор с строке Public WordApp As Word.Application пишет отсутствует сервер Word.Application, т.е. при вторичном его использовании обрывается с ним связь (странно). Где то слышал краем уха, что динамические библиотеки сохраняются(держаться) в памяти в единственном экземпляре. Может потому при закрытии Word-а и связь сней теряется. Слышал так же, что возможно создать экзешник библиотеки и запускать его по мере надобности. Хотя может я и не правильно что-то понял??? Но если это так, то как это сделать?
|
|
|
Записан
|
|
|
|
npak
|
|
« Ответ #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
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #24 : 20-11-2008 18:28 » |
|
В одной форме это действительно работает. Но я попробовал сделать переход к другой форме с аналогичным кодом. Ошибка таже. Возможно придется сделать главную форму, а из нее запускать экзешники остальных по одной. Тогда при их новом открытии и последующем закрытии все будет нормально. Неудобно конечно!
|
|
|
Записан
|
|
|
|
Naghual
|
|
« Ответ #25 : 20-11-2008 21:57 » |
|
Создай модуль. Опиши в нем глобальные переменные. Из него вызывай формы.
|
|
|
Записан
|
|
|
|
Доцент
Участник
Offline
|
|
« Ответ #26 : 21-11-2008 08:29 » |
|
Я пробовал так делать, результат тот же. С этого я и начинал. Файлы создаются, но отформатировать страницу или ячейки таблицы не получается. Хотя существующий файл ворда на диске можно открыть в любом месте программы и сколько угодно раз (для просмотра).Вероятно происходит какой то сбой при работе с Microsoft Word Object Library, она ведь подключается ко всему проекту один раз независимо сколько модулей или форм. Поэтому пока вижу два выхода: 1 - работать на одном ядре Word-а создавая и закрывая только документы; 2 - или делать каждую рабочую форму отдельно как экзешник и запускать их из главной, тогда все нормально.
|
|
|
Записан
|
|
|
|
|