按字母顺序sorting和过滤使用图纸名称自动填充的combobox

此处的目标是在50张工作表的Excel工作簿的首页上有一个下拉框,该工作簿会自动填充每个工作表名称,并按字母顺序(升序)对列表进行sorting,并过滤掉某些条目。

到目前为止,我已经得到了这个(从这里工作, 如何使工作表的下拉列表 )做自动填充:

Private Sub workbook_open() Dim LSheets As Excel.Worksheet Dim OCmbBox As MSForms.ComboBox Set OCmbBox = ActiveWorkbook.Sheets(1).CmbSheet OCmbBox.Clear For Each LSheets In ActiveWorkbook.Sheets OCmbBox.AddItem LSheets.Name Next LSheets End Sub 

如上所述,现在的挑战是按字母顺序对列表进行sorting,并筛选出一些条目。 特别是前页页面本身,以及任何以“BETA”

在这里的其他地方,我发现了2个可能的sorting选项,但是我打了一个关于如何将它与我已经得到的结合起来的块。

sortingCombobox VBA

至于过滤,我在看一个SELECT CASEtypes的安排,但看不到如何标记一个否定的情况。

有点像这样的东西:

  Private Sub workbook_open() Dim LSheets As Excel.Worksheet Dim OCmbBox As MSForms.ComboBox Set OCmbBox = ActiveWorkbook.Sheets(1).CmbSheet OCmbBox.Clear For Each LSheets In ActiveWorkbook.Sheets If UCase(Left(LSheets.Name, 4)) IS NOT "BETA": OCmbBox.AddItem LSheets.Name Else Next Lsheets End Sub 

但是你甚至不想知道给我的可怕的错误! 一开始,没有一个IS NOT,并且!=也没有让我在任何地方(是的,因为Cyrix还在构buildCPU,所以我没有真正地看过任何类似于代码的东西)

任何帮助/指导这里的社区可以提供将受到感谢。

干杯。

抢。

这是我怎么做,使用临时工作表sorting,然后删除临时工作表。 这也会忽略名字以“BETA”开头的表格以及工作簿中的第一个表格:

 Private Sub workbook_open() Dim ws As Worksheet Dim arrSheets As Variant Dim strSheets As String Dim lNumSheets As Long Dim cboSheets As MSForms.ComboBox Set cboSheets = ActiveWorkbook.Sheets(1).CmbSheet cboSheets.Clear For Each ws In ActiveWorkbook.Sheets If ws.Index > 1 And Not ws.Name Like "BETA*" Then lNumSheets = lNumSheets + 1 strSheets = strSheets & ":" & ws.Name End If Next ws Application.ScreenUpdating = False Application.DisplayAlerts = False With Sheets.Add.Range("A1").Resize(lNumSheets) .Value = Application.Transpose(Split(Mid(strSheets, 2), ":")) .Sort .Cells, xlAscending, Header:=xlNo arrSheets = .Value .Worksheet.Delete End With Application.DisplayAlerts = True Application.ScreenUpdating = True cboSheets.List = arrSheets End Sub 

您可以使另一个子过程或函数进行sorting:

 Sub SortWorksheets() Dim N As Integer Dim M As Integer Dim FirstWSToSort As Integer Dim LastWSToSort As Integer Dim SortDescending As Boolean SortDescending = False If ActiveWindow.SelectedSheets.Count = 1 Then FirstWSToSort = 2 LastWSToSort = Worksheets.Count Else With ActiveWindow.SelectedSheets For N = 2 To .Count If .Item(N - 1).Index <> .Item(N).Index - 1 Then MsgBox "You cannot sort non-adjacent sheets" Exit Sub End If Next N FirstWSToSort = .Item(1).Index LastWSToSort = .Item(.Count).Index End With End If For M = FirstWSToSort To LastWSToSort For N = M To LastWSToSort If left(UCase(Worksheets(N).Name,4) = "BETA" Else If SortDescending = True Then If UCase(Worksheets(N).Name) > UCase(Worksheets(M).Name) Then Worksheets(N).Move before:=Worksheets(M) End If Else If UCase(Worksheets(N).Name) < UCase(Worksheets(M).Name) Then Worksheets(N).Move before:=Worksheets(M) End If End If End If Next N Next M End Sub 

FirstWSToSort你可以改变 – 我把它设置为2,因为你说你不想要标题屏幕被包括在内。

您可以通过将SortDescending更改为true来进行降序sorting。

您可以在N和M循环中的If语句中包含或删除更多条件:

 If left(UCase(Worksheets(N).Name,4) = "BETA" 

我喜欢忽略工作表的select案例。 也可以先把有效的工作表放入一个数组中,然后对数组进行sorting,然后通过循环来添加项目到combobox中

防爆。

 Private Sub workbook_open() Dim lsheets As Worksheet Dim validSheets() As Worksheet ReDim validSheets(0) For Each lsheets In ActiveWorkbook.Sheets Select Case UCase(Left(lsheets.name, 4)) Case "BETA": 'sheet's name is beta MsgBox "beta" Case Else 'sheet's name is not beta 'put code to add sheet to combobox here MsgBox "not beta" 'if the last item in the array is used then increase array size If Not validSheets(UBound(validSheets)) Is Nothing Then ReDim Preserve validSheets(0 To UBound(validSheets) + 1) End If 'add valid sheet to last place in array Set validSheets(UBound(validSheets)) = lsheets End Select Next lsheets 'now sort the array of valid sheets exampleFunctionSort validSheets 'now add the array of valid sheets in order Dim index As Integer For index = LBound(validSheets) To UBound(validSheets) 'add sheet here Next index End Sub 'place array sort code here Private Function exampleFunctionSort(arr As Variant) End Function 

呜呼! 我的时间闪耀。 (我喜欢简洁。)

 Private Sub workbook_open() Dim LSheets As Excel.Worksheet Dim OCmbBox As MSForms.ComboBox Set OCmbBox = ActiveWorkbook.Sheets(1).CmbSheet Dim sht As Worksheet OCmbBox.Clear With CreateObject("System.Collections.ArrayList") For Each sht In ThisWorkbook.Worksheets If sht.Name <> "BETA" Then .Add sht.Name Next .Sort OCmbBox.List = Application.Transpose(.toarray()) End With 

结束小组