Варианты выбора отображения VBA - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь написать код, который будет отображать значение в зависимости от того, какой флажок установлен. Всего имеется 5 флажков, и я буду добавлять дополнительные флажки в будущем, поэтому мне было интересно, есть ли простой способ определить, какие флажки отмечены, чтобы определить, какие значения отображать. Я могу сделать это по-настоящему, но я бы хотел минимизировать свой код, если это возможно.

Другими словами, если бы я написал каждый сценарий, мне пришлось бы написать отдельный код для всех различных возможностей выбора:

1 только, только 2, только 3, только 4, только 5

1 + 2, 1 + 3, 1 + 4, 1 + 5, 2 + 3, 2 + 4, 2 + 5, 3 + 4, 3 + 5, 4 + 5

1 + 2 + 3, 1 + 2 + 4,1 + 2 + 5, 1 + 3 + 4,1 + 3 + 5, 1 + 4 + 5,2 + 3 + 4, 2 + 3 + 5 , 3 + 4 + 5

1 + 2 + 3 + 4, 1 + 2 + 3 + 5, 1 + 3 + 4 + 5, 2 + 3 + 4 + 5

1 + 2 + 3 + 4 + 5

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

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

То, на что ссылается @JMax, более широко известно как bit-mask .Вот краткое руководство:

Создайте образец формы с именем Form1 с 5 флажками с именами Check1, Check2, Check3, Check4, Check5.Затем добавьте следующие две функции в стандартный модуль кода:

Function GetSelectedBoxes() As Long
Dim Ctl As Control, Total As Long

    For Each Ctl In Forms!form1
        If Ctl.ControlType = acCheckBox Then
            If Ctl Then
                Total = Total + 2 ^ CLng(Mid(Ctl.Name, 6))
            End If
        End If
    Next Ctl
    GetSelectedBoxes = Total
End Function

Sub ShowSelectedBoxes()
Dim Total As Long, i As Integer
    Total = GetSelectedBoxes
    For i = 1 To 5
        If Total And 2 ^ i Then Debug.Print "Check" & i & " selected"
    Next i
End Sub

Теперь откройте Form1 и установите флажки 1, 3 и 4. Запустите процедуру ShowSelectedBoxes, и вы должны получить следующие выходные данные в непосредственном окне:

Check1 selected
Check3 selected
Check4 selected

Я использовал For...Loop для компактности в моем образце, но вы также можете легко разбить его на отдельные If...Then операторы, чтобы сделать что-то более значимое с установленными флажками.

Этот подход будет поддерживать до 31 или 32 отдельных флажков.

0 голосов
/ 21 июля 2011

Вы можете использовать двоичные числа для каждого флажка:

  • Первое значение равно 1 (=20)
  • Второе значение 2 (=21)
  • Третье значение 4 (=22)
  • Четвертоезначение равно 8 (=22)
  • Пятое значение равно 16 (=24)

Следовательно, при суммировании каждой перестановки у вас есть уникальный номер, который вы можете проверить.

  1. 1 только равно 0, 2 только равно 1 и так далее
  2. 1 +2 - 3, 1 + 3 - 5, 1 + 4 - 9, 1 + 5 - 17
  3. и т. Д.

Вы можете создатьмассивы с каждым делом, которое вы хотите проверить.
По крайней мере, я надеюсь, что это даст вам некоторые идеи или советы.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...