Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выгружается Excel, из списка процессов 
:(
    Опции темы
renza
Дата 12.9.2003, 17:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Задача коротко такая:
Есть самописная форма в MS Outlook. Данные в нее должны загружаться из экселевского файла. Причем эти данные надо перед внесением в форму отсортировать - т.е. как то изменить файл, а потом закрыть без записи.
Все получилось и работает. Выглядит следующим образом:

Sub GetCategoriesFromFile(fileName As String)
Dim xlApp As New Excel.Application
xlApp.Visible = False
xlApp.Workbooks.Open fileName '"C:\work\Makros\project.xls"
With xlApp.Workbooks.Item(1).Worksheets.Item(1)
......................................................
' делаем необходимое с данными
......................................................
End With
xlApp.Workbooks.Item(1).Close SaveChanges:=False
xlApp.Quit
Set xlApp = Nothing
End Sub


И тут начинаются глюки (т.е. когда макрос уже отработал). Оказывется Excel и вообще WorkBook с этим самым открытым файлом остался в процессах (Ctrl+Alt+Del , TaskManager). Файл занят приложением. А еще прикол - если попытаться открыть другой экселевский файл (кликнуть в Проводнике), то Excel откроется, но WorkBook не видим. То есть клиентская часть MDI формы просто прозрачная - во как!
Бился пол дня - так ничего и не понял.
Win2000Pro, MS Office XP (на 2000 то же самое).
Подскажите в чем дело-то....


  Вверх
Black_Star
Дата 14.9.2003, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



Что-то похожее у меня было, но у меня все прекрасно выгружалось, только потом я не мог екселевские файлы открывать smile.gif
А в твоем случае попробуй:

Цитата
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_CLOSE = &H10
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Command1_Click()
Dim e as Long
e = FindWindow("XLMAIN","Microsoft Excel - Книга 1")
If e Then PostMessage e, WM_CLOSE, 0, 0
End Sub

PM ICQ   Вверх
Black_Star
Дата 14.9.2003, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



smile.gif

Это сообщение отредактировал(а) Black_Star - 14.9.2003, 21:53
PM ICQ   Вверх
Guest
Дата 16.9.2003, 20:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У меня та же проблема!
А способ Black_Star, по-моему, не подходит - вдруг Excel еще просто так открыт?
пользователем? Можно ведь не то закрыть! notify.gif
  Вверх
renza
Дата 18.9.2003, 09:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем привет.
Спасибо Black_Star за ответ.
Я все таки поборол эту проблему. Похоже дело в том, что при таком коде (мое первое сообщение, листинг) каким то образом путаются ссылки и мы закрываем не то что открывали ...
В итоге получилось вот что:

Цитата
Sub GetCategoriesFromFile(fileName As String)
    Dim xlApp As Excel.Application
    Dim xlWB As Excel.WorkBook
    Dim xlWSh As Excel.WorkSheet

    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
    Set xlWB = xlApp.Workbooks.Open(fName)
    ' xlWB.RunAutoMacros xlAutoOpen ' работает и с этой строкой и без нее
    Set xlWSh = xlWB.ActiveSheet
......................................................
' делаем необходимое с данными
' НО доступ к Range и Cells получаем через xlWSh !!!
......................................................
        xlWB.Close SaveChanges:=False
        xlApp.Quit
        Set xlApp = Nothing
End Sub

Вроде ничего не изменил, но работать стало правильно

Еще хотел добавить по поводу ответа Black_Star`а
Можно не ползоваться функцией FindWindow, у Application есть свойство HWND, которое как раз и возвращает дескриптор окна. В WinAPI я не силен, поэтому для меня осталось непонятным - у нас нет окна как такового у нас есть процесс, который на экране никак не видно - должен ли в этом случае этот способ работать. Я пробовал - FindWindow ничего не возвращает, Application.HWND возвращает, но PostMessage с этим hwnd не дает никаких результатов (я думаю - Application.HWND возвращает старый дескриптор, когда окно еще было видно ...)

  Вверх
Mephisto
  Дата 18.9.2003, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата
PostMessage с этим hwnd не дает никаких результатов

В таком случае необходимо искать Process и убивать его.
PM   Вверх
RAN
Дата 18.9.2003, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: нет
Всего: 6



Цитата
PostMessage с этим hwnd не дает никаких результатов

В таком случае необходимо искать Process и убивать его.


Не надо хитрить. Это приведёт только к новым коллизиям. Проверьте код (хотя ошибку я так понял уже нашли). Есть штатный способ освободить Excel от связи с программой. Это присвоение Nothing. Такая операция вызывает Release и объект освобождается.

P.S. Как это работает. Это называется COM. Технология взаимодействия между программами. Вы пишете Dim xlApp As New Excel.Application или CreateObject("Excel.Application") и в память загружается Excel, если он не загружен. Вы связали xlApp с объектом Excel.Application. Excel это запоминает, увеличив специальную внутреннюю переменную на 1. Мол, ещё одной проге я нужен. Это называется подсчётом ссылок. Потом вы пишете Set xlWB = xlApp.Workbooks.Open(fName). Excel опять увеличивает кол-во ссылок на 1. И при каждом присвоении Nothing счётчик будет уменьшаться на один. Когда он обнулиться, Excel выгрузиться.
Так что даже если сделать Excel видимым. И закрыть окно. Процесс не исчезнет, так как останутся ссылки на Вашу программу.
PM MAIL ICQ   Вверх
Mephisto
  Дата 18.9.2003, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



RAN ты не понял, искать Proc. необходимо если
Цитата
у нас нет окна как такового у нас есть процесс, который на экране никак не видно - должен ли в этом случае этот способ работать. Я пробовал - FindWindow ничего не возвращает, Application.HWND возвращает, но PostMessage с этим hwnd не дает никаких результатов

exclamation.gif exclamation.gif exclamation.gif
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1624 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.