【问题标题】:Sort Combobox VBA排序组合框 VBA
【发布时间】:2013-03-10 17:15:43
【问题描述】:

我一直在思考如何对组合框中的值进行排序。

我在初始化表单时将项目添加到 ComboBox,因为工作表上值的数量不断增加。

我使用下面的代码来添加项目:

With ComboBox1
lastcell = ThisWorkbook.Sheets("1").Range("F1000000").End(xlUp).Row + 1
For i = 2 To lastcell 
.AddItem ThisWorkbook.Sheets("1").Cells(i, 6)
Next i
End With

我想将我要在 ComoBox 上添加的值复制到另一个工作表中,然后在新工作表中对其进行排序,它工作正常,但它似乎不是一个聪明的选择,这意味着我创建另一个表,然后复制值并对其进行排序,而不是直接排序。

我的问题是,有人知道如何直接从原始工作表中进行操作吗?我对API一无所知,所以请只使用VBA代码。我已经在 MSDN 上查看过,但我不知道如何使它工作。

谢谢,如果需要更多信息,请告诉我。

PS:我无法直接从原始工作表中对它们进行排序,因为此工作表必须具有静态顺序

【问题讨论】:

    标签: vba sorting excel combobox


    【解决方案1】:

    为数字排序 123

    For Each cell In ThisWorkbook.Sheets("sheet1").Range("list1")
    
    Me.ComboBox1.AddItem cell
    
    Next cell
    
    With Me.ComboBox1
    
     For x = LBound(.list) To UBound(.list)
    
       For y = x To UBound(.list)
    
       If .list(y, 0) + 0 < .list(x, 0) + 0 Then
    
         blah = .list(y, 0)
    
        .list(y, 0) = .list(x, 0)
    
        .list(x, 0) = blah
    
       End If
    
     Next y
    
    Next x
    
     End With
    

    用于对文本 abcd 进行排序

    For Each cell In ThisWorkbook.Sheets("sheet1").Range("list1")
    
    Me.ComboBox1.AddItem cell
    
    Next cell
    
    With Me.ComboBox1
    
     For x = LBound(.list) To UBound(.list)
    
       For y = x To UBound(.list)
    
       If .list(y, 0)  < .list(x, 0)  Then
    
         blah = .list(y, 0)
    
        .list(y, 0) = .list(x, 0)
    
        .list(x, 0) = blah
    
       End If
    
     Next y
    
    Next x
    
     End With
    

    【讨论】:

      【解决方案2】:

      您可以将工作表中的值读取到数组中,使用代码对其进行排序,然后添加项目。

      此代码将使用快速排序来执行此操作:

      Private Sub UserForm_Initialize()
          Dim varRange() As Variant
          Dim lngLastRow As Long
          Dim i As Long
      
          lngLastRow = Range("F:F").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
          varRange = Range("F:F").Resize(lngLastRow).Cells
      
          subQuickSort varRange
      
          Me.ComboBox1.List = varRange
      End Sub
      
      
      Public Sub subQuickSort(var1 As Variant, _
          Optional ByVal lngLowStart As Long = -1, _
          Optional ByVal lngHighStart As Long = -1)
      
          Dim varPivot As Variant
          Dim lngLow As Long
          Dim lngHigh As Long
      
          lngLowStart = IIf(lngLowStart = -1, LBound(var1), lngLowStart)
          lngHighStart = IIf(lngHighStart = -1, UBound(var1), lngHighStart)
          lngLow = lngLowStart
          lngHigh = lngHighStart
      
          varPivot = var1((lngLowStart + lngHighStart) \ 2, 1)
      
          While (lngLow <= lngHigh)
              While (var1(lngLow, 1) < varPivot And lngLow < lngHighStart)
                  lngLow = lngLow + 1
              Wend
      
              While (varPivot < var1(lngHigh, 1) And lngHigh > lngLowStart)
                  lngHigh = lngHigh - 1
              Wend
      
              If (lngLow <= lngHigh) Then
                  subSwap var1, lngLow, lngHigh
                  lngLow = lngLow + 1
                  lngHigh = lngHigh - 1
              End If
          Wend
      
          If (lngLowStart < lngHigh) Then
              subQuickSort var1, lngLowStart, lngHigh
          End If
          If (lngLow < lngHighStart) Then
              subQuickSort var1, lngLow, lngHighStart
          End If
      
      End Sub
      
      Private Sub subSwap(var As Variant, lngItem1 As Long, lngItem2 As Long)
          Dim varTemp As Variant
          varTemp = var(lngItem1, 1)
          var(lngItem1, 1) = var(lngItem2, 1)
          var(lngItem2, 1) = varTemp
      End Sub
      

      【讨论】:

      • 你不需要循环。你可以使用Me.ComboBox1.List = varRange
      【解决方案3】:

      这取决于数据的环境、类型和结构。但我更喜欢这样做:
      您也可以使用数组和冒泡排序算法:)
      稍微修改代码以适合您的情况

      Option Explicit
      
      Sub WITH_COMBOBOX()
      
          Dim i As Long
          Dim arr() As String
      
          Dim lastCell As Long
          lastCell = 500
      
          ReDim arr(lastCell)
          Call FillAndSortArray(arr)
      
          For i = 2 To lastCell
              .AddItem arr(i - 2)
          Next i
      End Sub
      
      Sub FillAndSortArray(ByRef myArray() As String)
      
          Dim i As Long
      
          For i = LBound(myArray) To UBound(myArray)
              myArray(i) = CStr(ThisWorkbook.Sheets(1).Range("F" & i + 2).Value)
          Next i
      
          Call BubbleSort(myArray)
      End Sub
      
      
      Sub BubbleSort(ByRef myArray() As String)
      
          Dim i As Long, j As Long
          Dim Temp As String
      
          For i = LBound(myArray) To UBound(myArray) - 1
              For j = i + 1 To UBound(myArray) - 1
                  If myArray(i) > myArray(j) Then
                      Temp = myArray(j)
                      myArray(j) = myArray(i)
                      myArray(i) = Temp
                  End If
              Next j
          Next i
      End Sub
      

      【讨论】:

        【解决方案4】:

        试试下面的代码:

        Sub GetAction()
        
            Dim rng As Range, lastcell As Long
            lastcell = Range("F1000").End(xlUp).Row + 1
            Set rng = Range("F1:F" & lastcell)  ' assuming to start from F1
        
            If Not rng Is Nothing Then
                rng.Sort Range("F1")
                ComboBox1.ListFillRange = rng.Address
            End If
        
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-29
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          • 2019-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多