![]() |
|
Модераторы: Akina |
![]()
|
|
| renza |
|
|||
|
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 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 9.9.2003 Где: Minsk Репутация: 4 Всего: 4 |
Что-то похожее у меня было, но у меня все прекрасно выгружалось, только потом я не мог екселевские файлы открывать
А в твоем случае попробуй:
|
|||
|
||||
| Black_Star |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 9.9.2003 Где: Minsk Репутация: 4 Всего: 4 |
Это сообщение отредактировал(а) Black_Star - 14.9.2003, 21:53 |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
У меня та же проблема!
А способ Black_Star, по-моему, не подходит - вдруг Excel еще просто так открыт? пользователем? Можно ведь не то закрыть! |
|||
|
||||
| renza |
|
|||
|
Unregistered |
Всем привет.
Спасибо Black_Star за ответ. Я все таки поборол эту проблему. Похоже дело в том, что при таком коде (мое первое сообщение, листинг) каким то образом путаются ссылки и мы закрываем не то что открывали ... В итоге получилось вот что:
Вроде ничего не изменил, но работать стало правильно Еще хотел добавить по поводу ответа Black_Star`а Можно не ползоваться функцией FindWindow, у Application есть свойство HWND, которое как раз и возвращает дескриптор окна. В WinAPI я не силен, поэтому для меня осталось непонятным - у нас нет окна как такового у нас есть процесс, который на экране никак не видно - должен ли в этом случае этот способ работать. Я пробовал - FindWindow ничего не возвращает, Application.HWND возвращает, но PostMessage с этим hwnd не дает никаких результатов (я думаю - Application.HWND возвращает старый дескриптор, когда окно еще было видно ...) |
|||
|
||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: 2 Всего: 34 |
В таком случае необходимо искать Process и убивать его. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: нет Всего: 6 |
Не надо хитрить. Это приведёт только к новым коллизиям. Проверьте код (хотя ошибку я так понял уже нашли). Есть штатный способ освободить 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 видимым. И закрыть окно. Процесс не исчезнет, так как останутся ссылки на Вашу программу. |
|||
|
||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: 2 Всего: 34 |
RAN ты не понял, искать Proc. необходимо если
|
|||
|
||||
![]()
|
| Правила форума "VB6" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB6 | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |