С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/114: Рейтинг темы: голосов - 114, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 01.03.2007
Сообщений: 5
1
Excel

Как определить нажатую кнопку?

01.03.2007, 14:00. Показов 21185. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На рабочем листе Excel (не на форме) расположено N-ое количество управляющих элементов "CommandButton", поставленных на лист из Панели инструментов "Элементы управления", т.е. как OLEObject. Как можно определить, какая именно CommandButton была нажата во время работы, т.е. либо в переменную, либо в произвольную ячейку записать уникальный идентификатор нажатой кнопки. Решение с назначением кнопке макроса, в котором по событию Click в произвольную ячейку будет записываться, например, свойство Name кнопки НЕ подходит (не универсально, не гибко, слишком много кнопок).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2007, 14:00
Ответы с готовыми решениями:

Как в коде определить, какую кнопку нажал юзер на форме
Как в коде определить, какую кнопку нажал юзер на форме?

Подскажите пожалуйста как на листе при нажатии на кнопку определить в какой ячейке она находится?
Есть вот такой код который работает, но добавляет строку там где выделена ячейка. Мне необходимо...

Как получить ссылку на нажатую кнопку?
Здравствуйте. Сразу код: private void Form1_Load(object sender, EventArgs e) { for (int i =...

Как нажатую кнопку не нажатой сделать?
Здравствуйте! Подскажите, если не затруднит. Ситуация такая: после нажатия кнопки срабатывает php и...

8
2 / 2 / 0
Регистрация: 20.11.2011
Сообщений: 54
01.03.2007, 20:16 2
Доброго времени суток!
CommandButton.Index не подойдет?
С уважением, Анатолий
0
0 / 0 / 0
Регистрация: 01.03.2007
Сообщений: 5
02.03.2007, 00:44  [ТС] 3
Я не силен в программировании на VBA, но если имеется в виду конструкция:
Visual Basic
1
2
3
Private Sub CommandButton1_Click()
     Лист1.Range("A1").Value = CommandButton.Index
End Sub
то она не работает:

Compile error:
Variable not defined


VB считает в данном случае, что CommandButton - это Variable.

Работает вариант:

Visual Basic
1
2
3
Private Sub CommandButton1_Click()
     Лист1.Range("A1").Value = CommandButton1.Index
End Sub
но не устраивает, т.к. нужно конкретно указывать номер кнопки: CommandButton1.
0
rank1
03.03.2007, 17:27 4
Один из вариантов решения:
Запускаем макрос Gen, в ворде появляется код сгенеренных N хендлеров событий от кнопок.
Вставляем сгенеренный код в вба модуль и теперь все вызовы от кнопок перенаправляются в одну процедуру.
Visual Basic
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
Option Explicit
Sub gen()
    Dim t, i
    t = "'****VBA generated code****" & vbNewLine
    For i = 1 To 256
        t = t & "Private Sub CommandButton" & i & "_Click()" & vbNewLine & _
            " call cbhandler(" & i & ")" & vbNewLine & _
            "End Sub" & vbNewLine
    Next i
    '-----------------------------
    Dim w As New Word.Application
    w.Visible = True
    w.Documents.Add
    w.ActiveDocument.Range.Text = t
    Set w = Nothing
End Sub
 
Sub cbhandler(i As Long)
    MsgBox i
End Sub
'****VBA generated code****
Private Sub CommandButton1_Click()
 Call cbhandler(1)
End Sub
Private Sub CommandButton2_Click()
 Call cbhandler(2)
End Sub
Private Sub CommandButton3_Click()
 Call cbhandler(3)
End Sub
... И так далее - к-во хендлеров можем указать до 64кб - ограничение на размер модуля в вба.
90 / 37 / 14
Регистрация: 03.11.2010
Сообщений: 429
04.03.2007, 00:24 5
Можно воспользоватся кнопкой с панели "Формы" и обработать нажатие в одном макросе:
MsgBox CStr(Application.Caller)
Можно создать массив в Class Modules
См. пример для уже созданных в ручную кнопок.
0
0 / 0 / 0
Регистрация: 01.03.2007
Сообщений: 5
04.03.2007, 01:01  [ТС] 6
rank1

Спасибо, конечно, за ответ, но это не соответствует условиям задачи.

Используя Ваш пример, это должно выглядеть примерно так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub cbhandler()
    MsgBox "Уникальный идентификатор: " & _
    Unique_identifier_of_the_CommandButton
End Sub
 
'****VBA generated code****
 
Private Sub CommandButton1_Click()
    Call cbhandler(identifier)
End Sub
 
Private Sub CommandButton2_Click()
    Call cbhandler(identifier)
End Sub
 
Private Sub CommandButton3_Click()
    Call cbhandler(identifier)
End Sub
В противном случае нет смысла городить огород. Можно просто написать:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub CommandButton1_Click()
    Лист1.Range("A1").Value = 1
End Sub
 
Private Sub CommandButton2_Click()
    Лист1.Range("A1").Value = 2
End Sub
 
Private Sub CommandButton3_Click()
    Лист1.Range("A1").Value = 3
End Sub
0
0 / 0 / 0
Регистрация: 01.03.2007
Сообщений: 5
04.03.2007, 01:32  [ТС] 7
Димит

<font color="#FF0000 CommandButton_Array.zip</font> - это то, что нужно.

Как все, оказывается, просто, когда знаешь. Не поверишь, но я больше недели перекапывал интернет в поисках ответа и все бестолку.

Огромное человеческое спасибо!

Напоследок, растолкуй, пожалуйста, что означает:

После создания кнопок "CommandButtonN" закрой-открой файл или выполни макрос "AddMassiv
т.е., в каких случаях нужно запускать макрос "AddMassiv". Например, я включил и выключил на листе режим конструктора, и "AddMassiv" пришлось запускать снова.

С уважением,

Олег.
0
90 / 37 / 14
Регистрация: 03.11.2010
Сообщений: 429
04.03.2007, 06:11 8
В AddMassiv создаётся массив переменных ( Bt() ). Все переменные обнуляются при работе в редакторе. По этому придётся заново его создавать.
При добавлении кнопок на лист, добавленные кнопки не войдут в массив, т.е. опять придётся запустить макрос AddMassiv.
0
0 / 0 / 0
Регистрация: 01.03.2007
Сообщений: 5
04.03.2007, 18:13  [ТС] 9
Спасибо за разъяснение. Вопросов больше нет.

Думаю, на этом тему можно закрыть.
0
04.03.2007, 18:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2007, 18:13
Помогаю со студенческими работами здесь

Toggle Button - Как правильно выделить нажатую кнопку цветом. Стилями или?
Toggle Button в листенере просто присвоить цвет - красный или как то другим свойством в...

Проверка на нажатую кнопку
Здравствуйте. Программа создает N обычных и столько же радио-кнопок. Нажимаем обычную и...

не могу проверить нажатую кнопку
&lt;html&gt; &lt;head&gt; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt; ...

Получить текущую нажатую кнопку
Привет! У меня есть 3 кнопки с одинаковым оутлет. При нажатии на 3ю кнопку, у меня показывает что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru