Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Office Новый топик    Ответить
 (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
AndreyRZD
Member

Откуда:
Сообщений: 29
Уважаемые друзья доброго дня.
Посодействуйте советом. Пытаюсь сделать контекстное меню к ListBox (называется - LBNameOfObjects2) на форме в EXCEL. Всё идёт хорошо в аккурат до момента когда необходимо после произведенных манипуляций обновить ListBox, ни какие известные мне манипуляции не помогают... Существует ли в принципе такая возможность?
Немного конкретики:
Это в модуле формы
'Формируем контекстное меню обработка события
Private Sub LBNameOfObjects2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
 ByVal x As Single, ByVal y As Single)
    If Button = 2 Then
    mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0&
    mouse_event MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0&
    DoEvents
    CreateNewMenu
    End If
 End Sub
'Создаём контекстное меню для объектов строительства
Sub CreateNewMenu()
On Error Resume Next: Application.CommandBars.Add "ContextMenuListBox", msoBarPopup
Dim CBar As CommandBar, Ctrl: Set CBar = Application.CommandBars("ContextMenuListBox")
 
For Each Ctrl In CBar.Controls: Ctrl.Delete: Next
AddItemIntoPopup CBar, 1, 213, "СозданиеНовогоФилиала", "Добавить филиал"
 
CBar.ShowPopup
End Sub

Это в обычном модуле
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, _
ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
 Public Const MOUSEEVENTF_ABSOLUTE = &H8000
 Public Const MOUSEEVENTF_LEFTDOWN = &H2
 Public Const MOUSEEVENTF_LEFTUP = &H4
 Public Const MOUSEEVENTF_MIDDLEDOWN = &H20
 Public Const MOUSEEVENTF_MIDDLEUP = &H40
 Public Const MOUSEEVENTF_MOVE = &H1
 Public Const MOUSEEVENTF_RIGHTDOWN = &H8
 Public Const MOUSEEVENTF_RIGHTUP = &H10

'Функция создания контекстного меню
Function AddItemIntoPopup(ByRef Comm_Bar, ByVal CBar_Type As Integer, ByVal CBar_Face As Integer, _
ByVal On_Action As String, ByVal CBar_Caption As String, Optional ByVal Begin_Group As Boolean = False, _
Optional Tag As String = "") As CommandBarControl
Dim Add_Control
On Error Resume Next
Set Add_Control = Comm_Bar.Controls.Add(Type:=CBar_Type)
 
    With Add_Control
        If CBar_Face > 0 Then .FaceId = CBar_Face:
        .Tag = Tag: .OnAction = On_Action: .Caption = CBar_Caption: If Begin_Group Then .BeginGroup = True
    End With
End Function
'Добавление нового объекта строительства в базу данных через форму ChangeDogFRM
Public Sub СозданиеНовогоФилиала()
Dim NewObjectStroi$
    NewObjectStroi = InputBox("Введите название нового объекта - ")
   Call SQL_Editor("INSERT INTO Объекты ( [Имя объекта] )select '" & NewObjectStroi & "' ;", "ono")      
   ChangeDogFRM.LBNameOfObjects2.Clear
   LBNameOfObjects2_Zapolnenie (ChangeDogFRM.TB_ID.Value)
End Sub


Собственно проблема в последних 2-х строчках:
   ChangeDogFRM.LBNameOfObjects2.Clear 'очистка ListBox
   LBNameOfObjects2_Zapolnenie (ChangeDogFRM.TB_ID.Value)'функция в форме для заполнения ListBox из базы данных

Программа честно выполняет всё что до этого и более того не бьёт ошибок и на этих строках, но и не обновляет форму. При этом в функцию "LBNameOfObjects2_Zapolnenie" должен передаваться аргумент получаемый из заполненного поля формы, однако вместо этого уходит значение - "".
Важно отметить, что эти же две строчки помещённые на обработку события нажатия кнопки в модуле самой формы - прекрасно себя чувствуют и работают как положено.
Что и где я делаю не так? Заранее благодарен за Вашу помощь!
23 янв 18, 11:59    [21129840]     Ответить | Цитировать Сообщить модератору
 Re: (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
AndreyRZD
Member

Откуда:
Сообщений: 29
Виноват, немного опечатался, вторая строка изложена в следующей редакции
   ChangeDogFRM.LBNameOfObjects2_Zapolnenie (ChangeDogFRM.TB_ID.Value)
23 янв 18, 12:11    [21129932]     Ответить | Цитировать Сообщить модератору
 Re: (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
The_Prist
Member

Откуда: www.excel-vba.ru
Сообщений: 1834
AndreyRZD,

а нет возможности объявить Public переменную для формы? При инициализации назначаете ей значение формы:
set oUF_Public = Me

а далее просто обращаетесь именно к ней(если она запущена, конечно):
If not oUF_Public  is nothing then
   oUF_Public.LBNameOfObjects2.Clear 'очистка ListBox
   LBNameOfObjects2_Zapolnenie (oUF_Public.TB_ID.Value)'функция в форме для заполнения ListBox из базы данных
end if

Должно сработать
23 янв 18, 12:14    [21129959]     Ответить | Цитировать Сообщить модератору
 Re: (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
AndreyRZD
Member

Откуда:
Сообщений: 29
The_Prist,

Благодарю Вас! Действительно работает.
Подскажите, а возможно как-то обыграть эту ситуацию если открыто несколько экземпляров одной формы? Одной глобальной переменной я так понимаю тут уже не отделаться?
23 янв 18, 12:23    [21130025]     Ответить | Цитировать Сообщить модератору
 Re: (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19306
ChangeDogFRM - это, как я понимаю, имя класса формы? ну так с чего бы коду работать - Вы шлёте команды этой самой абстрактной форме, сиречь классу, в то время как надо работать с конкретным экземпляром.

Так что надо объявить (видимо, глобально) переменную класса формы, типа
Public MyChangeDogFRM As ChangeDogFRM

открывать её соответствующим присвоением конкретного экземпляра
Set MyChangeDogFRM = New ChangeDogFRM
MyChangeDogFRM.Load ' или Show? а, разберёшься...

и в коде адресоваться именно к этому конкретному экземпляру
MyChangeDogFRM.LBNameOfObjects2.Clear 'очистка ListBox
23 янв 18, 12:33    [21130079]     Ответить | Цитировать Сообщить модератору
 Re: (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19306
Если надо несколько форм - объявите несколько переменных (а то и массив...).
23 янв 18, 12:35    [21130091]     Ответить | Цитировать Сообщить модератору
 Re: (VBA) Обращение к элементу активной формы из стандартного модуля(не из модуля самой формы)  [new]
AndreyRZD
Member

Откуда:
Сообщений: 29
Akina,

Спасибо! Очень признателен Вам за ответ.
23 янв 18, 13:43    [21130450]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Office Ответить