• ベストアンサー

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/17068)
回答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

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

  • エクセルの集計計算について教えてください

    期間を指定するとデータを引っ張ってきます データは1000~2000件程存在します Aセル=名前 Bセル=略号 Cセル=日時 Dセル=場所 Eセル=不良合計 名前    略号       日時            場所    不良合計 A0001     AA   2014/06/01 00:04:28   1     7 A0010     BB   2014/06/01 00:18:10   2     3 A0011     DD   2014/06/01 00:29:35   4     8 A0001     EE   2014/06/01 00:24:55   2     9 A0005     CC   2014/06/01 00:29:35   3     4 A0010     BB   2014/06/01 00:27:09   2     6 A0020     AA   2014/06/01 00:32:13   1     4 A0001     AA   2014/06/01 00:33:26   3   3 A0020     EE   2014/06/01 00:37:31   5  17 A0016     FF   2014/06/01 00:47:22   6   7 A0030     BB   2014/06/01 00:54:35   2   3 A0015     AA   2014/06/01 01:01:11   1   2 A0001     DD   2014/06/01 01:03:01   4   8 A0020     EE   2014/06/01 01:06:21   5   11 A0011     BB   2014/06/01 01:08:19   2   4 A0005     DD   2014/06/01 01:17:20   4     13 A0011     BB   2014/06/01 01:22:41   2   8 A0016     AA   2014/06/01 01:23:47   1   2 A0010     CC   2014/06/01 01:25:08   3   11 .... 名前が同じ物でも、場所が異なると略号が変わってしまいます。 流れとしてはA001の物が場所1→2→3と進んで行きます。    名前   略号         日時         場所      不良合計 A0001   AA   2014/06/01 00:04:28   1   2 A0001   BB   2014/06/01 01:04:28   2   4 A0001   CC   2014/06/01 02:04:28   3   8 A0001   DD   2014/06/01 03:04:28   4   10 不良合計に関しては、前の物が加算されていく形になっています。 数千あるこのようなデータを今手計算で、場所毎の不良数を求めています。 例を挙げますと、上の4つのデータの場合 DDの不良合計とCCの不良合計を引いて、DDの不良合計は2 CCの不良合計とBBの不良合計を引いて、CCの不良合計は4 BBの不良合計とAAの不良合計を引いて、BBの不良合計は2 A0001   AA   2014/06/01 00:04:28   1   2 A0001   BB   2014/06/01 01:04:28   2   2 A0001   CC   2014/06/01 02:04:28   3   4 A0001   DD   2014/06/01 03:04:28   4   2 と言う形に手計算で置き換えてします。 ただ、数が膨大であり、名前に関しても同じ名前が1つではなく複数使われている事もあり計算が大変です。 何とか楽に計算する方法はないでしょうか? VBA?を使用してでもいいので、短時間で出来る集計方法があれば教えてください。

  • Excelのマクロを作ってもらえますか?

    こんにちは。 エクセルのマクロで、Sheet1に転々と 入力されているデータを すべてA1の列へ統一して並べ替え(2) 同じデータの数を計算してB2へ記述する(3)などという マクロができるなら作っていただけないでしょうか? もし、数の入った行のみ残して削除までできれば最良なの ですが(4) (2) AA-20 AA-20 AA-20 BB-30 CC-30 CC-30 CC-30 (3) AA-20   3 AA-20 AA-20 BB-30   1 CC-30   3 CC-30 CC-30 (4) AA-20   3 BB-30   1 CC-30   3 このようになのですが、 お時間のあるときで結構ですので宜しくお願いします。

  • エクセル リストアップ

    以下のような表があります。    1 2 3 4 5 aa 20 25 45 20 38 bb 16 98 45 78 20 cc 20 45 20 66 44 dd 44 20 13 20 89 この中から複数ある20(値)を検索し、 その位置を以下のようにリスト形式で 抽出できないでしょうか。 aa1 aa4 bb5 cc1 cc3 dd2 dd4 vlookup や match ではうまくいきません。 できれば関数でお願いします。

  • エクセルで複数列を二列にまとめる

    エクセルのデータ成形に、知恵を貸していただけますでしょうか・・・ エクセルで以下のようなデータがあります(例では8行8列) コードは本当はランダムです。 #と右下の部分は空白セルです。横には数字、コード、数字、コードの並びで、数字は一行目のみです。 1 aa-1 2 bb-1 3 cc-1 4 dd-1 # aa-2 # bb-2 # cc-2 # dd-2 # aa-3 # bb-3 # cc-3 # aa-4 # bb-4 # aa-5 # bb-5 # aa-6 # aa-7 # aa-8 これらを 1 aa-1 1 aa-2 1 aa-3 . . 2 bb-1 2 bb-2 . . 4 dd-2 というように 1. 複数の列を2列ずつのグループで2列にまとめ 2. それぞれのグループごとに各コードの左のセルにグループの数字をつけたい   (どのコード(aa-1など)がどの数字グループなのか分かるように) と思っています。 なにかいい方法はありますでしょうか。 調べてはみたのですが、 複数列を一列ではなく、二列ずつまとめていることや、 各列の長さが一様ではないことなどから 各所で紹介されている方法が適用できないでおります。 VBAもほとんど使ったことがないので、それらを応用できません。 どうぞ知恵を貸していただけたらと思います。 よろしくお願い致します。

  • excel データ抽出方法

    こんいちは 列1と列2を比べて条件が一致したデータを抽出したいのですが,方法がわかりません。どなたかご存知のかた教えていただけないでしょうか? 列1  列2 aa   vv bb   dd cc   ff dd   aa ee   bb この場合aa,bb が一致する。

  • エクセルのセル分けについて教えてください。

    エクセルで、1つのセルに  aa,"bb","cc,"dd","ee" というように入力されています。 それをaa bb cc のようにそれぞれのセルに分けたいのですが、方法が分かりません。 ご存知の方がいらっしゃいましたら、教えてください。宜しくお願いします。

  • Excelの関数(表の並べ替え?)

    Excelの関数について質問します。 name address flower 01 aa bb cc 02 dd ee ff 03 aa ff bb 04 cc kk aa というような表から、似たような     flower   address   name 01 03 04 02 という表に落とし込みたいのです。 要するに並び替えだと思うのですが。 LOOKUPかINDEXあたりが使えるのかな? と思ったのですが、よく分かりません。 また、並び替えとはいえ同じタイトルが使われているので、出来れば間違い防止のためにタイトルを利用できたらと思います。 何か有効な方法はありませんでしょうか? よろしくお願いします。

  • Excelの関数のことです。

    Excelの関数のことです。 Excelのシートに給与金額を入力しています。 その入力用シートには 施設名(A・B・C) 職種名(AA,BB,CC,DD) 勤務形態(a.b) 合計金額 アルファベットは種類数です。 を入力しており 別シートに施設ごとに給与合計をするシートがあります。 そこに 例)A施設の常勤で事務が○人いてその給与合計が○円 という関数が組みたいのです。 教えてください。 よろしくお願いします。

  • outlookで特定メールのExcel抽出比較

    お世話になります。 outlook2010を使用しているのですが、 メールの「件名」に以下のパターンがあるとします。 1-aa注文 2-bb注文 3-cc注文 4-dd注文 5-ab注文 6-bc注文 ※「注文」の文字表示のみ同じなのを除いて、他は同じパターンはありません。 そこで以下の処理を自動で行いたいと思っています。 ・受信した際に上記の件名の「注文」より左の、例えば「1-aa」の部分のみと、  受信日時をエクセルに抽出(注文の件名部分は固定で変わりません) ・そのエクセル上に出力されたデータを、あらかじめ比較用に用意していた全てのデータ一欄と比較 1-aa 1-aa  2-bb 2-bb 3-cc 3-cc  4-dd 4-dd 5-ab  6-bc 6-bc 5-abが無い場合にエラーを出力させたいのですが、 どのようにすればできるのでしょうか。 宜しくお願いします。

専門家に質問してみよう