2016-08-04 68 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

相關問題