Страницы: 1
RSS
Назначить макрос кнопке, находящейся внутри frame на листе/
 
Добрый день.

подскажите пожалуйста, как назначить макрос кнопке, которая находится внутри frame на рабочем листе.
Судя по иформации в интернете нужно создать класс с обработкой событий, но как это сделать я не понял.

Пробовал сделать как показано ниже, но так кнопка работает только при открытии книги и один раз. Код добавлял в код Книги.
Код
Private WithEvents btn1 As MSForms.CommandButton
Private Sub Workbook_Open()
    Set btn1 = Worksheets("list1").Frame1.Object.btn_run
End Sub

Sub btn1_Click()   
Call MACRO
End Sub
 
А как на счет файла примера?
"Все гениальное просто, а все простое гениально!!!"
 
А зачем вам элемент ActiveX?
Возьмите обычную фигуру или кнопку.
Запишите макрорекодером и посмотрите что вышло.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Nordheim написал:
А как на счет файла примера?
Файл примера приложил. В примере на frame расположены две кнопки. Нужно чтобы на них можно было назначить макрос, или код.
Цитата
Alemox написал:
А зачем вам элемент ActiveX?
Потому, что только их можно расположить в элементе frame. Обычную кнопку не получается даже наложить поверх рамки, так как она автоматически перемещается на задний план/фон.
 
Цитата
slepoi_kamin написал:
Обычную кнопку не получается даже наложить поверх рамки, так как она автоматически перемещается на задний план/фон.
Включите Режим конструктора и поменяйте порядок - Frame на задний план. Тогда всё получится.
 
Отбой тревоги (#5): только при включённом режиме конструктора отображается ))
 
Цитата
slepoi_kamin написал:
кнопка работает только при открытии книги и один раз
Задавайте кнопку не на открытие книги, а фокус на фрейме и будет все хорошо:
Код
Private WithEvents cb2 As MSForms.CommandButton
Private Sub Frame1_GotFocus()
    Set cb2 = Frame1.Controls("CommandButton2")
End Sub
Sub cb2_click()
    Call t
End Sub
Sub t()
    MsgBox "Я кнопка из фрейма!"
End Sub

Изменено: GRIM - 06.08.2019 13:19:16
 
А я бы не мучился, и создал форму )
 
Цитата
GRIM написал:
Задавайте кнопку не на открытие книги, а фокус на фрейме и будет все хорошо
Спасибо! Так работает. но с одним НО. После прерывания выполнения макроса (дошел до точки остановы, затем я его прервал, или завершен с ошибкой)  кнопка перестает работать. Почему это происходит?

Цитата
Юрий М написал:
А я бы не мучился, и создал форму )
Я бы создал форму, но я не знаю как сделать, и можно ли сделать так, чтобы форма все время находилась на листе. Начиная с открытия книги, заканчивая дебагингом кода. Если расскажете, то буду благодарен)
 
Цитата
slepoi_kamin написал:
 кнопка перестает работать
это вероятно потому что фрейм в этом случае остается в фокусе, а выполнение кода Вы остановили. Заного нужно задать фрейму фокус. После остановки дебага тыкните на любую ячейку листа, а потом опять по фрейму и должно все работать
 
Цитата
slepoi_kamin написал:
Если расскажете, то буду благодарен
Это очень долго ((
 
Цитата
GRIM написал:
После остановки дебага тыкните на любую ячейку листа, а потом опять по фрейму и должно все работать
Само собой, по идее, так и должно работать, но не работает. Поэтому и спрашиваю, мне не особо понятно почему не работает.
 
Цитата
slepoi_kamin написал:
только их можно расположить в элементе frame. Обычную кнопку не получается даже наложить поверх рамки
зато можно создавать не рамку, а другую фигуру, назначив её границам нужное форматирование, поместив внутрь две таких же кнопки и применить группировку всех трех фигур. Тогда кнопки будут внутри одной большой(типа рамки) и будут перемещаться вместе с ней. И никаких танцев с бубном...
Хотя глянул пример - там все сложнее. Так не только frame, там еще MultiPage, флажки и т.п. Стандартными элементами этого не изобразить. Проще уж реально UserForm использовать, чем городить ActiveX на листе, которые не особо-то стабильные в работе.
Цитата
slepoi_kamin написал:
чтобы форма все время находилась на листе. Начиная с открытия книги, заканчивая дебагингом кода.
какое странное желание...Ну про нахождение все время на листе еще понятно, а вот про дебагинг...Что подразумевается под необходимостью нахождения формы на листе при дебагинге?
По идее Userform.Show 0 решает проблему отображения поверх окна Excel. События листа Activate и Deactivate решают проблему отображения только на конкретном листе.
Изменено: Дмитрий(The_Prist) Щербаков - 07.08.2019 17:11:11
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ну и в довесок во вложении Ваш пример файла с работающей кнопкой(сделано как и положено через классы)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
slepoi_kamin написал:
Само собой, по идее, так и должно работать, но не работает.
Тогда нужно пошагово понимать Ваши действия.
Сейчас сам попробовал поставить точку остановки на:
Код
MsgBox "Я кнопка из фрейма!"
закрыл редактор VBA, тыкнул к примеру на A1 и опять по кнопке - и все работает.
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
какое странное желание...Ну про нахождение все время на листе еще понятно, а вот про дебагинг...Что подразумевается под необходимостью нахождения формы на листе при дебагинге?
Начну с того, что спасибо за ваш пример, буду изучать. Как вы поняли, в VBA я плаваю на уровне около нуля. Поэтому, возможно, решения тех или иных вопросов - не оптимальные.
Задача у меня следующая: нужно автоматизировать технический расчет. Причем автоматизировать надо от ввода данных до получения результатов. Расчет происходит по времени, соответственно результаты надо получить в каждый момент времени, проанализировать и обработать. Всего около 50000 временных шагов.

Почему VBA? -Потому, что отчеты потом все равно оформляются в  приложениях MS офис.

Теперь, что касается ввода данных.

Пользователь, открывая документ должен видеть окно, куда вводятся данные. При этом после нажатия на кнопку (например "Старт"), это меню не должно пропадать, а введенные данные в окна, отмеченные галки, и т.д. должны сохраняться. В этом окне, также, есть область, куда выводятся сообщения по работе программы (что-то типа лога). И если например расчет завершился с ошибкой, то пользователь должен это увидеть, изменить данные введенные в окне и снова запустить расчет.

Во время дебагинга (отладки) я запускаю расчет до точки остановы, прерываю выполнение програмы вношу поправки и снова запускаю, при этом все введенные данные у меня сохраняются и мне не надо их снова вводить, и я постоянно вижу что введено.

Как то так.
И я, со своим небольшим опытом в VBA, не придумал ничего лучше, чем использование фрейма (рамки) на листе.

Цитата
GRIM написал:
закрыл редактор VBA, тыкнул к примеру на A1 и опять по кнопке - и все работает.
Спасибо за ответ. Тогда буду рыться у себя.
Страницы: 1
Наверх