- 締切済み
【エクセルVBAマクロ】データ集計処理について
お世話になります。 以下のような形式のデータファイルがあります。 勤怠を集計するデータファイルです。 (出勤=1、欠勤=2) 左から:支店、名前、1日、2日、3日 北海道 山田 1 1 2 田中 2 2 2 東京 山本 1 1 1 西村 1 2 2 大阪 ・・・ ・・・ という感じで、これを集計し支店毎に日にちごとに出勤何名、欠勤何名、合計何名 というデータを作りたいのですが、マクロの組み方を教えていただけますでしょうか? 現在はこれを手作業でおこなっており、時間がかかる、入力ミスが出るといった問題がおこっております。 何卒、宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
やはり関数でやる案ですが、データが沢山ある場合の速度は不明です。 Sheet1に元データがあるとして、最初に次のマクロでA列を全て支店名で埋めます。(結果が煩雑と思われるなら、条件付書式で、各項目の1行目以外を白文字にする設定でもお試し下さい) Sub test() Dim lastRow As Long Dim i As Long Dim temp As Variant lastRow = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row For i = 1 To lastRow If Range("A" & i).Value = "" Then Range("A" & i).Value = temp Else temp = Range("A" & i).Value End If Next i End Sub Sheet2に下記の表を作成し、C2の式を =SUMPRODUCT((Sheet1!$A$2:$A$100=$A2)*(Sheet1!C$2:C$100=IF($B2="出勤",1,2))) とし、右方、下方に複写します。(100のところは実際の支店数に合わせて適宜いじって下さい) |A|B|C|D|E 1|支店|出・欠|1日|2日|3日 2|北海道|出勤|1|1|0 3|北海道|欠勤|1|1|2 4|東京|出勤|2|1|1 5|東京|欠勤|0|1|1 ご参考まで。
- van111
- ベストアンサー率14% (1/7)
質問はマクロですが関数ではだめでしょうか? 支店 名前 1日 2日 3日 a A 1 1 2 b B 2 2 2 c C 1 1 1 d D 1 2 2 e E 2 1 1 f F 2 1 2 合計人数 =COUNTA(C2:E2) 出勤人数 =COUNTIF(C1:E1,1) 欠勤人数 =COUNTIF(C1:E1,2) これをマクロにしてもよろしいかと思いますが 関数でもいいかと思ったので。。
お礼
返信が遅くなり申し訳ございません。 ご回答いただきありがとうございます。 関数は使用しているんですが、やはりデータ量が多いもので入力作業に大幅な時間がかかってしまいます。 ですので、何かいい方法があればなぁと思ったんですが。。
- imogasi
- ベストアンサー率27% (4737/17070)
これもやりたいというだけの丸投げだな。他人に頼りすぎ。 ここのコーナーが、プログラムの下請け的になってはかなわない。 これはプログラム処理ロジックと言う、経験をつんで身につく、プログラム言語・文法の学習を超えたスキルなのだ。 昔(コボル時代前後)はこのパターンで鍛えられたものだが。 ただしあるプログラム言語やデータベース処理言語では、できるメソッドなどが便利なものがあったりすると、それを使うと考えやすく、コードは短くはなるが。 人によって経験などから思いつき、使うロジックがバラツキがありそうな点だ。 ーー ご指摘のある、ピボットテーブルや、(北海道の下の、同一と言う意味の空白セルが気になるが。) もし探して、見つかればエクセルのフリーソフトのようなのを使うのが正当だ。 ーー ロジックの1例 (1)1-31日の31要素の配列を用意。また日別に勤務形態数だけ用意。0に初期化。データと関係のないセルの別セル範囲のセルを2次元配列代わりに使う手もある。 (2)第1レコードを読む。 (3)北海道を県名(変数)に記憶 (4)1-31日の日付の数字を勤務形態ごとの配列に振り分けて各日ごとに足しこむ。列方向の処理。 (5)第2レコードを読む。Å列が空白で無い場合。 県名+1-31の計数を、勤務形態別に書き出す(多分別シートに) 配列の値を0にする(ご破算) 県名変数の値を東京に変える。(3)と同じ作業) (6)(4)と同じ作業当行について行う。 (7)Å列が空白の場合。 (4)の作業だけ行う。(勤務形態分類別に足しこみだけ) (8)次の行の処理に移る。 処理する行のポインターはFor i=2 toのiで済ます。 別シートに書き出す行ポインタには、別にkなどを設け、書き出した都度+1して置く。
お礼
丸投げ。。申し訳ございません。 確かに頼りすぎですよね。 にもかかわらず、ご丁寧にご説明いただきありがとうございます。 まずやってみます。 できたらまたコメントいたします。
- winarrow07
- ベストアンサー率41% (143/346)
ピボットでできそうな、、気がします。あくまでそういう気がするだけですが。
お礼
返信が遅れまして申し訳ございません。 アドバイスいただきありがとうございます。 ピボットですか。 ちょっとしらべてやってみます。 ありがとうございます。
お礼
返信が遅くなり申し訳ございません。 ご回答いただきありがとうございます。 皆様からいただいたアドバイスをもとに、作業してみます。 完成したらまたコメントさせていただきます。 ありがとうございました。