创建一个没有重复的新列,计算一个数字的频率,并对列进行排序

时间:2016-08-04 19:32:45

标签: excel vba macros

我想创建一个Excel宏,它将执行以下操作: 在A列中取一个任意长度的数字列表 将唯一值复制到D列 使用COUNTIF公式填充E列,该公式将显示每个唯一编号出现的次数(因此它将具有D中的唯一编号,以及它在E中出现的次数) 根据列E'将列D和E的值从最高到最低排序 s值

我知道如何使用Excel GUI执行这些步骤,但我想编写一个VBA宏来完成这些步骤。到目前为止,对我来说最困难的部分是将COUNTIF公式地址设置为任意长度范围。关于如何实现这一目标的任何想法?

编辑: 这是我最新录制的代码:

 Range("A1:A1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "D1:D2000"), Unique:=True
    Range("E2").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R2C1:R1000C1,RC[-1])"
    Selection.AutoFill Destination:=Range("E2:E1000"), Type:=xlFillDefault
    Columns("D:E").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("E2:E1000") _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("D1:E1000")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

我手动将范围设置为最大值1000,但我实际上想要使用数据的最后一个单元格。我想我可以做一些像Range(“A1”,Range(“A1”)。End(xlDown))的复制和粘贴部分,但COUNTIF不会接受这种表示法吗?

1 个答案:

答案 0 :(得分:0)

COUNTIF可能不允许使用VBA表达式,但我们可以先评估表达式,然后使用它代替" 1000"它发生在哪里!所以:

Dim maxRow As Long
maxRow = Range("A1").End(xlDown).Row

Range("A1:A" & maxRow).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
    "D1:D" & maxRow), Unique:=True
Range("E2:E" & maxRow).FormulaR1C1 = "=COUNTIF(R2C1:R" & maxRow & "C1,RC[-1])"

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("E2:E" & maxRow) _
    , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("D1:E" & maxRow)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

基本上只需用maxRow替换1000就会发生。另外,我清理了Select的用法(因为它很慢且容易出现运行时错误)。

不确定为什么在原始代码中使用D2000而不是D1000,所以我更改了它。如果这是故意的,你想要实际复制到输入大小的两倍(为什么?),你可以使用"D1:D" & (2 * maxRow)代替。