我与斯科特认为,在大多数情况下,公式是比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
结果应该是哪里?新的工作表?同一张工作表?你如何计划展示数十年? – LittleBobbyTables
您可以在没有VBA的情况下执行此操作吗?你想只有公式解决方案吗?如果是这样,告诉我你正在运行的XL版本。 –
使用带有“按年分组”的SQL语句以及平均值,最大值和最小值来完成此操作将会很有帮助。您可以将Excel工作表导入到Access表中并执行此操作。我看到另一个类似的问题,如果您熟悉Access和SQL,可能会给您一些建议:http:// stackoverflow。com/questions/9226201/excel-vba-group-by-like-selection – kermit