通过连续单击单元格/文本,

时间:2018-08-23 13:36:29

标签: excel vba sorting

我正在尝试根据单击的列标题对表格中的excel列进行排序。到目前为止,我有下面的代码,它工作正常。我单击标题,然后按单击的列标题对表进行排序。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Not Intersect(ActiveCell, Range("active[#Headers]")) Is Nothing Then
        Dim KeyRange As Range
        Set KeyRange = Range(Target.Address)

        SortOrder = xlAscending

        If Target.Value = "price" Then
            SortOrder = xlDescending
        End If

        If Target.Value = "profit" Then
            SortOrder = xlDescending
        End If

        Range("active").Sort Key1:=KeyRange, Header:=xlYes, Order1:=SortOrder
    End If

End Sub

当我单击其他标题单元格时,先前的排序将被取消,而新的将被设置。这就是我要更改的内容。我想添加次要排序标准,而不是更改主要排序条件。

我想通过多个条件进行排序,只需连续单击不同的标题单元格即可。例如,首先按价格排序,然后按到期日排序,然后再按其他排序。这种组合可能会有所不同,因此我不能真正使用vba排序条件1,2,3来一次完成所有排序。

为清除排序顺序,我使用以下方法:

ActiveWorkbook.Worksheets("active").ListObjects("active").Sort.SortFields. _
    Clear

您有什么想法,如何实现?

请不要问我为什么我以编写方式编写代码。我不知道。不幸的是,我不是编码人员,我大致了解了代码的工作原理,但是我没有更深入的知识。我只是通过搜索然后尝试如何工作(或更常见的是如何工作),将来自不同来源的代码组合在一起。

2 个答案:

答案 0 :(得分:3)

  • 您可以通过将RangeRange("active[#Headers]")中的Range("active").Sort的使用更改为ListObject-{{3}的内置属性和方法来改进代码}和ListObject.HeaderRowRange
  • Select Case也可能更整洁,而不是多个If语句。
  • Range(Target.Address)是多余的-您只能使用Target
  • AddSortField将保留现有的排序选项。

进行这些更改,您的代码可能看起来像这样:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim lObj As ListObject: Set lObj = Me.ListObjects("active")
    Dim SortOrder As Long

    If Not Intersect(Target, lObj.HeaderRowRange) Is Nothing Then
        Select Case Target.Value
            Case "Price", "Profit"
                SortOrder = xlDescending
            Case Else
                SortOrder = xlAscending
        End Select

        With lObj.Sort
            .SortFields.Add Key:=Target, SortOn:=xlSortOnValues, Order:=SortOrder
            .Apply
        End With
    End If

End Sub

答案 1 :(得分:0)

遵循这些思路可能会有所帮助。排序详细信息位于worksheet对象中,因此我使用了range.worksheet关系,但是您可以轻松地将其声明为工作表,而不是使用这种方式

Dim r As Excel.Range
Dim s As Sort
Dim sf As SortField

Set r = Range("a1:c7")
Set s = r.Worksheet.Sort
Set sf = s.SortFields.Add(Range("b1"), XlSortOn.xlSortOnValues, XlSortOrder.xlAscending)

不过,我不太确定如何删除特定种类,可能必须循环它们并获取密钥,因为s.SortFields.Item(x).Delete使用x的索引号