在向文本框添加数据时,在VBA中键入不匹配错误

时间:2015-04-19 09:30:18

标签: excel vba excel-vba

我有一个TextBox和一个ListBox,其中包含从Excel文件中填充的各种城市的列表

现在每个城市都有两种选择之一:在境内或境外。我希望该选项显示在 textBox

我试过这样的事情:

Private Sub CommandButton1_Click()

TextBox2.Value = Application.VLookup(Me.ListBox1.Text,Sheets("Sheet1").Range("B:C"), 2, False)

End Sub

但是我得到错误说明:

  

运行时错误2147352571(80020005)。无法设置Value属性。类型不匹配。

我的excel文件是这样的:

enter image description here

2 个答案:

答案 0 :(得分:0)

假设您的数据存储在Sheet1中。您希望将这些数据绑定到ListBox1上的UserForm。我建议使用自定义函数来加载数据,而不是使用RowSource属性绑定数据。在这种情况下,我建议使用Dictionary来避免重复。

请参阅:

Private Sub UserForm_Initialize()
Dim d As Dictionary
Dim aKey As Variant

Set d = GetDistinctCitiesAndTerritories
For Each aKey In d.Keys
    With Me.ListBox1
        .AddItem ""
        .Column(0, .ListCount - 1) = aKey
        .Column(1, .ListCount - 1) = d.Item(aKey)
    End With
Next
End Sub

'needs reference to Microsoft Scripting Runtime!
Function GetDistinctCitiesAndTerritories() As Dictionary

Dim wsh As Worksheet
Dim dict As Dictionary
Dim i As Integer

Set wsh = ThisWorkbook.Worksheets("Sheet1")
Set dict = New Dictionary

i = 2
Do While wsh.Range("A" & i) <> ""
    If Not dict.Exists(wsh.Range("B" & i)) Then dict.Add wsh.Range("B" & i), wsh.Range("C" & i)
    i = i + 1
Loop

Set GetDistinctCitiesAndTerritories = dict

End Function

之后,当用户点击ListBox时,cityterritory会显示在相应的文本框中。

Private Sub ListBox1_Click()

Me.TextBoxCity = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
Me.TextBoxTerritory = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)

End Sub

注意:代码是直接从头部编写的,因此它可能包含错误!

答案 1 :(得分:0)

问题很可能是您没有检查是否成功调用Application.VLookup。返回的大多数值都可以成功转换为String - 有一个重要的例外:如果VLookup返回错误,例如它找不到Me.ListBox1.Text - 它不能直接转换返回的Variant。

这应该证明:

Private Sub ReturnsOfVLookup()

    Dim works As Variant, doesnt As String

    works = Application.VLookup("Something not found", _
                                Sheets("Sheet1").Range("B:C"), 2, False)
    Debug.Print works

    On Error Resume Next
    doesnt = Application.VLookup("Something not found", _
                                 Sheets("Sheet1").Range("B:C"), 2, False)
    If Err.Number <> 0 Then
        Debug.Print Err.Description
    Else
        Debug.Print doesnt  'We won't be going here...  ;-)
    End If

End Sub