Страницы: 1
RSS
Множественный выбор переключателй, ToogleButton
 
Здравствуйте, есть форма в которой находится n переключателей (ToogleButton), все они имеют название TB1, TB2,...TBn (но, конечно хотелось бы что бы имена были разные, так сказать определяющие суть переключателя.).
Что необходимо: При активации (переключении) определенного кол-ва переключателей (1, 2, 3, ... n) сделать переключение Enabled из позиции True в позицию False (для невозможности их активации), и соответственно при деактивации переключателей, всё в обратном порядке.

Из найденого на форуме применение нашли 2 варианта:

1)
Скрытый текст

Из того, что не устраивает - это написание множественных проверок и строк в каждой кнопке. Хорошо если их 4, а если 15?

2)
Скрытый текст

Из того, что тут не устраивает это скорее непониманимание того, как вместо одной функции запустить проверку по нескольким.
За ранее спасибо.
 
Цитата
Okami написал:
При активации (переключении) определенного кол-ва переключателей (1, 2, 3, ... n) сделать переключение Enabled из позиции True в позицию False
Вот эту фразу расшифруйте. Например, выбрали 2 и 3 - остальные блокировать? Но ведь если выбрали 2, то 3 УЖЕ заблокируется. Как менять его состояние?
 
Цитата
Юрий М написал:
Как менять его состояние?
Сапер ошибается один раз, это у кота 9 жизней :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
... у кота 9 жизней
Я подкрутил счётчик: стало 19 )
 
Сомневаюсь, что автор вернётся, зато я немного попрактиковался в Dictionary.
идея была - собрать все чекбоксы в массив, чтобы можно было обращаться к ним и по имени и по индексу и тупо все перебирать.
Код
Option Explicit

Function DictX() As Object
    Dim sName
    
    Set DictX = CreateObject("Scripting.Dictionary")
    
    DictX.Add "name1", False
    DictX.Add "nm", False
    DictX.Add "zz", False
    DictX.Add "asd", False
    
    For Each sName In DictX
        DictX.Item(sName) = ActiveSheet.OLEObjects(sName).Object
    Next sName
    
End Function


Sub Test()
    Dim myDict As Dictionary
    Dim i As Long
    Dim X As Long
    Dim el
    
    Set myDict = DictX()
    
    'Пример перебора по номеру и обращений к индексу/значению
    For i = 0 To myDict.Count - 1
        Debug.Print myDict.keys(i) & "    -     "; myDict.Items(i)
    Next
    
    For Each el In myDict
        If myDict(el) Then X = X + 1
    Next
    
    If X >= 2 Then
        For Each el In myDict
            ActiveSheet.OLEObjects(el).Enabled = myDict(el)
        Next
    Else
        For Each el In myDict
            ActiveSheet.OLEObjects(el).Enabled = True
        Next
    End If
End Sub

Да, имена чекбоксов можно было в функции и не задавать, но мало ли, может там много разных групп чекбоксов...
Изменено: Wiss - 19.11.2019 18:59:18
Я не волшебник, я только учусь.
 
Может так ?
Код
Option Explicit

Sub Tam_i_naoborot()
    Dim ctrl As Object
    
    '...
    For Each ctrl In ActiveSheet.OLEObjects
        If TypeOf ctrl.Object Is ToggleButton Then ctrl.Object.Enabled = Not ctrl.Object.Enabled
    Next
    '...
End Sub
 
Wiss, ocet p, а может вы прочитаете 1 предложение 1 поста?  :D
 
Юрий М, расшифровываю.

Есть 8 переключателей. Например, нам надо сделать так, что бы пользователь мог выбрать ТОЛЬКО Два из них. При этом, все остальные блокируются.

Например, как и написали пользователь выбрал 2 и 6.
Значит,номера 1,3,4,5,7,8 должны бы заблокированы (отключены).
 
См. вариант. Но лучше бы использовать класс: не пришлось бы на каждую кнопку писать вызов внешней процедуры. Правда, всего одна строка, но всё же...
Okami, а не подскажете, почему каждый помогающий должен вместо Вас создавать файл-пример?
 
RAN, каюсь, не досмтотрел. Спешил. И так на 40 минут на работе задержался, пока ответ писал.
Справедливости ради, хочу сказать, что если бы был файл-пример, то я бы не попутал тёплое с мягким. Тем более, что при том как у меня написан код разницы вообще никакой нет. Добавил ToogleButton, назвал так же, как назывались Чекбоксы. Всё работает.
Я не волшебник, я только учусь.
 
Цитата
Okami написал:
Например
UserForm1
Код
Option Explicit
Dim ToggleB(7) As New ClassTGB
Private Sub UserForm_Activate()
    Dim i&, ctrl As Object
    For Each ctrl In Me.Controls
        If TypeOf ctrl Is MSForms.ToggleButton Then
            Set ToggleB(i).tgb = ctrl
            i = i + 1
        End If
    Next
End Sub

ClassTGB
Код
Option Explicit
Public WithEvents tgb As MSForms.ToggleButton

Private Sub tgb_Click()
    Dim ctrl As Object, ctrlCount&
    For Each ctrl In UserForm1.Controls
        If TypeOf ctrl Is MSForms.ToggleButton Then
            If ctrl.Value Then
                ctrlCount = ctrlCount + 1
            End If
        End If
    Next
    For Each ctrl In UserForm1.Controls
        If TypeOf ctrl Is MSForms.ToggleButton Then
            If ctrlCount > 1 Then
                ctrl.Enabled = (ctrl.Value = 0) + 1
            Else
                ctrl.Enabled = True
            End If
        End If
    Next
End Sub
 
RAN, Вау! Особенно понравилась строчка ctrl.Enabled = (ctrl.Value = 0) + 1. Надо запомнить.

P.S. Да, читать я совсем не умею.
Изменено: Wiss - 20.11.2019 00:46:17
Я не волшебник, я только учусь.
 
Юрий М дико извиняюсь. Комп приказал долго жить, по сему я остался без исходников. И теперь похоже не скоро проверю, что и как работает. По этому Спасибо всем кто откликнулся.
Страницы: 1
Наверх