• ベストアンサー

Excel VBAで1週間毎にカテゴリーでまとめる方法

Excelで以下のような集計データがあります。1週間毎にカテゴリーでまとめたいのですが、マクロで集計できないでしょうか? aa bb cc dd 9/27 0 2 0 4 9/28 4 52 41 1 9/29 6 0 1 13 9/30 2 0 1 0 10/1 1 0 1 0 10/2 0 0 3 0 10/3 0 5 1 0 10/4 2 1 0 0 10/5 3 61 1 11 10/6 0 1 31 3 10/7 6 0 1 0 10/8 0 2 1 5 10/9 8 3 31 4 10/10 0 1 1 0 10/11 3 1 1 0 10/12 5 0 5 4 <集計結果1> ※単純に週ごとに集計した結果 aa bb cc dd 1週目 13 59 48 18 2週目 19 69 66 23 3週目 8 1 6 4 <集計結果2> ※1週目からの延べ合計 aa bb cc dd 1週目 13 59 48 18 2週目 32 128 114 41 3週目 40 129 120 45 できれば、1回で集計結果2(1週目からの延べ合計)を出したいと思っていますが、集計結果1を関数で合計し、集計結果2を出したいと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

VBAである日付が第何週かを取得するには「DatePart("ww",<日付>)」を使います。 http://officetanaka.net/excel/vba/function/DatePart.htm あとは以前の質問の回答4の方のコードを参考にすれば、いいのでは? http://questionbox.jp.msn.com/qa5308829.html たとえば >ReDim sumAry(30000 To 50000, 0 To 2) を ReDim sumAry(1 To 54, 0 To 4) と変更して、sumAry(1,1)には第1週のbb列の合計、sumAry(1,2)には、第1週のcc列の合計・・・を格納できるようにしておき、 >For i = 1 To UBound(orgAry, 1) >  If sumAry(orgAry(i, 2), 0) = 0 Then >   sumAry(orgAry(i, 2), 0) = 1 >   dayCnt = dayCnt + 1 >  End If >  Select Case orgAry(i, 1) >   Case "OK": sumAry(orgAry(i, 2), 1) = sumAry(orgAry(i, 2), 1) + 1 >   Case "NG": sumAry(orgAry(i, 2), 2) = sumAry(orgAry(i, 2), 2) + 1 >  End Select > Next i を Dim weekCnt As Integer, wkNo as Integer, k As Integer For i = 2 To UBound(orgAry, 1) wkNo = DatePart("ww,"orgAry(i, 1))   If sumAry(wkNo, 0) = 0 Then    sumAry(wkNo, 0) = 1    weekCnt = weekCnt + 1   End If   For k = 1 To 4     sumAry(wkNo, k) = orgAry(i, k+1)   Next k  Next i というふうにするとか。 #考え方を示しただけで動作を確認したコードではありません、あしからず。 先の回答を理解されていれば、他の部分も問題なく変更できるはずです。 もしもそれが無理なら、ピボットテーブルを活用することをお奨めします。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

第何週目の定義が質問にはっきりさせてないと思うが。 (1)年初来の第何週 (2)月初来の第何週 (3)データの最初から7日単位で ーー (1)で考えると、関数では使えるWEEKNUM関数(ただし2003まではアドイン関数)がVBAでは使えないようなので '--下記関数テスト用(A列に連続日付を入れてテスト確認用) Sub test01() For i = 2 To 365 Cells(i, "g") = weeknums(Cells(i, "A")) Next i End Sub ’---実際の関数 Function weeknums(b As Date) d1 = Weekday(DateSerial(Year(b), 1, 1)) d2 = DateSerial(Year(b), 1, 1) d3 = b wn = Int((d3 - d2 - (8 - d1)) / 7) + 2 weeknums = wn End Function を使う。 ------ A列は日付順に並び、日付シリアル値の形式でデータが入っているとする。 直前行の修番号、計数項目だけ中間合計算出用の変数を(質問例では4つ)用意する。 ーー データ最初行から最終行まで以下を繰り返す 上記私製関数でA列の日付の週番号を算出し、直前行の週番号と(IF文で)変わったか判別する。 変われば中間合計4つの変数の値を、データとは別範囲の行に代入(転記)する。 転記する行ポインターを(次週に備えて)+1する。 そして4変数をクリア(ご破算) そして今の行の4データを中間合計算出用の変数に加える。 また「直前行の週番号を記録する変数」を、現在行の数に置き変える。 ー 変わらない場合は、その行の4列のデータを、それぞれの中間合計算出用の変数に加える。 次の行を指して、以上を最終行まで繰り返す。 ーー 最封行のあと、中間合計4つの変数の値を、データとは別範囲の行に代入(転記)する。 ーーー (2)(3)の場合も上記私製関数は使わないが(判別パターンのコードは変わるが)、その後の足しこみは同じパターンでよい。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

No1です。 この前、同様な質問をしたかたですね。 また、複数ファイル?? なら忘れてください。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

こんにちは、ピボットテーブルを駆使すると 図のような集計が出来ますけど VBAでないと、駄目ですか??

関連するQ&A