Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使列表框项像选项按钮VBA一样工作_Vba_Listbox_Userform - Fatal编程技术网

使列表框项像选项按钮VBA一样工作

使列表框项像选项按钮VBA一样工作,vba,listbox,userform,Vba,Listbox,Userform,我有一个VBA用户表单,其中有一个包含8项的列表框。其定义为多选列表框。 项目2和项目3相互依赖,因此不能同时选择它们。 为了做到这一点,我写了: If ListBox1.Selected(3) = True Then ListBox1.Selected(2) = False ElseIf ListBox1.Selected(2) = True Then ListBox1.Selected(3) = False End If 它确实有效,但不是很好。如果我选择第2项而不是第3项

我有一个VBA用户表单,其中有一个包含8项的列表框。其定义为多选列表框。 项目2和项目3相互依赖,因此不能同时选择它们。 为了做到这一点,我写了:

If ListBox1.Selected(3) = True Then
    ListBox1.Selected(2) = False
ElseIf ListBox1.Selected(2) = True Then
    ListBox1.Selected(3) = False
End If

它确实有效,但不是很好。如果我选择第2项而不是第3项,那就好了。但是,如果我尝试在之后选择项目2,我需要先取消选择项目3,然后选择项目2。有没有更好的方法可以让它像选项按钮一样工作,而无需在选择其他项之前取消所选项?

好问题-对于列表框来说,这不是一个小问题,因为更改事件不会告诉您哪个项实际已更改

下面通过存储这两个选项中最后选择的选项来解决此问题

'Member fields
Private fListBoxItem2PreviouslySelected As Boolean

Private Sub ListBox1_Change()
    With ListBox1
        If fListBoxItem2PreviouslySelected Then
            If .Selected(3) Then
                .Selected(2) = False
                fListBoxItem2PreviouslySelected = False
            End If
        Else
            If .Selected(2) Then
                .Selected(3) = False
                fListBoxItem2PreviouslySelected = True
            End If
        End If
    End With
End Sub

'Just used for testing purposes
Private Sub UserForm_Initialize()
    Dim i As Long: For i = 0 To 10: ListBox1.AddItem i: Next
End Sub

对我来说还是一样的。我应该把第一行放在哪里?:Private FlistboxItem2先前被选为Boolean@user1040563第一行在模块顶部附近独立运行。你确定它不起作用吗?我创建了一个新的用户表单,在中删除了一个列表框,将其设置为MultiSelect=fmMultiSelectMulti,然后上面的操作完全允许:既不允许第2项也不允许第3项,或者:第3项但不允许第2项,或者:第2项但不允许第3项,或者:不允许第2项和第3项。您还应该注意,Selected()是以0为基数的,因此第一个项目被选中(0),etcIt可以工作!我把第一行放错地方了,谢谢@user1040563变量本身称为“字段”,可用于存储过程之外的信息,以便以后可以再次使用,等等。欢迎使用-很高兴它能工作