2016-08-04 69 views
0

我想创建一个Excel宏,它将执行以下操作: 以A列中的任意长度的数字列表形式 将唯一值列D D 用COUNTIF公式填充列E,该公式将显示每个唯一编号的发生次数(因此它将具有D中的唯一编号以及E中发生的次数) 将列D的值和E从最高到最低,基于列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

第一步:如果您知道如何使用GUI进行操作,但不知道如何在代码中执行此操作,请录制宏! (http://www.excel-easy.com/vba/examples/macro-recorder.html)这会给你一个代码的起点。从那里,你可以编辑代码以完全按照你想要的方式行事。 – Mikegrann

回答

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)代替。

+0

谢谢,这正是我正在寻找的。我正在使用一个变量来存储最后一个单元格的数据,但后来我找不到在范围内使用它的语法。另外,D2000是一个错字,它应该和其他1000一样。 – user6679670

相关问题