我有一个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文件是这样的:
答案 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
时,city
和territory
会显示在相应的文本框中。
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