【问题标题】:VBA Excel combobox not displaying the value after selecting option选择选项后VBA Excel组合框不显示值
【发布时间】:2013-02-03 08:28:59
【问题描述】:
Private Sub ComboBox1_DropButtonClick()

    If ComboBox1.ListCount > 0 Then
    ActiveSheet.ComboBox1.Clear
    End If

    For N = 1 To ActiveWorkbook.Sheets.Count - 1
    ComboBox1.AddItem ActiveWorkbook.Sheets(N).Name
    Next N

End Sub

我是 VBA 新手,请多多包涵。我可能不是最好的开始方式。

代码获取我工作簿中每个工作表的名称(最后一张工作表除外)并将它们添加到组合框列表中。起初,每次我单击下拉列表时,都会再次添加所有工作表名称,从而使列表随着每次单击而继续增长。我的补救措施是在每次点击时先清除组合框并重新填充。

但是,使用 clear 选项时,在进行选择时不会显示该值。不使用 clear 选项时显示正常。其他一切仍然有效,但我需要它来显示所选值,以免用户感到困惑。

有没有更好的方法来完成我的需要?

编辑:如果重要的话,这不在用户表单中,它只是直接位于工作表上的活动 x 组合框。

【问题讨论】:

  • Is there a better way to accomplish what I need? - 您希望组合框具体做什么?你提到了什么不起作用,但没有提到你想要发生的事情。
  • 我只需要它在框中显示所做的选择。相反,它在选择一个之后仍然是空的。当我不使用 clear 选项时,不会发生这种情况。

标签: excel vba combobox populate


【解决方案1】:

像下面这样的东西会起作用。但是,我会质疑为什么每次有人点击它时你都想重新填充组合框。为什么不在工作簿打开或工作表激活时这样做?

Private Sub ComboBox1_DropButtonClick(ComboBox1 As ComboBox)
    Dim strSelected As String
    If ComboBox1.ListIndex > -1 Then
      strSelected = ComboBox1.List(ComboBox1.ListIndex)
    End If
    If ComboBox1.ListCount > 0 Then
      ActiveSheet.ComboBox1.Clear
    End If

    For N = 1 To ActiveWorkbook.Sheets.Count - 1
      ComboBox1.AddItem ActiveWorkbook.Sheets(N).Name
      If strSelected = ActiveWorkbook.Sheets(N).Name Then
        ComboBox1.ListIndex = N - 1
      End If
    Next N
End Sub

【讨论】:

  • +1 - 快 1 分钟 - 并且还要处理未选择任何内容的情况! :-)
  • @Peter Albert,您的解决方案更好。只需检查零长度字符串。我的对每个循环周期进行逻辑测试。
【解决方案2】:

这是一个非常奇怪的行为 - 但是当您选择列表中的项目时会再次触发 DopButtonClick 事件。因此,刚刚分配的值在第二次运行时会在 .Clear 上被清除。

这段代码修复了它:

Private Sub ComboBox1_DropButtonClick()
    Dim strValue As String
    Dim n As Integer
    strValue = ComboBox1.Value

    If ComboBox1.ListCount > 0 Then
        ActiveSheet.ComboBox1.Clear
    End If

    For n = 1 To ActiveWorkbook.Sheets.Count - 1
        ComboBox1.AddItem ActiveWorkbook.Sheets(n).Name
    Next n
    ComboBox1.Value = strValue

End Sub

【讨论】:

  • 我是新手,所以我想我不能投票给你,但这解决了问题。非常感谢。也感谢你说这是奇怪的行为。我以为我疯了。
【解决方案3】:

非常好的解决方案彼得。 就我而言,我有一个可以在两个组合框运行之间更改的项目列表。如果选定的组合框项目不再在组合列表中,则在下一次运行时,该行:

ComboBox1.Value = strValue

抛出错误。

我发现声明一个公共索引:

Public nr As Integer

并在组合框代码中进行计数,以便每个按钮操作仅运行 .clear 一次,这使得它独立于列表更新工作:

Private Sub ComboBox1_DropButtonClick()
Dim n As Integer

If nr = 0 Then
    ActiveSheet.ComboBox1.Clear
    nr = 1
Else
    nr = 0
End If

For n = 1 To ActiveWorkbook.Sheets.count - 1
    ComboBox1.AddItem ActiveWorkbook.Sheets(n).Name
Next n
End Sub

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2015-12-23
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多