アプリ版:「スタンプのみでお礼する」機能のリリースについて

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を出したいと思っています。

A 回答 (4件)

VBAである日付が第何週かを取得するには「DatePart("ww",<日付>)」を使います。


http://officetanaka.net/excel/vba/function/DateP …

あとは以前の質問の回答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
というふうにするとか。
#考え方を示しただけで動作を確認したコードではありません、あしからず。

先の回答を理解されていれば、他の部分も問題なく変更できるはずです。
もしもそれが無理なら、ピボットテーブルを活用することをお奨めします。
    • good
    • 0

第何週目の定義が質問にはっきりさせてないと思うが。


(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)の場合も上記私製関数は使わないが(判別パターンのコードは変わるが)、その後の足しこみは同じパターンでよい。
    • good
    • 0

No1です。



この前、同様な質問をしたかたですね。

また、複数ファイル??

なら忘れてください。
    • good
    • 0

こんにちは、ピボットテーブルを駆使すると


図のような集計が出来ますけど
VBAでないと、駄目ですか??
「Excel VBAで1週間毎にカテゴリー」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています