Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.12.2008, 11:09   #1
ekesar
 
Регистрация: 27.11.2008
Сообщений: 8
По умолчанию Можно ли обратиться к объекту, запустившему событие?

Объект на лист excel добавлен из панели "Элементы управления".

Например процедура обработки соб такая:
Код:
Sub CommandButton1_Click()
 ...
End Sub
Можно ли обратиться к CommandButton1 не указывая CommandButton1, а какой-нибудь объект, характеризующий текущ объект (что-то вроде this)?

Если объект на форме, то можно обратиться к ActiveControl, а на worksheet такого свойства нет.

Спасибо.
ekesar вне форума
Старый 11.12.2008, 11:50   #2
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

а зачем ?

другой вопрос, если бы вы спросили как сделать программу обработки, общую для всех кнопок..
slan вне форума
Старый 11.12.2008, 11:53   #3
ekesar
 
Регистрация: 27.11.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от slan Посмотреть сообщение
другой вопрос, если бы вы спросили как сделать программу обработки, общую для всех кнопок..
именно это я и хочу
ekesar вне форума
Старый 11.12.2008, 16:11   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Option Compare Text

Sub test()
    Dim sh As Worksheet
    For Each sh In ThisWorkbook.Worksheets
        For Each button In sh.OLEObjects
            If button.Name Like "commandbutton*" Then
                Debug.Print "На листе " & sh.Name & " найдена кнопка " & button.Name
            End If
        Next
    Next
End Sub
А изменять кнопки можно так:
Код:
Sub test()
    Dim sh As Worksheet, ole As OLEObject, button As CommandButton
    For Each sh In ThisWorkbook.Worksheets
        For Each ole In sh.OLEObjects
            Set button = ole.Object
            If TypeName(button) = "commandbutton" Then
                button.Caption = "кнопка"
                button.BackColor = vbGreen
            End If
        Next
    Next
End Sub
А как получить из какой-либо процедуры объект, представляющий нажатую (выделенную в данный момент) кнопку, я так и не придумал...

Последний раз редактировалось EducatedFool; 11.12.2008 в 16:31.
EducatedFool вне форума
Старый 11.12.2008, 16:40   #5
ekesar
 
Регистрация: 27.11.2008
Сообщений: 8
По умолчанию

Цитата:
как сделать программу обработки, общую для всех кнопок..
нашел в книге Уокенбаха "Профессиональное программирование на VBA в Excel 2002"

Цитата:
Вставьте в проект модуль класса (для этого необходимо выбрать команду Inserts Class Module), назовите его BtnClass и введите следующий код. Вам следует модифицировать процедуру But tonGroup_Click.

Код:
Public WithEvents ButtonGroup As MsForms.CommandButton
Private Sub ButtonGroup_Click()
...
end sub
Данная процедура будет запускаться при возникновении события Initialize для диалогового окна UserForm. Обратите внимание, что в коде исключается "реакция" на кнопку с названием OKButton. Таким образом, щелчок на кнопке OKButton не приведет к вызову процедуры ButtonGroup_Click.

Код:
Dim Buttons() As New BtnClass
Private Sub UserForm_Initialize{J
Dim ButtonCount As Integer
Dim ctl As Control
' Создание объектов Button
ButtonCount - 0
For Each ctl In UserForml.Controls
If TypeName(ctl) = "CommandButton" Then
If ctl.Name <> "OKButton" Then 'Пропуск OKButton
ButtonCount = ButtonCount + 1
ReDim Preserve Buttons{1 To ButtonCount)
Set Buttons(ButtonCount).ButtonGroup = ctl
End If
End If
Next ctl
End Sub
данный способ не действует для кнопок на листе

Последний раз редактировалось ekesar; 11.12.2008 в 16:42.
ekesar вне форума
Старый 12.12.2008, 18:52   #6
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

извиняйте, отвлекся..

кратко так:
в модуле класса - переменная withevents и соответствующая ей обработка события..

в основном модуле - создается коллекция из экземпляров созданного ранее класса, каждый из которых и содержит кнопку..

подробнее - см файл
Вложения
Тип файла: rar class_cmnbutton.rar (11.4 Кб, 11 просмотров)
slan вне форума
Старый 12.12.2008, 18:57   #7
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

sorry one more time..

wrong name..

it's correct:
Вложения
Тип файла: rar class_cmnbutton.rar (11.7 Кб, 23 просмотров)
slan вне форума
Старый 14.12.2008, 21:17   #8
ekesar
 
Регистрация: 27.11.2008
Сообщений: 8
По умолчанию

Спасибо большое.
А я никак немог сообразить как передать объект, чтобы не ругался на несоответствие типов.
ekesar вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как привязать событие или макрос к динамическому объекту (commandbutton) в форме? ekesar Microsoft Office Excel 7 09.12.2008 09:13
Как можно обратиться к устройству, которое подключено через USB порт Mikhail Bakurov Общие вопросы Delphi 8 17.11.2008 20:42
Как обратиться к объекту который был только что создан Arassir Помощь студентам 5 24.10.2008 20:42
Как объекту рисования (овал) присвоить значение? Град Microsoft Office Excel 8 17.07.2008 10:42
Как обратиться к ячейке таблицы Аналитик Помощь студентам 16 29.11.2007 20:11