0
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 组合框。

4

3 回答 3

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
于 2013-02-18T20:14:20.703 回答
1

这是一个非常奇怪的行为 - 但是当您选择列表中的项目时会再次触发 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
于 2013-02-18T20:15:24.167 回答
0

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

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
于 2018-08-06T20:28:32.503 回答