首页 > 解决方案 > 高级查找选定行列表框中的连接值

问题描述

我在我的用户表单列表框中显示 10 列。所有行都有一个单独的 ListIndex。选择某行并单击“显示”按钮后,我想在 Msgbox 值中显示 fe。但是这个值在列表框中是不可用的。所以,我认为所有行都有单独的 ListIndex,我可以使用 VLOOKUP 来查找我的目标。例如:我选择了行号。1 然后 ListIndex 为 1,这是我的查找值。在我的数据库表中,我有相同的个人 ID 值。然后,当然,我必须声明范围、列数和参数“False”。从理论上讲,我期望之后的结果,但它不起作用。

我的代码:

  Dim indexno As Long 'this is my delcaration for finding Look up Value
  Dim myVLookupResult As Long 'this is my declaration for VLookup Result
  indexno = ListBoxResult.ListIndex  'my Lookup Value is dynamic and depend of selected row
  myVLookupResult = Application.VLookup(indexno, Worksheets("DataBase").Range("A1:J100"), 5, False)
  MsgBox myVLookupResult 'should display result of VLOOKUP

但结果是错误:运行时错误:13 - 类型不匹配。我想问题在于将 Dim 的类型从 int 转换为 string。

有人可以支持我吗?提前致谢!

标签: excelvbavlookupuserform

解决方案


VLOOKUP 工作表函数的查找值必须与要在其中找到它的数据具有相同的数据类型。在您的代码中,查找值是Long数据类型。如果您要查找的列有文本,则找不到您要查找的号码。因此,您将查找值更改为Variant,并希望 Excel 能够计算出您想要的结果。但更好的方法是检查您的数据列并查找您实际拥有的值的类型。

接下来,假设您正在寻找一个分配给 Variant 和 Excel 的数字,因此,设法找到该数字的等效字符串,这将是函数的返回值,一个文本字符串。在大多数情况下,Excel 在这种情况下非常慷慨,但如果它确实抱怨“数据类型”,那是因为您试图将文本字符串分配给 Long 数据类型的变量。

除此之外,正如@Michal Palko 已经指出的那样,ListBox 的 ListIndex 是从 0 开始的。如果您的工作表中的数字是基于 1 的,则 VLOOKUP 的返回不会“完全不同”,但它将来自相邻行,因此是意外的。

但我想提醒你另一种可能性。如您所知,您可以将许多列加载到列表框中。您可以显示一些列并隐藏其他列,但您可以使用如下代码访问它们:-

With ListBox1
    Debug.Print .List(.ListIndex, 3)
End With

此代码段将打印出ListIndex. 您也可以将此值分配给变量,并且可能不需要 VLOOKUP。


推荐阅读