0

シナリオはわかりました。現在作業している列が3つあります。列Aは私の一意のID、列Bは私の年、列Cは私の値になります。私はExcelで作業しており、約350,000行を処理できるので、問題/目標は次のとおりです。

私は、何年にもわたってふるいにかけ、10年ごとにVALUE列CのAVERAGE、MAX、およびMINの値を提供する適切なコードを見つけようとしています。

繰り返しになりますが、使用するコードは数十万行あり、1940年代から2010年代までの10年ごとに並べ替えたいと思います。ここで、10年ごとに、AVERAGE、MAX、およびMINの値が表示されます。

私はアマチュアプログラマーに過ぎないので、長くて退屈な期間にわたって複数の種類を作成することによって、10年ごとに1つずつフィルタリングする方法を知っています。ただし、すべてを一挙に完了することができるコードを誰かが知っているのではないかと思います。これにより、350,000行のコードを複数回ふるいにかけるプロセスをプログラムで節約できます。

このビットを教えてくれる人にはとても感謝しています。幸運を祈ります。ありがとうございます。

編集::(平均、MAX、およびMINSの表示方法))::

「ああ、それを明確にしないことをお詫びします。彼らが「魔法のように」現れた後、私はそれを世話するだろうと思っていました、ハハ。とにかく、私が整理した10年の情報を新しいものの簡単な表に表示しますワークシートでは、AVERAGE、MAX、MINが3つの行のタイトルになり、数十年がテーブルの列のタイトルになります。」

4

2 に答える 2

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
于 2012-10-23T21:30:49.977 に答える
0

非 VBA ソリューション:

下の図を参照してください。私のコンセプトを表示するためにデータを適切な形式で自由にセットアップしましたが、簡単に調整できます。それに応じてデータ範囲を変更し、最大/最小式も同様に変更します。

Ctrl + Shift + Enterこれらの数式は配列数式であるため、必ず押してください。

非 VBA ソリューション

于 2012-10-23T17:55:34.247 に答える