2012-10-23 37 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

相关问题