powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Excel VBA не любит Access, ...
16 сообщений из 16, страница 1 из 1
Excel VBA не любит Access, ...
    #39196272
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... или у меня сегодня лыжи не едут?

Пытался в качестве библиотеки EXCEL VBA проекта подключить MDB-шку, говорит невкусно!

Ладно, подключил библиотеку Access, далее:
Код: vbnet
1.
2.
3.
4.
5.
6.
    With New Access.Application
        .OpenCurrentDatabase Workbooks(1).Path & "\FileName.mdb"
        .Visible = True
        .DoCmd.OpenForm "frmName"
        Set frm = .Forms("frmName").Form
    End With



Access, форма открываются, вопросов нет.

А вот при попытке подписаться на события интерфейса Form:
Код: vbnet
1.
Private WithEvents frm As Access.Form


опять получаю фиг вам на строке:
Код: vbnet
1.
Set frm = .Forms("frmName").Form


Без подписки на события - все гуд.
(модуль правильный)

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

Спасибо.
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196286
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared, добрый вечер

Попробовал связку в Access 2010 + Excel 2010.
В Excel поставил ссылку на библиотеку Access 14.

В модуль листа положил код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Option Explicit
Private WithEvents frm As Access.Form


Sub Кнопка1_Щелчок()
    With New Access.Application
        .OpenCurrentDatabase "C:\Users\Vakshul\Documents\Access\Lib\Lib.accdb"
        .Visible = True
        .DoCmd.OpenForm "Form1"
        Set frm = .Forms("Form1").Form
    End With
End Sub

Private Sub frm_Close()

End Sub



По закрытии формы сработал перехват события frm_Close.

Наверно вопрос излишний, но все же:
Private WithEvents frm As Access.Form
должно быть в модуле класса. Не в этом дело?
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196287
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл сказать,
в той форме, на обработчик закрытия которой я подписался, OnClose должен быть установлен в "[Event Procedure]".
иначе действительно событие не вызывается

на mdb тоже проверил - работает
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196296
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей, доброго утра.

Вот ведь в чем и засада.

И модуль правильный,
и у формы модуль имеется,
и "[Event Procedure]" на OnClose имеется,
а лыжи не едут.
:)

Automation Error на Set frm=..., и хоть ты тресни.

Я уж и Excel-евский файлик поменял, и Access-ный на пустышку с одной формой.
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196297
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил на виртуалке с 2007 - работает.
Значит у меня офис приболел.
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196373
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

вот, вспомнил, давно дело было :)
когда писали в 2000-ом, то при работе с библиотечной базой, были какие-то проблемы, если имя проекта(не имя файла, а именно именно имя проекта - то, что задается в редакторе кода в свойствах) было указано на русском. Проблемы исчезали, если не использовать кириллицу. По-моему, это как раз тот случай.
В 2010-ом сейчас этого не наблюдаю, но тогда было.

Кстати, проекты скомпилированы?
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196391
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эти хохмочки я еще пока помню :)

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

Даже имена листов и модулей листов переписал по-аглицки.
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196396
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

да, не понятно. Вроде уже ни к чему не придерешься.
ну раз что попробовать заменить New Access.Application на CreateObject
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196400
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал, не помогает.

Все так-же Automation Error -2147220990 (80040202)
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196477
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Если гора не идет ..." (с)
Пока наметился такой изворот,
в некотором плане даже более удобный.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private WithEvents btn As Office.CommandBarButton
Private WithEvents btnShow As Office.CommandBarButton

Private Sub btn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    With ActiveCell
        .Value = btn.Application.Forms("Prices").Form.Name
        Cells(.Row + 1, .Column).Activate
    End With
End Sub

Private Sub btnShow_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    With CreateObject("Access.Application")
        .OpenCurrentDatabase Workbooks(1).Path & "\Library.mdb"
        .DoCmd.OpenForm "Prices"
        With .CommandBars.Add("Excel Automation", 4, , True)
            Set btn = .Controls.Add(1, , , , True)
            With btn
                .Caption = "Return Result"
                .Style = 2
            End With
            .Protection = msoBarNoChangeDock + msoBarNoCustomize
            .Visible = True
        End With
        
        .Visible = True
    End With
End Sub

Private Sub Workbook_Open()
    With Application.CommandBars.Add("Access", 4, , True)
        Set btnShow = .Controls.Add(1, , , , True)
        With btnShow
            .Caption = "Show Access"
            .Style = 2
        End With
        .Protection = msoBarNoChangeDock + msoBarNoCustomize
        .Visible = True
    End With
End Sub

...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196485
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а события формы btn.Application.Forms("Prices") ловятся?
вроде в этом была цела?
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196501
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет.
Не дает подписаться с событиями, ни на форму, ни на ее кнопки.

В новом варианте они (подписки на форму, ее контролы) и не нужны.
Я получаю ссылку на форму через ссылку на кнопку CommandBar-а.
При закрытии формы Access.Application благополучно сам падает.

В Access-проекте вообще ничего менять не нужно.
Это пока ободряет. :)
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196590
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей, я вот тут думаю, как можно обойти этот глюк, когда события форм библиотечного файла mdb отслеживать надо, но возможности такой нет, как у вас.

Excel у вас не позволяет слушать события Access, но если у вас из Access возможно слушать события листа книги Excel, то можно сделать следующее.

В библиотечном файле mdb создать класс наподобие clsAppMonitor, который я высылал раньше. Т.е. сделать систему мониторинга событий форм приложения(если использовать мой clsAppMonitor, то его нужно будет расширить дополнительными событиями, это несложно).
Класс clsAppMonitor следит за событиями форм и в ответ генерирует свои события. Так вот, если вы в clsAppMonitor(или, лучше в подписчика на события этого класса, какую-нибудь служебную скрытую форму) закинете объектную переменную типа Worksheet(технологический скрытый от пользователя лист), то вот что это дает. Когда clsAppMonitor генерирует какое-нибудь событие, например, Current, то вы из Access на этом событии вбрасываете в Worksheet, например, в ячейку "A1" значение, идентифицирующее происходящее событие(например, "Current"), а в "B1" идентификатор формы (например, дескриптор ее окна). На это уже сам Excel отвечает генерацией события листа Change. А вы уже из Excel, заранее подписавшись на этой событие, слушайте его, анализируйте, что же именно было вброшено в служебные ячейки "A1" и "B1", ну и собственно интерпретируете и делайте выводы.

Т.е. таким образом можно организовать indirect подписку на нужные события форм.
Короче, целое дело :)
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39196646
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лихо закручен сюжетик. :)

На самом деле, мне от формы нужно было только Close,
по которому я собирался читать данные и валить инстанс Access.Application.

Но, поскольку он (инстанс) сам замечательно валится в новой версии,
несмотря на живую ссылку на кнопку его-же CommandBar-а,
(чего не было с сылкой на форму без подписки),
вопрос разрешился как-бы сам собой.

Да и наличие специально обученной кнопочки, созданной прямо из Excel проекта,
более usability friendly, и абсолютно не вмешивается в логику самого Access проекта,
что мне очень симпатично, поскольку Access проект и сам по себе работать должен.

зы: Я не пробовал (за ненадобностью), но, возможно,
получилось бы подписаться на ивенты любимиго мной ToolBar-а в форме.
Но уже лень. :)

Спасибо.
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39197148
PredeclaredНа самом деле, мне от формы нужно было только Close
А что мешает открыть форму в режиме acDialog? Тогда и ловить событие Close не потребуется.
...
Рейтинг: 0 / 0
Excel VBA не любит Access, ...
    #39197420
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мое видение usability friendly концепции построения пользовательского интерфейса.
:)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Excel VBA не любит Access, ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]