VBA显示选择选项

时间:2011-07-21 10:51:21

标签: vba permutation

我正在尝试编写一个代码,根据选中的复选框显示一个值。总共有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

每个值都与一个sub相关联,如果选中了该数组,它将填充该数组。在填充数组后,我需要对所选的那些执行附加功能。执行的功能是相同的,但如果没有选择值,我不想执行该功能,因为否则会破坏我的功能。函数本身是从选择到另一个数组的数组中选择重复项。

2 个答案:

答案 0 :(得分:0)

您可以对每个复选框使用binary numbers

  • 第一个值为1(=2 0
  • 第二个值为2(=2 1
  • 第三个值为4(=2 2
  • 第四个值为8(=2 2
  • 第五个值是16(=2 4

因此,当您对每个排列求和时,您可以检查一个唯一的数字。

  1. 1仅为0,2仅为1,依此类推
  2. 1 + 2为3,1 + 3为5,1 + 4为9,1 + 5为17
  3. 您可以根据要检查的每个案例创建数组 至少,我希望这会给你一些想法或提示。

    此致

答案 1 :(得分:0)

@JMax所指的是更常见的bit-masking。这是一个快速教程:

创建一个名为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个单独的复选框。