运行-更改组合框值时的时间错误“380”(使用用户表单和 Excel 中的 VBA)

Run-time error '380' when changing combobox value (using userforms and VBA in Excel)

这是一个非常简单的例子来说明我的问题。
使用组合框和命令按钮创建用户窗体。
将组合框的样式 属性 设置为“fmStyleDropDownList”。
添加代码

Private Sub CommandButton1_Click()
ComboBox1.Value = "But then it errors sometimes if I change it here"
End Sub

Private Sub UserForm_Initialize()
ComboBox1.Value = "I can initialize to any value I choose"
End Sub

当我 运行 用户窗体时,我可以整天单击命令按钮而不会出现任何错误。
但是,当我单击组合框的下拉箭头并且框中的文本突出显示时,下次单击命令按钮时,我得到“运行-time error '380': Could not set值 属性。无效 属性 值"

使用 style="fmStyleDropDownCombo" 不是我想要考虑的选项。我尝试使用 ComboBox1.ListIndex = -1 清除选择,但没有用。

关于如何可靠地避免此错误的任何想法?

当您使用 fmStyleDropDownList 样式时,您的 ComboBox 值必须与列表中的一项匹配,但由于您没有添加任何项目,您的列表当前为 Null

要对此进行测试,请在您的用户表单中创建另一个 ComboBox 并将其放入您的用户表单中:

Private Sub CommandButton1_Click()
    Debug.Print "=== Click ==="
    Debug.Print "ComboBox1 Type: " & TypeName(ComboBox1.List)
    Debug.Print "ComboBox2 Type: " & TypeName(ComboBox2.List)
            
    ComboBox1.Value = "But then it errors sometimes if I change it here"
    
    On Error Resume Next
    ComboBox2.Value = "But then it errors sometimes if I change it here"
    If Err.Number <> 0 Then Debug.Print "ComboBox2 - Error"
    
    Debug.Print "============="
End Sub

Private Sub UserForm_Initialize()
    ComboBox1.AddItem "I can initialize to any value I choose"
    ComboBox1.AddItem "But then it errors sometimes if I change it here"
    
    ComboBox1.Value = "I can initialize to any value I choose"
    ComboBox2.Value = "I can initialize to any value I choose"
    
    Debug.Print "ComboBox1 Type: " & TypeName(ComboBox1.List)
    Debug.Print "ComboBox2 Type: " & TypeName(ComboBox2.List)
End Sub

当您 运行 用户表单时,您应该立即看到 window:

ComboBox1 Type: Variant()
ComboBox2 Type: Null

在单击 ComboBox2 之前单击按钮(任意多次),您会注意到输出仍然相同。 (也没有错误,因为 List 仍然是 Null

现在点击ComboBox2并再次点击按钮,你会看到ComboBox2.List的类型现在已经从Null变成了Variant并且会触发错误。

===============

所以,为了避免这种情况,您需要先填充 List,下面显示了 AddItem 方法:

Private Sub CommandButton1_Click()
ComboBox1.Value = "But then it errors sometimes if I change it here"
End Sub

Private Sub UserForm_Initialize()
ComboBox1.AddItem "I can initialize to any value I choose"
ComboBox1.AddItem "But then it errors sometimes if I change it here"

ComboBox1.Value = "I can initialize to any value I choose"
End Sub

据我所知,用这种风格设置 ComboBox 值的首选方法是遍历 ComboBox List 属性,检查其值并更改 ListIndex一旦找到:

Private Sub CommandButton1_Click()
    Dim i As Long
    For i = 0 To ComboBox1.ListCount - 1
        If ComboBox1.List(i) = "But then it errors sometimes if I change it here" Then
            ComboBox1.ListIndex = i
            Exit For
        End If
    Next i
End Sub