【问题标题】:Advanced finding connected value in selected row list box高级查找选定行列表框中的连接值
【发布时间】:2021-04-09 19:15:19
【问题描述】:

我的用户表单列表框中有 10 列。所有行都有一个单独的 ListIndex。 我想显示 f.e.在选择某行并单击“显示”按钮后,在 Msgbox 值中。 但是这个值在列表框中是不可用的。所以,我认为所有行都有单独的 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。

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

【问题讨论】:

  • 你的vlookup结果真的是数字(长)吗?如果您让声明处于打开状态会发生什么? (删除“只要”)
  • 这有点帮助,但现在结果是错误的。普通公式中的 VLookUp 和 VBA 中的 VLookUp(参数相同)结果完全不同。
  • 结果错误是什么意思?您能否举例说明您的数据和列表框的外观?
  • 我会尝试解释。因此,在我的工作表中,我有带有 ID 号的 A 列和带有一些参考值的 E 列。例如:对于 ID=1,此值为 PB123。如果查找值为 1,公式 VLookup 可以找到值“PB123”。在列表框中也显示正常。但是,如果我选择 ID=1 的行并使用此代码,则返回值不是“PB123”。完全不同。顺便提一句。我在所选行中为显示 ID 编号添加了额外的按钮,此功能始终为真。
  • 你有没有考虑到 ListIndex 是从 0 开始的?所以 ID=1 是 0,ID=2 是 1... 你试过 indexno = ListBoxResult.ListIndex + 1 吗?

标签: excel vba vlookup userform


【解决方案1】:

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

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

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

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

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

这个 sn-p 将打印出ListIndex 行中第三列的值。您也可以将此值分配给变量,并且可能不需要 VLOOKUP。

【讨论】:

  • 谢谢!实际上这是更简单的显示方法。我将把它用于列表框中的所有可用日期。但问题是当值在列表框中不可用时。例如:列表框显示 10 列主值。单击按钮后,我还想显示来自不同工作表的更多详细信息。场外信息必须具有一些通用标识,例如“ID 号”。我将尝试使用我的 var 类型。
  • 在这种情况下,我倾向于在包含行号的列表框中添加一个隐藏列,如果它在填充列表框时可用,而不是稍后查找。如果 ListIndex 和行号之间存在直接相关性,我也宁愿从列表索引中计算行号,无论是在填充列表时还是根据需要。这样做可以省去 Vlookup 的麻烦,并使多余的工作表列变得多余。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多