Vba 更改listbox背景颜色时,listbox取消选择自身

Vba 更改listbox背景颜色时,listbox取消选择自身,vba,excel,listbox,Vba,Excel,Listbox,我有一个列表框和代码来确保它(和其他元素)被选中。我在代码中添加了一个ELSE,这样,如果列表框中有一个选中的项目,它就会将背景颜色更改为白色。如果先前尝试的条目是重复条目(将BG更改为红色),则需要执行此操作,但将其设置为默认值更容易 我的组合框和文本框不这样做。你知道我可以做什么不同的事情,只有初始化函数才能清除它吗 谢谢 下面是清除列表框中选定项的代码段。行上方的注释似乎是导致此问题的原因 编辑:每当我更改背景色时,它都会取消选择。当我导致复制时,它也会取消选择,这不会改变背景颜色。因此,

我有一个列表框和代码来确保它(和其他元素)被选中。我在代码中添加了一个ELSE,这样,如果列表框中有一个选中的项目,它就会将背景颜色更改为白色。如果先前尝试的条目是重复条目(将BG更改为红色),则需要执行此操作,但将其设置为默认值更容易

我的组合框和文本框不这样做。你知道我可以做什么不同的事情,只有初始化函数才能清除它吗

谢谢

下面是清除列表框中选定项的代码段。行上方的注释似乎是导致此问题的原因

编辑:每当我更改背景色时,它都会取消选择。当我导致复制时,它也会取消选择,这不会改变背景颜色。因此,在许多情况下,列表框会自行取消选择。如果我能找到其中一个(这里列出了其中两个)的原因,那么也许我可以解决第三个

Function HighlightEmpty(ByVal nameSelect As Boolean, ByVal comboSelect As Boolean, ByVal listSelect As Boolean) As Boolean
' Highlight empty fields
If Not nameSelect Then
    Enter_New_DTC_Form.SignalNameTxtBox.BackColor = RGB(255, 0, 0)
Else
    Enter_New_DTC_Form.SignalNameTxtBox.BackColor = RGB(255, 255, 255)
End If

If Not comboSelect Then
    Enter_New_DTC_Form.ComboBox1.BackColor = RGB(255, 0, 0)
Else
    Enter_New_DTC_Form.ComboBox1.BackColor = RGB(255, 255, 255)
End If

If Not listSelect Then
    Enter_New_DTC_Form.ListBox1.BackColor = RGB(255, 0, 0)
Else 
    **'This is where it breaks**
    Enter_New_DTC_Form.ListBox1.BackColor = RGB(255, 255, 255)    
End If

' Set focus to first empty field on form
If Not nameSelect Then
    Enter_New_DTC_Form.SignalNameTxtBox.SetFocus
ElseIf Not comboSelect Then
    Enter_New_DTC_Form.ComboBox1.SetFocus
ElseIf Not listSelect Then
    Enter_New_DTC_Form.ListBox1.SetFocus
End If

' Return boolean to trigger message
HighlightEmpty = Not nameSelect Or Not comboSelect Or Not listSelect
End Function

我意识到原来的帖子已经有两年多了,但它仍然是相关的,因为我使用Excel 2013和VBA 7.1体验了这个问题。说到编码,我只是个业余爱好者,但我提出了以下代码作为解决方法

此代码将在验证数据并准备好进入下一步后使用

最后,您将找到所选列表项的索引,向其添加1,将所选列表项设置为下一个/上一个项目,然后将其设置回实际项目。我不知道为什么这是必要的,但它是有效的

'Determine the currently selected list item and set j to the index of it
For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) Then j = i
Next i

'Set j to 1 more than the index of the selected list item
j = j + 1


'If the selected list item isn't the last one, select the next item,
'then re-select the original item
If j < ListBox1.ListCount Then
    ListBox1.BackColor = RGB(255, 255, 255) 'Set the background color to white
    ListBox1.ForeColor = RGB(0, 0, 0)       'and the foreground color to black
    ListBox1.ListIndex = (j)                'Select the NEXT item in the list
    ListBox1.ListIndex = (j - 1)            'Re-select the ORIGINAL item

'If the selected list item is the last one, select the previous item,
'then re-select the original item
ElseIf j = ListBox1.ListCount Then
    ListBox1.BackColor = RGB(255, 255, 255) 'Set the background color to white
    ListBox1.ForeColor = RGB(0, 0, 0)       'Set the foreground color to black
    ListBox1.ListIndex = (j - 2)            'Select the PREVIOUS item in the list
    ListBox1.ListIndex = (j - 1)            'Re-select the ORIGINAL item
End If
”确定当前选定的列表项并将j设置为其索引
对于ListBox1.ListCount-1的i=0
如果选择ListBox1.i,则j=i
接下来我
'将j设置为比所选列表项的索引多1
j=j+1
'如果所选列表项不是最后一项,请选择下一项,
'然后重新选择原始项目
如果j

希望这有帮助。我花了很多时间研究,无法找到根本原因的解决方案,但在我自己的电子表格中实现了这段代码。

一个可能的解决方案是存储选择,更改背景色,然后重新应用选择

Public Sub UpdateBackgroundColor()
    Dim sel() As Boolean: sel = GetSelectedIndexs()

    list_box.BackColor = &H80000005

    SetSelectedIndexs sel
End Sub

Private Function GetSelectedIndexs() As Boolean()
    If list_box.ListCount > 0 Then
        ReDim sel(0 To list_box.ListCount - 1) As Boolean

        Dim i As Integer
        For i = 0 To list_box.ListCount - 1
            sel(i) = list_box.Selected(i)
        Next

        GetSelectedIndexs = sel
    Else
        ReDim GetSelectedIndexs(0)
    End If
End Function

Private Function SetSelectedIndexs(sel() As Boolean)
    Dim i As Integer
    For i = LBound(sel) To UBound(sel)
        list_box.Selected(i) = sel(i)
    Next
End Function

如何运行此函数?在什么事件上?在表单上单击保存按钮。每次点击SAVE时,在填充行并检查其是否重复(发送消息并删除行)之前,它将检查以确保选中必填字段。如果没有,则调用此函数突出显示空字段,然后将焦点放在第一个字段上。然后它将退出保存子系统,以便他们可以重试。为什么不使用子系统来代替呢。上面的代码更适合它。您可以在其中传递所有值。虽然函数不是100%不适用于执行对象方法和属性(基本上用于返回值),但SUB做得更好。好的,解决了我自己的问题。所以我使用了上面的函数,但是添加了几个for循环;一个用于捕获开始时在数组中选择的内容,另一个用于在结束时从数组中重新填充列表。它看起来像意大利面条,但我在谷歌上找不到任何与更改背景颜色时未选中列表框项目相关的内容。我可以发布代码,但它真的很简单,因为它听起来。FWIW,必须重拨以使数组达到列表上的基本大小;这样做是为了灵活性。此(实践)代码将被移植和修改以供实际使用。感谢您的回复。为了响应L42,我使用了一个函数来返回布尔值。出于某种原因,潜艇似乎更复杂。我在IF语句中将函数作为参数调用。这似乎是最优雅的方法,也是我对C或Python的goto方法。并不是说我会用goto…给某个城里人打电话。我做了你建议的改变。谢谢。在这种情况下可能不需要。我建议进行此更改,因为如果。。。如果。。。否则…
在单个块中,如果它依赖于单个变量或属性,并且操作取决于它所具有的内容。例如,如果颜色为红色,则停止;否则,如果颜色是黄色,做一个空翻;否则,去买一袋葡萄。