vba使用范围对象排序和过滤

时间:2017-11-30 00:18:21

标签: vba sorting autofilter

我有数据需要对多列进行排序,然后按0/1进行过滤,我只想使用任何工作表并找到我已完成的列地址:

Dim ColName1 As Variant
Set ColName1 = sht.Cells.Find("name of column").Address

我可以将它用于sort命令的一部分,但是我试图设置另一个Varient或String = Left(sht.Cells.Find("列名")。 ,2)从$ K $ 1中删除$ 1但是当输入到sort命令时,它并不喜欢它。我是否需要使用其他类型来定义ColName1?或者将第二项定义为int / something?

ActiveWorkbook.Worksheets("test").sort.SortFields.Add Key:=Range(ColName1.Address & ":K" & LastRow) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal          'categ / material
With ActiveWorkbook.Worksheets("test").sort
        .SetRange Range(UsedRange)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

我有多列要排序,所以我想把它变成动态并最终把它扔进一个接口,我只是在文件中读取并使用用户定义的变量/对象来定义要排序的列。

另外,我读了很多关于不引用当前的ActiveWorkbook.Worksheets,但是当我尝试定义像

这样的东西时
Set sht = ActiveSheet

它只适用于某些事情,但不适用于sht.sort?我错过了什么......

1 个答案:

答案 0 :(得分:0)

在VBA中排序过于痛苦。以下是我将如何做到这一点:

Sub TestSort()

Dim Sht As Worksheet
Dim SortCol  As Long
Dim LastRow As Long
Dim LastCol As Long

Set Sht = ActiveSheet
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
SortCol = Sht.Cells.Find("Name of Column").Column
Sht.Sort.SortFields.Clear
Sht.Sort.SortFields.Add Key:=Range(Cells(2, SortCol), Cells(LastRow, SortCol))
With Sht.Sort
    .SetRange Range(Cells(1, 1), Cells(LastRow, LastCol))
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub