在VBA中,我有一个用工作表名称填充我的组合框的代码,每当我单击下拉按钮时,它都会更新,但问题是我无法在组合框列表中选择一个值。我也有两个隐藏的工作表,我不希望组合框填充。
此处提供代码:
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
答案 0 :(得分:1)
在移动鼠标时,组合框会不断添加相同的工作表名称
当然可以。您有一个与移动鼠标相关的事件过程,并且该过程正在将每个工作表名称添加到列表中,而没有检查工作表是否已经存在,等等。几乎可以肯定,这应该在其他事件中处理
可能您想从表单的Activate
或Initialize
事件处理程序中填充此列表。因此,在其中一种方法中的某处,您将调用一个清除并刷新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
答案 1 :(得分:1)
尝试一下:
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
答案 2 :(得分:0)
如果必须使用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”例程也不会清除该项目。