Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
19.04.2024, 02:09:54

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 242 Сообщений в 5 457 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Перебор контролов на листе и работа с формой пользователя
Страниц: 1 [2] 3  Все   Вниз
Печать
Автор Тема: Перебор контролов на листе и работа с формой пользователя  (Прочитано 14602 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vikttur
Глобальный модератор
Ветеран
*****

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

Сообщений: 1 816



Просмотр профиля
« Ответ #15 : 20.04.2020, 15:35:17 »

все свойства контрола (а не только Left, Top) надо продумать заранее и указать их в коде... если файл закрыть-открыть, то на форме ничего созданного не окажется!
Вариант1. Не заморачиваться с программированием формы. Расставить все по местам вручную. Убить на это вечер и забыть о головной боли...
Вариает2. Не заморачиваться с программированием формы. Тоже убить вечер и тоже забыть о пробеме - сделать "псевдо-форму" на листе. Вместо CheckBox - событие выделения ячейки и запись/удаление символа 80, 82, 252 (в шрифтах Wingdings это галка)
Вариант3. Продолжать программно рисовать форму, при этом не тратить вечер, но потратить в несколько раз больше времени на поиск решения своей проблемы Улыбка
Записан
RAN
Эксперты
Старожил
*

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

Сообщений: 440



Просмотр профиля E-mail
« Ответ #16 : 20.04.2020, 17:41:23 »

Убить на это вечер
Ну ты и загнул.  Улыбка
Просто создать - минут пять. Выровнять еще  10, и правильно переименовать час.
Записан

А что ты умеешь?
Учиться...
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #17 : 20.04.2020, 19:28:02 »

... не раскрывает необходимости использования свойства Tag
Как задумывалось: при клике на чекбоксе он должен сообщить программе некое число, которое где-то надо хранить (вариант некой таблицы, Dictionary и т.п. не рассматривался)
 Где можно хранить данные в контроле? В подписи, обесцветив шрифт или в Tag, что наиболее привычнее.
       Насколько знаю, Dictionary, по сути, - обычный одномерный массив, и для его заполнения нужно иметь где-то таблицу-источник. Но поскольку интерфейс у меня "матрицообразный" - 10 рядов по 8 элементов, и в именах чекбоксов скрыта их позиция(cb11 - первый чек в первом ряду,cb68 - восьмой чек в шестом ряду и т.д.),тогда уж логичнее создать двумерный массив MyArr(10,8) и заполнять его из той же таблицы.
А можно послать... и массив, и словарь, а данные напрямую брать из той самой таблицы...

Записан
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #18 : 20.04.2020, 19:30:30 »

. Вместо CheckBox - событие выделения ячейки и запись/удаление символа 80, 82, 252 (в шрифтах Wingdings это галка)
Экзотика... Веселый
Записан
vikttur
Глобальный модератор
Ветеран
*****

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

Сообщений: 1 816



Просмотр профиля
« Ответ #19 : 20.04.2020, 19:33:58 »

Не нравится? Улыбка
Наше дело - предложить варианты, Ваше - отказаться... или подумать.
Записан
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #20 : 20.04.2020, 20:49:19 »

Наше дело - предложить варианты...
Вариант 3 наиболее привлекателен с точки зрения - "поломать голову", но он бессмысленный, если мне кто-то наконец прямо ответит: "в случае с формой, заполнить её программно и сохранить результат невозможно !!!
а где же Вариант 4 - плюнуть на форму, создать контролы на листе, а проблему с отсутствующим Tag реализовать использованием скрытой таблицы(см. выше)?
P.S. и где ответ на моё сообщение в личку?
Записан
vikttur
Глобальный модератор
Ветеран
*****

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

Сообщений: 1 816



Просмотр профиля
« Ответ #21 : 20.04.2020, 22:46:05 »

Вариант3 описал только потому, что Вы без него жить не можете Улыбка
И по нему такой ответ: программно создать форму и ее наполнение можно, но сохранить программно созданную форму нельзя.

Вариант4  не предлагаю, т.к., по моему мнению, хуже он  двух первых. Зачем лишние объекты на листе, вес, возня с их привязкой?
Да, еще был неплохой Вариант0 (ListBox) который Вы сразу отвергли, ибо "нарушится вся логика интерфейса"... Не знаю, какая там логика... У меня никогда не было проблемы с размещением списков в ListBox вместо большого количества флажков. Но если Вы считаете, что интерфейс менять ни в коем случае нельзя, переубеждать не буду.

В личке ответил
« Последнее редактирование: 20.04.2020, 22:58:38 от vikttur » Записан
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #22 : 21.04.2020, 00:44:02 »

Не знаю, какая там логика...
Логика проста, как 3 копейки: пользователь открывает матричнообразную форму 10х8, где ряды поименованы как "Сущность 1"..."Сущность 10", а столбцы - "Этап 1"..."Этап 8".
Каждый чекбокс на пересечении связан с неким числовым значением. Общий смысл: вложение этих числовых значений в каждое сочетание Сущность /Этап. Заполнение этапов строго последовательно.  Т.е. варианты "...да, да, нет, да..." или ..."нет", "нет", "да..." - невозможны: изменяемый чек переписывает весь ряд.
Алгоритм этого изменения:   установленный чекбокс устанавливает и все чекбоксы левее себя (нельзя вложить в Этап 4, не вложив в предыдушие 3), сброшенный - сбрасывает  и все чекбоксы правее себя (если изъять вложения из Этапа 6, то они попадают в "Резерв" и из последующих двух этапов).
Соответственно,установленные сброшенные чекбоксы увеличивают/уменьшают общую сумму.
И куда тут присобачить ListBox?
Записан
vikttur
Глобальный модератор
Ветеран
*****

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

Сообщений: 1 816



Просмотр профиля
« Ответ #23 : 21.04.2020, 01:34:53 »

Откуда знать, куда, если задача не видна? По такому описанию все равно задачу целостно не понять.
Да, с  ListBox могу ошибаться. Но, может, и 80 флажков - перебор и подход может быть другим?

Мы ушли далеко в сторону. По самой теме советы даны и вряд ли новые, если будут, кардинально поменяют картину. Я  бы выбрал вариант1 или вариант2
А если будет желание обсудить сам подход к задаче, а не выбранный путь решения - создавайте тему с описанием задачи.

« Последнее редактирование: 21.04.2020, 01:37:59 от vikttur » Записан
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #24 : 21.04.2020, 01:57:43 »

Мы ушли далеко в сторону
Так, возврашайтесь...
Я описал задачу предельно просто, что ешё не понятно?
Записан
vikttur
Глобальный модератор
Ветеран
*****

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

Сообщений: 1 816



Просмотр профиля
« Ответ #25 : 21.04.2020, 03:24:40 »

В этой теме - перебор контролов. И здесь советы  по этому вопросу. Обсуждать задачу, для которой Вы приспосабливаете этот перебор, - в другой теме.
Записан
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #26 : 21.04.2020, 12:23:54 »

Так был вопрос: "Не знаю, какая там логика...", пришлось отвечать Улыбка Я же воспитанный человек. Не спросили бы - не описывал бы...
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

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

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



Просмотр профиля WWW
« Ответ #27 : 21.04.2020, 12:35:13 »

И куда тут присобачить ListBox?
Один никуда. А вот 8, с 10-ю флажками... Улыбка Это тоже как вариант.
А ответы-то по сути все даны давно: если использовать ActiveX - то вместо Tag либо записывать в ячейки, либо в словарь(повторю, это специальный объект).
Если использовать форму: то либо заранее на ней создать все нужные флажки, либо для создаваемой формы все прописать так же на листе и оттуда дергать при каждом запуске.
Ну и чтобы было понятно, почему накидывают варианты, которые Вам кажутся неприемлемыми, а может и тупыми местами: мы вообще не видим что там за этапы, задачи, что правее и левее и т.п. Т.е. мы картину целиком не улавливаем и представить это все по Вашим одним описаниям очень сложно. Вы, например, сможете по описанию представить себе вкус молока или шоколада?  Улыбка Ну вот примерно так же мы сейчас по Вашим описаниям понимаем суть Вашей задачи.

Так что остается только выбирать что больше по душе Улыбка
« Последнее редактирование: 21.04.2020, 12:38:01 от Дмитрий Щербаков(The_Prist) » Записан

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

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

Сообщений: 48


Просмотр профиля
« Ответ #28 : 21.04.2020, 14:35:06 »

мы картину целиком не улавливаем
Сейчас опять на меня vikttur наедет, что моё сообщение - не по теме В замешательстве...
Обычная таблица! Столбцы - этапы, строки - сущности, стоимость каждой сущности по этапам хранится в справочнике(то, что я хотел в Tag хранить). Текущей стоимостью каждой сущности можно управлять устанавливая/сбрасывая флажки в её ряду. В поле (пока не упоминалось) выводится что-то типа: "Всего вложено в сущности", где хранится общая сумма по всей таблице...

...попробую вариант вообще без чекбоксов: на пересечении в ячейках хранить те самые стоимости по этапам, а выбранную ячейку обозначать изменением её фона.
Записан
Andrew_Ko
Новичок
*

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

Сообщений: 48


Просмотр профиля
« Ответ #29 : 22.04.2020, 11:21:43 »

Попробовал этот вариант:
Вместо CheckBox - событие выделения ячейки и запись/удаление символа 80, 82, 252 (в шрифтах Wingdings это галка)
с небольшим изменением: переключаю фон выделенной ячейки, но столкнулся с проблемой: выделенная при первом клике ячейка так и остаётся выделенной и повторный клик на ней события SelectionChange уже не вызывает.
Принудительное выделение в конце процедуры "ненужной ячейки"
Код: (vb)
Cells(1, 1).Select 
первую проблему снимает, но добавляет новую: эта первая ячейка теперь синхронно стала изменять свой фон при каждом клике на листе. Некрасиво... Плачущий
Пришлось в коде принудительно отсекать обработку события SelectionChange для первой ячейки, вот код целиком:

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Or Target.Count > 1 Then Exit Sub
    If Target.Cells.Interior.ThemeColor = 6 Then
        Target.Cells.Interior.ThemeColor = 1
    Else
        Target.Cells.Interior.ThemeColor = 6
End If
Cells(1, 1).Select
End Sub
изменение фона первой ячейки пропало но она всё-равно "подмигивает" при клике на любой ячейке листа...зараза!
« Последнее редактирование: 22.04.2020, 17:14:57 от vikttur » Записан
Страниц: 1 [2] 3  Все   Вверх
Печать
Перейти в:  

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