【问题标题】:How to select a value from my combobox list?如何从我的组合框列表中选择一个值?
【发布时间】:2020-01-20 12:21:40
【问题描述】:

我有代码在我的组合框中填充工作表名称,并在我单击下拉按钮时进行更新。

问题是我无法在组合框列表中选择一个值。我还有两个不希望组合框填充的隐藏工作表。

代码如下:

Private Sub REFRESH_COMBOBOX1()
Dim ws As Worksheet
ComboBox1.Clear
For Each ws In ThisWorkbook.Sheets
    If ws.Visible Then ComboBox1.AddItem(ws.Name)
Next ws
End Sub


Private Sub ComboBox1_DropButtonClick()
REFRESH_COMBOBOX1
End Sub

【问题讨论】:

  • 您需要在循环之前使用ComboBox1.Clear 行-但我还必须说您的 mousemove 事件可能不是触发列表刷新的最佳方式-您可以不使用 ComboBox1_Click() 事件或其他什么代替?
  • @tinman 我希望在工作表名称发生更改时更新组合框列表
  • 没有内置方法来注册工作表名称是否已更改,因此最简单的方法肯定是使用ComboBox1_Click() 触发ComboBox1.Clear,然后重新列出每个工作表名称。请看下面我的回答。
  • @jamheadart 它工作但我无法从我的组合框列表中选择一个值..
  • @TinMan 如果您只是更改工作表名称,这不会注册?

标签: excel vba


【解决方案1】:

当我移动鼠标时,组合框不断添加相同的工作表名称

嗯,当然可以。您有一个与移动鼠标相关的事件过程,并且您的过程将每个工作表名称添加到列表中,而不检查工作表是否已经存在等。这几乎肯定应该在不同的事件中处理.

您可能希望从表单的ActivateInitialize 事件处理程序填充此列表。因此,在其中一种方法中,您将调用一个清除和刷新ComboBox 的过程,例如:

Call RefreshSheetList()

该函数看起来像这样,并且应该是用户表单代码模块的一部分:

Private Sub RefreshSheetList()
With ComboBox1
    .Clear
    For n=1 To ActiveWorkbook.Sheets.Count
        .AddItem ActiveWorkbook.Sheets(n).Name
    Next n
End With
End Sub

如果表单本身改变了环境(即添加、重命名或删除现有工作表),那么重新填充 ComboBox 的适当位置将在执行该操作的事件处理程序中。

例如,您有一个 CommandButton1_Click 向工作簿添加一个新工作表(仅作为示例),然后您将在执行操作后调用它,如下所示:

Sub CommandButton1_Click()
Dim w as Worksheet
With ActiveWorkbook
    Set w = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
    w.Name = Me.TextBox1.Text
End With
Call RefreshSheetList()
End Sub

【讨论】:

  • 看来您知道问题出在哪里,或者至少您比我有更好的想法,所以,您为什么不充分解释一下自己呢?我读不懂你的心思。 tpu 可以订阅许多事件,但除非您礼貌地向我们解释您的实际问题是什么,否则我不可能知道哪个可能是最好的。
  • 如果清除是一个问题,请摆脱它。如果您需要保留它,例如防止重复等,那么您需要解释这些事情。不是在 cmets 中,而是在修改您原来的问题时。
  • 好的,所以您正在使用 DropDownButtonClick 事件,这可能不是正确的事件。此处给出的其他答案中的 Enter 事件有什么问题?这似乎对我有用。
【解决方案2】:

试试这个:

Private Sub REFRESH_COMBOBOX1() ' Routine for refreshing the list of names in box

    Dim ws As Worksheet     ' need a worksheet variable
    ComboBox1.Clear         ' clear the current list

  ' Cycle through every worksheet in the book, if it is NOT hidden then add name to list
    For Each ws In ThisWorkbook.Sheets    
        If ws.Visible Then ComboBox1.AddItem (ws.Name)  
    Next ws
End Sub ' 


' Separate routine to register the user putting focus on the box
' This happens every time the user clicks on or enters ComboBox1
Private Sub ComboBox1_Enter()
    REFRESH_COMBOBOX1 ' Calling the routine above
End Sub

【讨论】:

  • @Tristan300 我在这里看到了问题-在顶部的代码中,您使用了ComboBox1_DropButtonClick(),而在我的回答中,我使用了ComboBox1_Enter()
  • 如果您使用ComboBox1_DropButtonClick(),您将看到包含.Clear 行的REFRESH_COMBOBOX1 例程在您单击下拉箭头时被调用,但当您从列表 - 所以你选择一个名字,但也立即清除它。请改用Enter
  • 我不能使用 enter 事件,因为我在其他条件下使用它,如果我在该事件中调用 REFRESH_COMBOBOX,它会给我一个错误...关于仅使用 DropButtonClick 事件的任何其他想法?跨度>
  • 我添加了另一个答案,其清除和重新添加列表中的项目的方法略有不同。
【解决方案3】:

如果您必须使用 DropButtonClick 事件,请使用这种稍微不同的清除组合框的方法:

Sub REFRESH_COMBOBOX1()
Dim ws As Worksheet
Dim i As Long
Do While ComboBox1.ListCount > 0
    ComboBox1.RemoveItem (0)
Loop
For Each ws In ThisWorkbook.Sheets
    If ws.Visible Then ComboBox1.AddItem (ws.Name)
Next ws
End Sub

而不是使用内置的.Clear 函数也会删除框中的文本,它只会从列表中删除项目然后重新添加它们

这意味着当您选择一个项目时,即使再次调用“REFRESH_COMBOBOX1”例程,它也不会被清除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多