Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Excel 如何为MSForms.ListBox VBA计算MultiSelect的成本?_Excel_Vba_Listbox_Userform - Fatal编程技术网

Excel 如何为MSForms.ListBox VBA计算MultiSelect的成本?

Excel 如何为MSForms.ListBox VBA计算MultiSelect的成本?,excel,vba,listbox,userform,Excel,Vba,Listbox,Userform,嗨,我想实现以下目标: 我有一个带有列表框的UserForm。此列表框应具有以下选择行为: 这是我的列表框: 1鼠标单击切换选择 2在按住鼠标按钮的同时移动项目将切换选择 不幸的是,这一行为与3个可选的多选属性不匹配 0-fmMultiSelectSingle 不能多选 1-fmMultiSelectMulti 非常接近,但是: 按住按钮时,当鼠标不再位于项目上方时,将取消选中列表项目 2-fmmultiselectedextended 也很接近,但是: 当您单击其他位置时,当项

嗨,我想实现以下目标:

我有一个带有列表框的UserForm。此列表框应具有以下选择行为:

这是我的列表框:

1鼠标单击切换选择

2在按住鼠标按钮的同时移动项目将切换选择

不幸的是,这一行为与3个可选的多选属性不匹配

0-fmMultiSelectSingle

  • 不能多选
1-fmMultiSelectMulti

非常接近,但是:

  • 按住按钮时,当鼠标不再位于项目上方时,将取消选中列表项目
2-fmmultiselectedextended

也很接近,但是:

  • 当您单击其他位置时,当项目被选中时,所有项目都将取消选择
总之,目标是通过单击或在鼠标单击时移动来手动切换所有项目 我曾尝试使用ListBox\u Change事件执行此操作,但我不知道如何

这是我尝试的代码:

一般用户表单:

Private Type TView
    SelectedCol As Collection
    EventsDisabled As Boolean
End Type

Private this As TView

Public Property Get SelectedCol() As Collection
    Set SelectedCol = this.SelectedCol
End Property
Public Property Set SelectedCol(ByVal value As Collection)
    Set this.SelectedCol = value
    'Validate
End Property

Private Sub UserForm_Initialize()
Set SelectedCol = New Collection
counter = 0
Dim i As Integer

For i = 1 To OptionList.ListCount
    SelectedCol.Add Me.OptionList.Selected(i)
Next i
End Sub
UpdateSelectedCol子目录:

Sub UpdateSelectedCol()
Dim i As Integer
Dim bo As Boolean
For i = OptionList.ListCount To 1
    SelectedCol.Remove (i)
Next i
For i = 1 To OptionList.ListCount
    SelectedCol.Add OptionList.Selected(i - 1)
Next i

End Sub
列表框\u更改事件:

Private Sub OptionList_Change()
Dim i As Integer
If this.EventsDisabled = False Then
    this.EventsDisabled = True
    GO_btn.Enabled = ISSelected(Me.OptionList)
    
    ' keep selected until changed
    For i = 1 To Me.OptionList.ListCount
        If SelectedCol.Item(i) Then
            Me.OptionList.Selected(i) = True
        End If
    Next i
    
    Debug.Print SelectedCount(Me.OptionList)
    UpdateSelectedCol
End If
this.EventsDisabled = False
End Sub
所以我尝试的是:当选择被更改时,它将比较之前是否选择了该元素,并将保留它。这丝毫不会改变MultiSelect行为。在我看来,它至少应该保留所有选择过一次的项目

编辑:添加了一些图片和代码作为我尝试的示例,以及它应该如何工作。

好了,我想出来了:

首先,将1-MultiSelectMulti作为列表框属性。然后将以下代码添加到用户窗体:

解决方案
您需要相同用户表单中的先决条件才能使其工作
UpdateSelectedCol
toggleitem
我认为很容易重建。

您希望如何清除错误选择(用户方面)?@Nathan_Sav我不知道我是否正确理解您。我理解如下:如果用户想要取消选择列表框中的项目,应该怎么做?在这种情况下,用户单击应该切换它的项目。或者,如果选择了一堆项目,他应该能够在按住鼠标的同时移动所有项目。你应该在图片之前提出问题和你已经完成的工作
Private Sub OptionList_Change()
Dim i As Integer
If Not this.EventsDisabled Then
    this.EventsDisabled = True
    GO_btn.Enabled = ISSelected(Me.OptionList)
    
    ' MAIN SOLUTION ************************************************

    ' if has changed keep odl value when not = to listindex
    For i = 1 To Me.OptionList.ListCount
        If Me.OptionList.Selected(i - 1) <> SelectedCol.Item(i) And Not i - 1 = Me.OptionList.ListIndex Then
            ToggleItem (i)
        End If

    ' MAIN SOLUTION END ************************************************
        
    UpdateSelectedCol
    this.EventsDisabled = False
End If
End Sub
Private Type TView
    SelectedCol As Collection
    EventsDisabled As Boolean
End Type

Private this As TView

Public Property Get SelectedCol() As Collection
    Set SelectedCol = this.SelectedCol
End Property
Public Property Set SelectedCol(ByVal value As Collection)
    Set this.SelectedCol = value
    'Validate
End Property

Private Sub UserForm_Initialize()
Set SelectedCol = New Collection
counter = 0
Dim i As Integer

For i = 1 To OptionList.ListCount
    SelectedCol.Add Me.OptionList.Selected(i - 1)
Next i

End Sub


Sub ToggleItem(i As Integer)
    Me.OptionList.Selected(i - 1) = Not Me.OptionList.Selected(i - 1)
End Sub

Sub UpdateSelectedCol()
this.EventsDisabled = True
Dim i As Integer
Dim bo As Boolean
For i = OptionList.ListCount To 1 Step -1
    SelectedCol.Remove (i)
Next i
For i = 1 To OptionList.ListCount
    SelectedCol.Add OptionList.Selected(i - 1)
Next i
this.EventsDisabled = False
End Sub