我想创建一个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不会接受这种表示法吗?
答案 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)
代替。