Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
28.03.2024, 21:44:03

Войти
Добавляйтесь в нашу группу ВКонтакте - будьте в курсе всех новых событий сайта, узнавайте первым обо всех акциях и новых статьях!
33 233 Сообщений в 5 454 Тем от 6 750 Пользователей
Последний пользователь: Alex1210
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Отжать макросом все кнопки ToggleButton в книге Excel
Страниц: [1]   Вниз
Печать
Автор Тема: Отжать макросом все кнопки ToggleButton в книге Excel  (Прочитано 7092 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Megavolt
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 19


Просмотр профиля E-mail
« : 31.01.2017, 23:20:14 »

Здравствуйте уважаемые знатоки VBA. На работе имеется файл, в нем имеются кнопки ToggleButton в количестве примерно 30 штук на 6 листах. (т. е. всего примерно 180 кнопок в файле). Эти кнопки запускают определенные процедуры, связанные с работой файла. Разные пользователи работают с файлом и нажимают кнопки. Помогите пожалуйста макросом отжать все кнопки, если они были нажаты перед закрытием файла. Наверное есть способ обратится сразу ко всем кнопкам, а не перечислять их все в макросе. Требуется чтобы открыв файл, все кнопки были отжаты для корректной работы с файлом. Файл примера прилагаю, заранее спасибо.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #1 : 01.02.2017, 09:13:17 »

Код: (vb)
    Dim ws As Worksheet, ot
    Set ws = ActiveSheet
    For Each ot In ws.DrawingObjects
        If TypeOf ot.Object Is msforms.ToggleButton Then ot.Object.Value = 0
    Next
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Megavolt
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 19


Просмотр профиля E-mail
« Ответ #2 : 01.02.2017, 15:15:56 »

Спасибо работает, но применительно к активному листу, а возможно ли сделать применительно ко всем листам сразу? Ваш код я поместил "в эта книга" и выполнение перед закрытием книги.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #3 : 01.02.2017, 15:20:07 »

Пора уже учиться циклы писать самостоятельно. На форуме, да и на сайте, есть примеры.
Код: (vb)
For each ws in thisworkbook.sheets
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Megavolt
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 19


Просмотр профиля E-mail
« Ответ #4 : 01.02.2017, 15:38:36 »

Извините, но не знаю куда прилепить вашу подсказку. Т.к. не силен в макросах, прощу прощения.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #5 : 01.02.2017, 17:03:11 »

Ну что значит "не силен"? Вы на форум решили исключительно за готовыми решениями ходить? Улыбка Не очень правильно. Форумы для помощи в освоении Excel и VBA, а не для решалок каждому, кто "не силен" задач с нуля. Поднапрягитесь, поищите что такое циклы в VBA. А то так и будете по каждой элементарной задаче тему создавать и в какой-то момент всем это надоест...
Код: (vb)
Dim ws As Worksheet, ot  
For each ws in thisworkbook.sheets
    For Each ot In ws.DrawingObjects 
        If TypeOf ot.Object Is msforms.ToggleButton Then ot.Object.Value = 0 
    Next
next
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Megavolt
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 19


Просмотр профиля E-mail
« Ответ #6 : 01.02.2017, 17:36:30 »

Дмитрий, ваше замечание абсолютно справедливо. Спасибо вам за помощь.
Записан
Тим
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 2


Просмотр профиля E-mail
« Ответ #7 : 09.10.2020, 18:37:01 »

Уважаемый Дмитрий.
Не получается подобный код повторить для UserForm, а очень нужно.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #8 : 09.10.2020, 19:05:20 »

Потому что для UserForm надо перебирать элементы именно на UserForm. Вы пробовали? Улыбка По сути надо лишь одну строку заменить
Код: (vb)
For Each ot In Me.Controls

только вот не знаю надо ли рассказывать, что код должен быть в модуле формы? И так же он должен быть как-то запущен(нажатие на кнопку или еще что-то).
И вот здесь приводил коды и разъяснения касательно перебора контролов на форме: Как быстро заполнить/очистить элементы на форме(TextBox-ы, ComboBox-ы)
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Тим
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 2


Просмотр профиля E-mail
« Ответ #9 : 09.10.2020, 22:27:11 »

Если на форме 15 кнопок ToggleButton, как определить что одна из них нажимается и какая из них?
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #10 : 10.10.2020, 18:31:02 »

Добро пожаловать в мир классов: Работа с модулями классов
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #11 : 12.10.2020, 08:06:29 »

Да, забыл: если классы не подходят, то для каждой кнопки надо дублировать процедуру. Тогда все очевидно - проверяете в цикле имена контролов и сверяете с текущим(нажатие которого обрабатываете):
Код: (vb)
If ot.Name <> "ToggleButton3" Then
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru