Excel VBA 按条件排序

如图,A列和B列的每个单元格均为任意字符串(这里是随便举的例子)。程序的用户窗体是这样的:在程序开始时,在第一个下拉菜单里面列出A列所有不重复的字符串(例如这里面就有三个... 如图,A列和B列的每个单元格均为任意字符串(这里是随便举的例子)。
程序的用户窗体是这样的:

在程序开始时,在第一个下拉菜单里面列出A列所有不重复的字符串(例如这里面就有三个选项,ABC,BCD和XYZ)。
想要实现的是,用户选择A列任一单元格中的字符串(例如选择"ABC")。然后程序在第二个下拉菜单中列出B列中与选择的字符串相对应的不重复字符串(这时B列应有选项12和123)。
假设用户此时选择"123",然后点击了CommandButton1。程序对工作表进行排序,把符合条件的行置于工作表最上方(在这个例子中就是第2行和第5行分别变成了第1和第2行。其它行顺序不变,依次顺延。
这样的程序要怎么写?写代码或者上传附件都可以。谢谢!
展开
 我来答
unsamesky
2013-10-05 · TA获得超过2736个赞
知道小有建树答主
回答量:859
采纳率:100%
帮助的人:437万
展开全部

所有代码如下:

Private Sub ComboBox1_Change()   '第一个组合框变化
    Dim dc As Object
    Set dc = CreateObject("Scripting.Dictionary")
    
    Dim i As Long
    ComboBox2.Clear
    With Sheet1
        For i = 1 To .[a65536].End(3).Row
            If .Cells(i, 1) = ComboBox1.Value Then
                If Not dc.exists(.Cells(i, 2).Value) Then
                    ComboBox2.AddItem .Cells(i, 2).Value
                    dc.Add Sheet1.Cells(i, 2).Value, i
                End If
            End If
        Next
    End With
    ComboBox2.Value = ComboBox2.List(0)
End Sub

Private Sub UserForm_Initialize()    '窗体初始化
    Dim dc As Object
    Set dc = CreateObject("Scripting.Dictionary")
    
    Dim i As Long
    For i = 1 To Sheet1.[a65536].End(3).Row
        If Not dc.exists(Sheet1.Cells(i, 1).Value) Then
            ComboBox1.AddItem Sheet1.Cells(i, 1).Value
            dc.Add Sheet1.Cells(i, 1).Value, i
        End If
    Next
    ComboBox1.Value = Sheet1.Cells(1, 1).Value
End Sub

Private Sub CommandButton1_Click()    '排序按钮
    Dim arr, brr(), crr()
    arr = Sheet1.Range("A1:B" & Sheet1.[a65536].End(3).Row).Value
    Dim i As Long, m As Long, n As Long
    For i = 1 To UBound(arr)
        If arr(i, 1) & arr(i, 2) = ComboBox1.Value & ComboBox2.Value Then
            n = n + 1
            ReDim Preserve brr(1 To 2, 1 To n)
            brr(1, n) = arr(i, 1)
            brr(2, n) = arr(i, 2)
        Else
            m = m + 1
            ReDim Preserve crr(1 To 2, 1 To m)
            crr(1, m) = arr(i, 1)
            crr(2, m) = arr(i, 2)
        End If
    Next
    With Sheet1
        .Cells(1, "D").Resize(n, 2) = WorksheetFunction.Transpose(brr)
        .Cells(n + 1, "D").Resize(m, 2) = WorksheetFunction.Transpose(crr)
    End With
End Sub

详见附件:

追问
能不能直接在A,B两列做改动啊。不要在E和D排序。
追答

当然可以,我只是害怕损坏你的数据,所以把数据输出到了D.E列。如果要在A,B列显示,只需修改下面的代码即可:

    With Sheet1
        .Cells(1, "D").Resize(n, 2) = WorksheetFunction.Transpose(brr)
        .Cells(n + 1, "D").Resize(m, 2) = WorksheetFunction.Transpose(crr)
    End With

将.cells(i,"D")和.cells(n+1,"D")里面的D改成A即可。如下:

    With Sheet1
        .Cells(1, "A").Resize(n, 2) = WorksheetFunction.Transpose(brr)
        .Cells(n + 1, "A").Resize(m, 2) = WorksheetFunction.Transpose(crr)
    End With
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式