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组合框。
答案 0 :(得分: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)
这是一种非常奇怪的行为 - 但是当您在列表中选择项目时,会再次触发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
答案 2 :(得分:0)
很好的解决方案彼得。 就我而言,我列出了可以在两次组合框运行之间更改的项目列表。如果所选的组合框项目不在组合列表中,则在下一次运行时,显示以下行:
ComboBox1.Value = strValue
引发错误。
我发现声明了一个公共索引:
Public nr As Integer
并在组合框代码内进行计数以运行。每个按钮操作仅清除一次即可使其独立于列表更新而工作:
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