【问题标题】:Ms Excel VBA: Set a sorting combo boxMs Excel VBA:设置排序组合框
【发布时间】:2015-02-24 03:28:59
【问题描述】:

虽然我在 Visual Basic 方面有一些经验,但我还是 VBA 新手。 我有一个 Microsoft Excel 2010 工作表。第 29 行包含表的标题,数据来自第 30 行,依此类推。这张表大约有 20 列。

我正在尝试在此工作表中插入一个包含三个选项的组合,因此当您选择第一个选项时,它将根据 R 列和 S 列对所有表应用降序排序。如果您选择第二个,它将根据 S 列和 R 列应用降序排序。如果您选择第一个,它将根据 A 列应用降序排序。 S 列和 R 列将被隐藏。 我希望你们能帮助我。谢谢你,对不起我的英语。

【问题讨论】:

    标签: excel vba excel-2010


    【解决方案1】:

    只是把图片变成文字,我假设你有一个看起来像这样的 excel 表:

    (在此示例中保持列 S 和 R 可见)

    您想要添加一个组合框,该组合框将根据组合框中选择的值对列进行排序,如下所示:

    • 选项 1:按 R 列降序排序,然后按 S 列排序
    • 选项 2:按 S 列降序排序,然后按 R 列排序
    • 选项 3:按 A 列降序排序。

    首先,如果您还没有这样做,请添加Developer Tab to Excel

    接下来,将表格中的单元格放入命名范围。如果此表中的行将更改,请确保创建一个 dynamic named range。 (动态命名范围有点棘手,但对动态数据非常有用

    通过单击开发人员选项卡中的“插入”添加组合框,然后从表单控件中选择组合框(注意:ActiveX 组合框是完全不同类型的控件。使用它可以得到相同的结果,但代码会有所不同。)

    将组合框拖到工作表的某处:

    现在将选项值添加到组合中。您应该在工作簿中的某个位置添加组合框的值(例如 Sheet2、单元格 A1、A2 和 A3)。

    返回表格和组合框所在的工作表。右键单击组合框并选择Format Control

    输入范围范围应该是包含排序选项的单元格。它看起来像这样:Sheet2!$A$1:$A$3

    再次右键单击组合框并选择Assign Macro。为宏命名并将宏放入此工作簿

    单击新建。您将被带到 Visual Basic 编辑器。

    您可以在此处应用您的排序代码:

    Option Explicit
    
        Sub DropDown2_Change()
            Dim comboValue As String
            Dim Key1ColumnIndex As Integer
            Dim Key2ColumnIndex As Integer
    
            'You can get the name by doing something like this in the immediate window:  "? Sheet1.Shapes(1).OLEFormat.Object.Name"
            comboValue = Sheet1.Shapes("Drop Down 2").ControlFormat.List(Sheet1.Shapes("Drop Down 2").ControlFormat.ListIndex)
    
            Select Case comboValue
    
                Case "Option1"
                    Key1ColumnIndex = 18
                    Key2ColumnIndex = 19
                Case "Option2"
                    Key1ColumnIndex = 19
                    Key2ColumnIndex = 18
                Case "Option3"
                    Key1ColumnIndex = 1
                    Key2ColumnIndex = 1
            End Select
    
    
           Range("DataValues").Sort Key1:=Range("DataValues").Cells(1, Key1ColumnIndex), _
                                    Order1:=xlDescending, Header:=xlNo, DataOption1:=xlSortNormal, _
                                    Key2:=Range("DataValues").Cells(1, Key2ColumnIndex), order2:=xlDescending
        End Sub
    

    您现在应该可以开始了。如果您需要一个工作示例,请查看我创建的示例表here;请注意,它没有表的动态名称范围。

    【讨论】:

    • 谢谢@ray023 这非常有帮助。还有一个问题。我想在模板中定义这个宏,以便第三方应用程序用不同数量的数据填充几张工作表,并为工作表设置个性化名称。如果您不知道要获取多少数据,您将如何处理数据范围?您将如何在同一个工作簿中对多张工作表进行这项工作?再次感谢!
    • 我必须提出更多问题才能给出完整的答案。通常,如果架构没有改变(例如,一个名为“客户”的工作表将始终存在并且列不会改变),那么您的预定义动态范围应该可以工作。如果您想深入研究,您可能可以根据导入的数据创建动态范围,但这比评论更适合新问题。此外,如果可能(我知道我们并不总是如此奢侈),我会考虑将数据放入数据库(例如 Access);维护数据更简单的方法。
    猜你喜欢
    • 2019-05-29
    • 2021-05-11
    • 2013-03-10
    • 2018-04-10
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多