0

好吧,场景如下:我目前正在使用三列。A 列是我的唯一 ID,B 列是我的年份,C 列是我的价值。我正在使用 excel,并且有大约 350,000 行可以使用,所以问题/目标:

我正在尝试找到正确的代码来筛选这些年,并按十年为我提供 VALUE 列 C 的 AVERAGE、MAX 和 MIN 值。

同样,我有数十万行代码要处理,我想按从 1940 年代到 2010 年代的十年排序;每十年它会给我平均、最大值和最小值。

我只是一个业余程序员,所以我知道如何通过在漫长而乏味的时间段内创建多种排序来逐个十年地过滤它。但是,我想知道是否有人知道可以一举完成所有工作的代码,从而节省了程序必须多次筛选我的 350,000 行代码的过程。

我将非常感谢谁能教我这一点,祝你好运,谢谢!

编辑:: (如何显示平均值、最大值和最小值))::

“啊,我很抱歉没有澄清这一点。我只是假设我会在他们‘神奇地’出现后处理这个问题,哈哈。无论如何,我将在一个新的简单表格中显示我整理的十年信息工作表,其中 AVERAGE、MAX、MIN 将是三行标题,而十年将是表的列标题。"

4

2 回答 2

2

我同意 Scott 的观点,在大多数情况下,公式是比 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
于 2012-10-23T21:30:49.977 回答
0

非VBA解决方案:

见下图。我冒昧地以简洁的格式设置数据以显示我的概念,但您可以轻松调整。相应地更改数据范围以及 Max / Min 公式。

请务必按Ctrl + Shift + Enter,因为这些公式是数组公式。

非 VBA 解决方案

于 2012-10-23T17:55:34.247 回答