【问题标题】:ComboBox.Dropdown Method only shows one list itemComboBox.Dropdown 方法只显示一个列表项
【发布时间】:2017-07-26 19:49:28
【问题描述】:

我在 excel (vba) 中使用了一个 ComboBox,它根据输入的内容(接近匹配)将项目添加到列表中,这样如果他们输入的内容已经存在于数据范围中,他们可以看到并单击。

除了应该显示列表的 ComboBox1.DropDown 方法之外,这一切正常。不幸的是,它只显示一个带有滚动按钮​​的项目。单击下拉按钮或按 f4 会显示由框的属性确定的正确行数。

我已经搜索和搜索了,有什么线索可以自动显示列表中的所有项目吗?

这是我关于 SO 的第一个问题,如果标记不正确,请告知。

编辑:ActiveX 控件、.listRows 和 .listFillRange 似乎没有帮助

【问题讨论】:

  • ComboBox1.DropDown 在哪里被调用 - ComboBox1_Change()?是ComboBox1.MatchEntry = 1(fmMatchEntryComplete)吗?这是一个 UserForm 而不是 ActiveX 对吗?
  • 是的 .DropDown 由 ComboBox_Change() 调用,但在它自己的 Sub 中专门用于构建列表。 .MatchEntry 设置为 none,我遇到了问题,因为这些行: s = ComboBox1.Value ComboBox1.clear ComboBox1.Value = s 在清除列表时,还将框的值设置为第一个匹配值。我确实应该提到它是一个 ActiveX 控件,我会尝试一个用户表单,看看它是否有不同的行为。
  • 仍然需要学习如何在 SO 上格式化文本,我会查看文档以便将代码和 cmets 分开。
  • 最简单的方法是在此处选择要粘贴的代码,按 Tab,复制,然后粘贴到您的编辑框中。为什么需要在文本更改时重建列表?是不是因为想要的值可能不是用户输入的第一个词?
  • 是的,用户需要知道是否已经输入,因此在输入 4 个左右的字母后,应该会出现一个下拉列表,其中包含现有名称,其中包括(或接近于)什么他们进入了。现有名称可能与他们预期的不同。它很重要,因为会为条目生成交叉引用编号,并且它基于输入是否已经存在。

标签: vba excel combobox


【解决方案1】:

我一直在创建列表的自定义 Sub 中调用 .DropDown,我需要更改它,因此它现在是 ComboBox1_Change() 中的最后一行。

不知道为什么它在 _change() 中的行为与在我的 Sub(由 _change() 调用)中的行为不同!

我认为这实际上与使用.clear方法然后调用.Dropdown有关,它不会重新计算要显示多少行。我可能需要将它们单独保存在单独的 Subs 中感谢您的回复@PatricK

编辑:未解决,它现在可以在第一次“更改”时正常工作,键入更多字母会导致列表的其余部分在第一行更新并具有滚动按钮​​时保持未清除。我希望我确切地知道这些方法是如何编写的以及它们何时被执行。

【讨论】:

  • 不确定这是否会有所帮助,但对于组合框,我从不使用Change 事件,我使用Click 事件。
  • 有趣,我认为这不符合我的需要,因为我希望在您键入时更改列表。
【解决方案2】:
ComboBox1.Visible = False
ComboBox1.Visible = True
ComboBox1.Activate
If ComboBox1.ListCount > 0 Then
   ComboBox1.DropDown
End If

这段代码似乎可以解决问题,至少显示了不止一行,如果删除项目,列表会变短,不像以前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2019-02-22
    • 2019-07-10
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多