我正在尝试根据单击的列标题对表格中的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
您有什么想法,如何实现?
请不要问我为什么我以编写方式编写代码。我不知道。不幸的是,我不是编码人员,我大致了解了代码的工作原理,但是我没有更深入的知识。我只是通过搜索然后尝试如何工作(或更常见的是如何工作),将来自不同来源的代码组合在一起。
答案 0 :(得分:3)
Range
和Range("active[#Headers]")
中的Range("active").Sort
的使用更改为ListObject
-{{3}的内置属性和方法来改进代码}和ListObject.HeaderRowRange
。Select Case
也可能更整洁,而不是多个If
语句。Range(Target.Address)
是多余的-您只能使用Target
。Add
和SortField
将保留现有的排序选项。 进行这些更改,您的代码可能看起来像这样:
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的索引号