Не выгружается? WINWORD...

Программирование на Visual Basic for Applications
Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Не выгружается? WINWORD...

Сообщение Osteon » 11.02.2013 (Пн) 15:49

Здравствуйте.
Такой вот глюк у меня (или у программы?) ;)

Задача - распечатка кассового ордера в WORD'е. По сути дела, программе нужно только заполнить таблицу.

Делаю следующую процедуру:

Код: Выделить всё
Private Sub cmdPrint_Click()

    Dim WordApp As Word.Application       'экземпляр приложения
    Dim DocWord As Word.Document          'экземпляр документа
    Dim r As Range, tbPKO As Word.Table
   
    Set WordApp = New Word.Application    'создаём экземпляр Word-a
    Set DocWord = WordApp.Documents.Open(App.Path & "\Dokument\PKO.docx") 'открываем имеющийся документ
    Set tbPKO = ActiveDocument.Tables(1)
   
     'определяем видимость Word-a
    WordApp.Visible = False
   
    '*************************************************
    '* здесь часть кода вырезал, чтоб не засорять.   *
    '* это заполнение таблиц, все работает правильно *
    '*************************************************
   
    DocWord.Activate    'активируем документ
       
    'Печатаем документ
    WordApp.PrintOut Range:=wdPrintAllDocument, Item:=wdPrintDocumentContent, _
                    Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
                    Collate:=True, Background:=True, PrintToFile:=False
       

    'закрываем документ (без запроса на сохранение, и не сохраняя документ)
    DocWord.Close wdDoNotSaveChanges
    'закрываем Word (без запроса на сохранение)
    WordApp.Quit True
   
    'уничтожаем обект - документ
    Set DocWord = Nothing
    'уничтожаем обьект - Word
    Set WordApp = Nothing

End Sub

Ничего нового, все стандартно.

Когда запускаю процедуру в первый раз все работает отлично, документ распечатывается так, как задумано и сделано.

А потом, при повторной распечатке начинается:

1. Выходит ошибка "462" - см. scr0 в приложении.
2. При попытке отладки на экране выделяется строка с активацией таблицы (см. scr1)

Понять, соответственно, ничего не могу... При нажатии Ctrl+Alt+del в ОС WinXp SP3 процесс WINWORD висит в памяти... (см. scr3) Когда нахально выгружаешь процесс из памяти, тогда снова все работает, как в первый раз, а при повторых попытках распечатать документ та же цикличность...

При 3-й попытке распечатать документ из программы выходит уже вот что - см. scr2

Это почему все так? И как с этим бороться? Намекните... :(
Вложения
scr.rar
(170.07 Кб) Скачиваний: 188

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 11.02.2013 (Пн) 15:59

Еще обратил внимание - как только выходишь из моей программы, написанной на VB6, снова все начинает работать, все распечатывается. Но как только пытаешься распечатать повторно документ, не выходя из программы, снова та же песня... Логично предположить, что что-то где-то я неправильно чищу, но все просматривал - не нахожу... VBA для меня вообще темный лес, я первый раз с ним работаю...

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 19.02.2013 (Вт) 10:36

Не лЮбите вы меня... :cry:

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не выгружается? WINWORD...

Сообщение FireFenix » 19.02.2013 (Вт) 12:40

До выхода из Word'a попробуй закрывать Workbook, а потом его самого.

А вообще лучше бы выложил неработающий пример, было бы быстрее.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 20.02.2013 (Ср) 11:11

FireFenix писал(а):До выхода из Word'a попробуй закрывать Workbook, а потом его самого.

А что такое Workbook? :oops:

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не выгружается? WINWORD...

Сообщение FireFenix » 20.02.2013 (Ср) 12:58

Osteon писал(а):
FireFenix писал(а):До выхода из Word'a попробуй закрывать Workbook, а потом его самого.

А что такое Workbook? :oops:

Я ошибся, перепутал с Document. Значит вроде всё верно.

Лучше выложи исходник или ту рабочую вырезанную часть где виснет.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 21.02.2013 (Чт) 7:18

FireFenix писал(а):Лучше выложи исходник или ту рабочую вырезанную часть где виснет.

В том-то и дело, что нигде не виснет! Отрабатывает все верно, печатает все верно, но - только ОДИН (!) раз. :( Но при попытке повторной распечатки, не выходя из программы, возникает все вышеуказанное...
В приложении - тот документ, который печатаю. Работаю с MS Office 2007

Весь код ниже:
Код: Выделить всё
Private Sub cmdPrint_Click()

If Trim(txtSum.Text) = "" Or Trim(txtSum.Text) = 0 Then
   MsgBox "Вы не внесли сумму платежа!", vbCritical, "Ошибка записи"
   txtSum.SetFocus:     Exit Sub
End If

Dim dtPart As Date:    dtPart = DatePart("m", dtPKO.Value) 'месяц даты платежа
Dim monName As String                 'название месяца

Dim WordApp As Word.Application       'экземпляр приложения
Dim DocWord As Word.Document          'экземпляр документа
Dim r As Range, tbPKO As Word.Table

Set WordApp = New Word.Application    'создаём экземпляр Word-a
Set DocWord = WordApp.Documents.Open(App.Path & "\Dokument\PKO.docx") 'открываем имеющийся документ
Set tbPKO = ActiveDocument.Tables(1)

If MsgBox("Таблиц - " & DocWord.Tables.Count, vbDefaultButton2 + vbYesNo, "") = vbNo Then Exit Sub
'определяем видимость Word-a: True - видимый, False - невидимый (работает только ядро)
WordApp.Visible = False

'перевод порядкового номера месяца в его название
Select Case dtPart
       Case 1: monName = "января"
       Case 2: monName = "февраля"
       Case 3: monName = "марта"
       Case 4: monName = "апреля"
       Case 5: monName = "мая"
       Case 6: monName = "июня"
       Case 7: monName = "июля"
       Case 8: monName = "августа"
       Case 1: monName = "сентября"
       Case 10: monName = "октября"
       Case 11: monName = "ноября"
       Case 12: monName = "декарбя"
End Select
   
'заполнение приходного кассового ордера
tbPKO.Cell(13, 2).Range.Text = lblNum.Caption     'номер документа
tbPKO.Cell(13, 3).Range.Text = dtPKO.Value          'дата составления документа
tbPKO.Cell(19, 6).Range.Text = txtSum.Text         'сумма платежа
tbPKO.Cell(21, 2).Range.Text = FamIO                  'Фамилия, И.О.
tbPKO.Cell(23, 2).Range.Text = cboOsn.Text         'основание платежа
tbPKO.Cell(25, 2).Range.Text = razSum(54, 1)       'сумма платежа прописью
tbPKO.Cell(27, 1).Range.Text = razSum(54, 2)       'сумма платежа прописью

'заполнение квитанции к ПКО
tbPKO.Cell(9, 8).Range.Text = lblNum.Caption       'номер документа
tbPKO.Cell(10, 8).Range.Text = Day(Date)
tbPKO.Cell(10, 10).Range.Text = monName
tbPKO.Cell(10, 12).Range.Text = Year(Date)
tbPKO.Cell(12, 9).Range.Text = FamIO                  'Фамилия, И.О.
tbPKO.Cell(14, 7).Range.Text = cboOsn.Text         'основание платежа
tbPKO.Cell(19, 14).Range.Text = txtSum.Text       'сумма платежа
tbPKO.Cell(21, 7).Range.Text = razSum(39, 1)       'сумма платежа прописью
tbPKO.Cell(23, 7).Range.Text = razSum(39, 2)       'сумма платежа прописью
tbPKO.Cell(27, 10).Range.Text = Day(Date)
tbPKO.Cell(27, 12).Range.Text = monName
tbPKO.Cell(27, 14).Range.Text = Year(Date)


DocWord.Activate    'активируем документ
   
'Печатаем документ
WordApp.PrintOut Range:=wdPrintAllDocument, _
                Item:=wdPrintDocumentContent, _
                Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
                Collate:=True, Background:=True, PrintToFile:=False


'закрываем документ (без запроса на сохранение, и не сохраняя документ)
DocWord.Close wdDoNotSaveChanges
'закрываем Word (без запроса на сохранение)
WordApp.Quit True

'Set tbPKO = Nothing
'уничтожаем обект - документ
Set DocWord = Nothing
'уничтожаем обьект - Word
Set WordApp = Nothing

Set rsPKO = New ADODB.Recordset
sSQL = "SELECT * FROM PKO ORDER BY nPKO"

With rsPKO
    .Open sSQL, cnDB, adOpenStatic, adLockPessimistic
    .AddNew
    .Fields("nPKO") = lblNum.Caption:     .Fields("nKart") = numKart
    .Fields("osnPlat") = IIf(cboOsn.ListIndex = -1, 0, cboOsn.ListIndex)
    .Fields("DaPKO") = dtPKO.Value:       .Fields("Summa") = Trim(txtSum.Text)
    .Update:   .Close
    dbChange = True
End With

monName = "":  FamIO = ""

cmdExit_Click 'конец печати, выгрузка формы

End Sub

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 21.02.2013 (Чт) 7:19

Для повторной распечатки приходника нужно сначала выйти из программы в винду, потом снова войти и печатать...

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 21.02.2013 (Чт) 7:50

Извините, по запарке не выложил документ... :
Вложения
PKO.rar
(17.4 Кб) Скачиваний: 173

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не выгружается? WINWORD...

Сообщение FireFenix » 21.02.2013 (Чт) 14:38

Osteon писал(а):Весь код ниже:

Osteon писал(а):Извините, по запарке не выложил документ... :

Вы выложили шаблон и код. Причём код, который ещё связан с другими модулями.
Т.к. мы не разбираемся в твоём проекте, то нужно было выло выложить сам проект, который открывается средой и из которого вычикрыжено всё не нужно для получения и выявления ошибки.
Темболее раздел VBA и не поняно, используешь ли ты из VB6 VSTO или через макросы VBA.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 22.02.2013 (Пт) 8:05

FireFenix писал(а):Темболее раздел VBA и не поняно, используешь ли ты из VB6 VSTO или через макросы VBA.

Никаких макросов, я все делаю из самого проекта. А что такое
VSTO
? :oops:
FireFenix писал(а):выложить сам проект, который открывается средой и из которого вычикрыжено всё не нужно

Понял, буду вычикрыживать, позже выложу.

С наступающим!

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 22.02.2013 (Пт) 11:59

Вычикрыжить оказалось сложнее, чем написать новый. Все в этом проекте скопировано из основного. Вот, собственно:
Вложения
PKO.rar
(136.27 Кб) Скачиваний: 182

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не выгружается? WINWORD...

Сообщение FireFenix » 24.02.2013 (Вс) 1:29

Вобщем если выкладываешь проект, то лучше ещё к нему выкладывать подключаемые библиотеки. DataPiker вроде не стандартный, да и с VSTО пришлось пострадать мазохизмом.
Вместо MSWord 9.0 библиотеки, прикрутил библиотеку от 2013 оффиса.

Osteon писал(а):
Код: Выделить всё
Set DocWord = WordApp.Documents.Open(App.Path & "\Dokument\PKO.docx") 'открываем имеющийся документ
Set tbPKO = ActiveDocument.Tables(1)

Вместо ActiveDocument лучше всего использовать нормальный прямой путь
Код: Выделить всё
Set DocWord = WordApp.Documents.Open(App.Path & "\Dokument\PKO.docx") 'открываем имеющийся документ
Set tbPKO = DocWord.Tables(1)


Для тестов спецом включил
Код: Выделить всё
Set WordApp = New Word.Application    'создаём экземпляр Word-a
WordApp.Visible = True

После N-го неудачного старта с новой библиотекой, ворд сам не хотел ничего делать, а ждал указания юзера к действиям. Типа документ PKO неправильно закрыт, восстановить ли документ и т.д.
После того как всю чушь поубирал, то всё нормально работает с первого раза с Visible = True и False.
Печатал естесно в файл, так как принтер не установлен. Раз 5-8 жмякнул - сохранило без проблем и WINWORD в процессах не висит

Так что можно сделать вывод, что код пашет.
Единственное что нужно, это добавить обработку ошибок/исключений самого Word'a или вручную всё это фиксить
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 25.02.2013 (Пн) 14:35

FireFenix писал(а):После того как всю чушь поубирал,

А что входит в чушь? :oops:
FireFenix писал(а):добавить обработку ошибок/исключений самого Word'a или вручную всё это фиксить

Это делается макросами, или в самом VB командой On Error Goto [метка], затем обработка ошибки?
FireFenix писал(а):Вместо MSWord 9.0 библиотеки, прикрутил библиотеку от 2013 оффиса.

Мне офис переустанавливать на 2-13-й? :o
FireFenix писал(а):с VSTО пришлось пострадать мазохизмом

Что такое VSTO? :oops:

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 25.02.2013 (Пн) 14:39

FireFenix писал(а):DataPiker вроде не стандартный

Из обыкновенного mscomct2.osx- брал

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 26.02.2013 (Вт) 5:49

Странно... Я ничего не подгружал, только заменил Set tbPKO = ActiveDocument.Tables(1) на Set tbPKO = DocWord.Tables(1), и все заработало... Я правда, жесткого прогона не делал, времени не было, но предварительно все ОК...
Я так понимаю, что в моем варианте выгружался активный документ, но не выгружался сам экземпляр документа, а в вашем - выгружается сам экземпляр? Или я чего-то как-то не так мыслю?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не выгружается? WINWORD...

Сообщение FireFenix » 26.02.2013 (Вт) 20:20

tbPKO это же таблица, обращение к ней ничего не имеет с выгрузкой.
Но вот при загрузки Word'a фиг его знает какой активный документ, может какой-то левак ещё настройками прогружается... А Set tbPKO = DocWord.Tables(1) прямая ссылка то что мы открываем
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Не выгружается? WINWORD...

Сообщение Osteon » 27.02.2013 (Ср) 13:06

FireFenix писал(а):Но вот при загрузки Word'a фиг его знает какой активный документ, может какой-то левак ещё настройками прогружается... А Set tbPKO = DocWord.Tables(1) прямая ссылка то что мы открываем

По видимому, так и есть... ОГРОМНОЕ спасибо за помощь! :D


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList