Вызов процедуры, как параметра

Программирование на Visual Basic for Applications
Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Вызов процедуры, как параметра

Сообщение Евгений Д. » 20.02.2008 (Ср) 20:11

Народ, у меня есть форма, например, с 3 кнопками. Мне надо программно имитировать их нажатие, но я не хочу это делать индивидуально для каждой кнопки, вызывая
Код: Выделить всё
call CommandButton1_Click
и т. д., а передавая имя контрола в качестве параметра в некую функцию. Вопрос, как запустить само событие клика на кнопке. Я понимаю, что это должно быть что-то типа callback вызова, но как его организовать в конфе не нашел. Если это не возможно из VBA, то, может, есть путь через API-вызов? Подскажите.
Последний раз редактировалось Евгений Д. 21.02.2008 (Чт) 17:16, всего редактировалось 1 раз.

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 21.02.2008 (Чт) 13:45

Совсем забыл про
Код: Выделить всё
Application.Run
Когда-то об этом читал, но пока никогда не пользовался. Так что проблема решена. Хотя недопонимание осталось: есть ли какой-нибудь другой способ имитировать событие объекта (в моем случае - кнопки), зная его имя? Что-то типа Raise, но в хорошем смысле :lol:

... Run-то Run, но неожиданно столкнулся с проблемой вызова Private процедуры, лежащей в коде формы, из процедуры, расположенной в другом модуле:
Код: Выделить всё
Application.Run ("UserForm1.CommandButton1_click")
к сожалению, не срабатывает :(

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 21.02.2008 (Чт) 14:30

Сделать в этом модуле паблик-процедуру, вызывающую эпликейшн-ран, а из других модулей вызывать эту процедуру
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 21.02.2008 (Чт) 15:28

Красивое предложение. Вызвать процедуру, вызывающую процедуру-обработчик события, из модуля формы по Call я действительно могу, причем эта процедура может быть любой, кроме Private: Sub или Function с Public или без, и адресуюсь к ней я через префикс UserForm1:
Код: Выделить всё
Call UserForm1.CallButton1Click

а в CallButton1Click лежит вызов обработчика события:
Код: Выделить всё
Sub CallButton1Click
  Call CommandButton1_Click
end Sub

Но! Как только я то же самое делаю c Application.Run:
Код: Выделить всё
Application.Run ("UserForm1.CallButton1Click")

ничего не происходит!!!

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 22.02.2008 (Пт) 8:42

CallByName ?
I Have Nine Lives You Have One Only
THINK!

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 22.02.2008 (Пт) 12:40

Я так понимаю, что у кнопки нет метода Click, поэтому
Код: Выделить всё
CallByName UserForm1.CommandButton1, "Click", VbMethod

выдает сообщение об ошибке.

Template
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 09.09.2006 (Сб) 18:03

Сообщение Template » 25.02.2008 (Пн) 3:41

Код: Выделить всё
Public Sub Macro()
    CallByName UserForm1, "CommandButton1_Click", VbMethod
End Sub

Public Sub CommandButton1_Click()
    MsgBox "То, что доктор прописал"
End Sub

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 26.02.2008 (Вт) 13:59

К сожалению, у CommandButton1 (тем более у UserForm1) нет метода CommandButton1_Click (есть только Move, SetFocus, ZOrder и нексколько скрытых), поэтому, что так:
Код: Выделить всё
CallByName UserForm1.CommandButton1, "Click", VbMethod
, что так:
Код: Выделить всё
CallByName UserForm1.CommandButton1, "CommandButton1_Click", VbMethod
, что так:
Код: Выделить всё
CallByName UserForm1, "CommandButton1_Click", VbMethod
- все одно - сообщение об ошибке: "Object doesn't support this property or method (Error 438)"

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 26.02.2008 (Вт) 16:47

а если зайти в код формы и поменять
Код: Выделить всё
Private Sub CommandButton1_Click()

на
Код: Выделить всё
Public Sub CommandButton1_Click()

то сделав так
Код: Выделить всё
Call UserForm1.CommandButton1_Click
все будет в шоколаде

да и так сработает
Код: Выделить всё
CallByName UserForm1, "CommandButton1_Click", VbMethod
I Have Nine Lives You Have One Only
THINK!

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 26.02.2008 (Вт) 17:13

Да так работает. Не заметил я Public в
Код: Выделить всё
Public Sub CommandButton1_Click
Это снимает проблему. Спасибо. Но почему не срабатывает аналогичный вызов:
Код: Выделить всё
Application.Run "UserForm1.CommandButton1_Click"
, на котором я сначала зациклился?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 04.03.2008 (Вт) 9:01

тут искал одно нашел и это

    Совет 393. Программная имитация нажатия кнопок
    Предположим, на вашей форме Form1 расположены несколько командных кнопок и вам нужно выполнить программную имитацию их нажатия:


    Private Sub Command1_Click()
    MsgBox "Кнопка 1 нажата!"
    End Sub
    Private Sub Command2_Click()
    MsgBox "Кнопка 2 нажата!"
    End Sub

    К примеру, на другой форме Form2 имеется кнопка AllCommands, щелчок которой должен вызывать нажатие двух кнопок на Form1. Обратиться непосредственно к процедурам CommandN_Click нельзя, так как они имеют статус Private. Для решения этой проблемы следует воспользоваться свойством Value, которое управляет состоянием кнопки:


    Private Sub AllCommands_Click()
    Form1.Command1.Value = True
    Form1.Command2.Value = True
    End Sub
I Have Nine Lives You Have One Only
THINK!

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 04.03.2008 (Вт) 11:34

Вау!!! И красиво, и элегантно, и не надо морочиться с Private! То, что доктор прописал! Спасибо!!! :D


Вернуться в VBA

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

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

    TopList