Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2009, 11:39   #1
hackPNZ
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 29
По умолчанию И снова закрытие файлов Word...

Доброго времени суток!!! Никак не могу победить закрытие вордовских документов посредством макроса.

У меня из экселевской книги запускается макрос, который должен заполнить или обновить документ ворд и сохранить его.
код примерно такой(код экспериментальный, поэтому всяких with нет):

Код:
    st = "С:\Документ.doc"
    fOpenName = "Документ.doc"

    On Error Resume Next
    Set wrd = GetObject(, "Word.Application")
    
    If wrd.Documents(fOpenName) Is Nothing Then

        Set wrd = CreateObject("Word.Application")
        wrd.Documents.Add(st).Activate
        wrd.Visible = True
        Set wrd = wrd.ActiveDocument

    Else
        Set wrd = wrd.Documents(fOpenName)
        
        wrd.Application.DisplayAlerts = wdAlertsNone
        wrd.SaveAs toSave
        wrd.Application.DisplayAlerts = wdAlertsAll
        wrd.Application.Quit
       
        Set wrd = CreateObject("Word.Application")
        wrd.Documents.Add(st).Activate
        wrd.Visible = True
        Set wrd = wrd.ActiveDocument
    End If
    On Error GoTo 0
Проблемы следующего характера. Иногда файл документа уже сохраненный и временный из макроса открываются как новое приложение ворд (в таск менеджере при этом видим два WINWORD.EXE).

В таком случае код считает что файл не открыт, создает новый документ, а сохранить под нужным именем не может - ошибка 5356 "Файл занят другим процессом". Как срубить этот документ в другом приложении через макрос, непонятно... Причем глюк время от времени проявляется как при открытии документа вручную, так и при создании документа через макрос...
hackPNZ вне форума Ответить с цитированием
Старый 20.11.2009, 12:03   #2
hackPNZ
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 29
Подмигивание

по ходу разборов полетов появилось интересное замечание.

Предположим ситуация: у меня открыт целевой "Документ.doc" и еще какой-либо посторонний документ "Doc2" в котором есть несохраненные изменения.

Теперь я хочу закрыть все документы и обновить "Документ.doc" через макрос. Если я не положу строчку "wrd.Application.Quit" в область с отключенными алертами (как в моем примере), то при выполнении макроса в Doc2 появляется окно "Сохранить изменения?", но макрос не приостанавливается. В результате, ошибка (пока я думал сохранять или нет, макрос все пролопатил и вывалил ошибку 5356, т.к и целевой документ остался открыт).

Если же поместить строку "wrd.Application.Quit" в область с wdAlertsNone, то ворд опять же спросит при выполнении макроса, сохранять документ Doc2 или нет, но при этом приостановит макрос, дождется моего решения, закроет целевой документ и нормально его обновит. Вот такая "фича".

Сорри если объяснил не вполне понятно, не знаю как проще объяснить на пальцах.
hackPNZ вне форума Ответить с цитированием
Старый 20.11.2009, 12:12   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Попробуй не создавать приложение и потом открывать в нем документ, а сразу открывать документ:
Код:
Set wrd = CreateObject(st)
В таком случае, если документ уже открыт, то ты получишь его, а если документ закрыт, то он будет открыт в уже запущенном приложении. Если же и приложение не запущено, то оно будет запущено.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 20.11.2009, 15:43   #4
hackPNZ
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 29
По умолчанию

Спасибо большое за совет))) Как всегда помогаете))) Очень элегантное решение! Сейчас протестил, вроде норм, надеюсь так будет и дальше)))

Вот что у меня получилось:

Код:
    'если мы хотим перезаписать/впервые создать документ из шаблона
    st="С:\договор.dot"
    toSave = "С:\договор.doc" 
    fOpenName = "договор.doc"

    If task = "create" Then 
                                    
        On Error Resume Next
        Set wrd = GetObject(, "Word.Application")
        
        'if file is closed
        If wrd.Documents(fOpenName) Is Nothing Then
        On Error GoTo 0
            
            Set wrd = CreateObject(st) 
            With wrd
                .Parent.Visible = True
                .Application.DisplayAlerts = wdAlertsNone
                .SaveAs toSave
                .Application.DisplayAlerts = wdAlertsAll
            End With
           
        'if file is opened
        Else
            
            With wrd
                .Application.DisplayAlerts = wdAlertsNone
                .Documents(fOpenName).Close SaveChanges:=wdSaveChanges
                .Application.DisplayAlerts = wdAlertsAll
            End With
            
            Set wrd = CreateObject(st)
            With wrd
                .Parent.Visible = True
                .Application.DisplayAlerts = wdAlertsNone
                .SaveAs toSave
                .Application.DisplayAlerts = wdAlertsAll
            End With
        
        End If
    'если мы хотим обновить документ
    'st="С:\договор.doс"
    
    ElseIf task = "edit" Then

        Set wrd = CreateObject(st)
        wrd.Parent.Visible = True
    Else
        MsgBox errmsgs.errMsg(1), vbCritical
        Exit Sub
    End If
hackPNZ вне форума Ответить с цитированием
Старый 25.11.2009, 18:12   #5
hackPNZ
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 29
По умолчанию

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

То есть, из основной экселевской книги(Книга1) нужно обратиться и взять данные к файлу Книга2. Я пишу код, аналогичный коду для вордовских документов:

Для экселя пишу:
Код:
Public Function xlsUpdate(ByVal xlsPath As String) As Object
    Set xls = CreateObject(xlsPath)
    xls.Parent.Visible = True
    Set xlsUpdate = xls
End Function
Тестил построчно в дебаггере это дело. В итоге получается так, что при выполнений строки Set xls = CreateObject(xlsPath) у меня вместо активной Книга1 в окне почему-то появляется Книга2(и заголовок окна эксель изменяется на имя книги2). Книга1 остается висеть в том же Application, но такое ощущение, что к ней применили visible = false.

Затем, при переходе к следующей строчке кода, опять появляется книга1, а вот заставить показаться Книга2 нереально. Но она 100% не закрывается, т.к. если я попытаюсь закрыть окно экселя, то программа спросит, "сохранить Книга2?"

Пробовал всякие "visible" применять, толку ноль. Пробовал с разными пустыми табличками выполнить код, всегда один и тот же эффект.

Пока что открываю книгу2 через Workbooks.Open, но бывает выскакивает старая проблема - запускается новый EXCEL.EXE, соответственно косяки при сохранении Книги2. Выскакивает нечасто, надо сказать, но и понять что к этому приводит не могу...

Можете что-то посоветовать? достала уже эта фигня...
hackPNZ вне форума Ответить с цитированием
Старый 27.11.2011, 12:37   #6
Lubocka
Пользователь
 
Регистрация: 02.02.2010
Сообщений: 11
По умолчанию

Очень помогла эта тема. Спасибо
Lubocka вне форума Ответить с цитированием
Старый 29.11.2011, 11:04   #7
Lubocka
Пользователь
 
Регистрация: 02.02.2010
Сообщений: 11
По умолчанию

А можно еще пример с Excel.
В ворде отлично, а в екселе никак не получается
Lubocka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
И снова вопрос про автозаполнение документов Word hackPNZ Microsoft Office Word 4 20.10.2009 14:45
Работать в Word, не открывая документы (работа с закрытыми документами Word) Георгиевич Microsoft Office Word 10 07.09.2009 11:19
Как создать БД в SQL из word файлов Dennikid SQL, базы данных 13 09.11.2008 13:07
проблема внедрения в базу paradox файлов word и jpg ghost_7_7_7 БД в Delphi 1 30.01.2008 16:44