2012-10-23 33 views
0

好吧,這樣的情景:我有三個目前正在使用的列。列A是我的唯一ID,列B是我的年,列C將是我的VALUES。我在Excel中工作,並有大約350,000行,以解決問題/目標:EXCEL VBA:按年分類並按十年找到簡單的平均值,最大值和最小值

我試圖找到正確的代碼,篩選多年來給我的平均值,最大值和最小值VALUE列C的值,十年。

同樣,我有數十萬行代碼可供使用,我想從20世紀40年代到2010年的十年間進行排序;每十年它會給我AVERAGE,MAX和MIN值。

我只是一個業餘程序員,所以我知道如何通過一個接一個地過濾十年,通過在漫長而乏味的時期創建多種排序。但是,我想知道是否有人知道可以一舉完成它的代碼,從而節省了不止一次篩選了35萬行代碼的過程。

我會非常感激誰能教我這一點,祝你好運,你有我的感謝!

編輯::(HOW平均值,MAX和敏思會顯示))::

「啊,我不澄清道歉。我只是假定後,他們奇蹟般地「我會採取照顧'出現我想,哈哈,不管怎麼說,我會在一張新的工作表中列出十年的信息,在一張新的工作表中,AVERAGE,MAX,MIN將成爲三行標題,十年將成爲桌子。」

+0

結果應該是哪裏?新的工作表?同一張工作表?你如何計劃展示數十年? – LittleBobbyTables

+1

您可以在沒有VBA的情況下執行此操作嗎?你想只有公式解決方案嗎?如果是這樣,告訴我你正在運行的XL版本。 –

+0

使用帶有「按年分組」的SQL語句以及平均值,最大值和最小值來完成此操作將會很有幫助。您可以將Excel工作表導入到Access表中並執行此操作。我看到另一個類似的問題,如果您熟悉Access和SQL,可能會給您一些建議:http:// stackoverflow。com/questions/9226201/excel-vba-group-by-like-selection – kermit

回答

2

我與斯科特認爲,在大多數情況下,公式是比VBA更好的選擇。但是,您詢問了一些具體的事情,包括對數據進行排序,並在單獨的選項卡上顯示結果,因此我假設在這種情況下,您可以使用宏附帶的額外開銷。

您遺漏了一些關於您的數據(數據類型,特定單元格位置等)的詳細信息...所以請在代碼中查看註釋,您可能需要自定義。

我嘗試儘可能逐字地考慮您的問題......例如,我可能更喜歡錶格中的結果,而不是跨越整個表格,但這不是我如何接近答案。

Sub SummarizeDecade() 

Const YearColumn As Integer = 2 'assumes the first year is in cell B2 
Const FirstDataRow As Integer = 2 'assumes the first year is in cell B2 

Dim wb As Excel.Workbook, ws As Excel.Worksheet, wsNew As Excel.Worksheet 
Dim rowStart As Long, rowEnd As Long, colPaste As Long 
Dim decade As Integer 
Dim avg As Double, mini As Double, maxi As Double 'you didn't specify data type, Double is most accommodating 

    Set wb = ThisWorkbook 
    Set ws = wb.ActiveSheet 'assumes you run the macro while the data sheet is the current sheet; would prefer to use a sheet name 

    'setup new worksheet for summary results, as requested 
    wb.Worksheets.Add 
    Set wsNew = wb.Worksheets(1) 
    wsNew.Name = "Results" 
    wsNew.Cells(1, 1).Value = "Decade" 
    wsNew.Cells(2, 1).Value = "Average" 
    wsNew.Cells(3, 1).Value = "Minimum" 
    wsNew.Cells(4, 1).Value = "Maximum" 
    colPaste = 2 

    ws.Activate 
    ws.Cells(FirstDataRow, YearColumn).Sort ws.Cells(FirstDataRow, YearColumn), xlAscending, , , , , , xlYes 'sorts the data by year, as requested 

    rowStart = FirstDataRow 
    rowEnd = rowStart 

    Do Until Len(ws.Cells(rowEnd, 3).Value) = 0 'be sure your data does not include strings with spaces, zeroes, etc. Must be blank/null/empty. 
     decade = Int(ws.Cells(rowStart, YearColumn)/10) * 10 

     Do Until Int(ws.Cells(rowEnd, YearColumn)/10) * 10 <> decade 
     rowEnd = rowEnd + 1 
     Loop 

     'calculate the average, max, and min 
     avg = Application.WorksheetFunction.Average(ws.Range(ws.Cells(rowStart, 3), ws.Cells(rowEnd - 1, 3))) 
     mini = Application.WorksheetFunction.min(ws.Range(ws.Cells(rowStart, 3), ws.Cells(rowEnd - 1, 3))) 
     maxi = Application.WorksheetFunction.max(ws.Range(ws.Cells(rowStart, 3), ws.Cells(rowEnd - 1, 3))) 

     'write the summaries on the new worksheet tab 
     wsNew.Cells(1, colPaste).Value = decade 
     wsNew.Cells(2, colPaste).Value = avg 
     wsNew.Cells(3, colPaste).Value = mini 
     wsNew.Cells(4, colPaste).Value = maxi 

     colPaste = colPaste + 1 
     rowStart = rowEnd 
    Loop 


End Sub 
+1

乾杯!你確實碰到了那裏的ExactaBox。是的,我確實留下了一些信息,但是您構建了我可以添加和定製的框架,您真誠地感謝您,祝您工作順利! – WATERflowTech

+0

很高興我可以幫助...我是新來的,「接受」會很棒。謝謝。 – ExactaBox

0

非VBA解決方案:

請參見下圖。我冒昧地以一種整齊的格式設置數據來顯示我的概念,但您可以輕鬆調整。相應地更改數據範圍以及Max/Min公式。

請務必按Ctrl + Shift + Enter,因爲這些公式是數組公式。

Non-VBA Solution

+0

這是我可以適應我自己的目的,但不是我一直在尋找的東西,雖然我很欣賞這個幫助! ExactaBox似乎對這個問題頭痛不已。 – WATERflowTech

相關問題