- ベストアンサー
EXCEL VBAでデータ集計を実現する方法
- EXCEL VBAを使用して、[データ]シートにある社員情報を集計して[集計]シートに表示する方法をご教授ください。
- [データ]シートには4人分の社員情報があります。
- [集計]シートのフォームは一人につき3行使用し、次の人からも3行ずつ追加していく形式でデータを表示したいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず社員情報一人分の集計シートのひな形(画像の集計シートのA1からE1の所)を作ってから以下のコードを試してみてください。例示したコードはひな形がデータシートのA1からE3にあるものとしています。社員情報が可変という事なので後ろに継ぎ足していくのではなく実行ごとに集計シートをクリア(AからE列まで削除)し、その後データシートのG列2行目からのデータを毎回転記しています。実行速度は遅いです。 Sub Example() Dim DS As Worksheet, SS As Worksheet Dim i As Integer, j As Long Application.ScreenUpdating = False Set DS = Worksheets("データ シート") Set SS = Worksheets("集計シート") SS.Columns("A:E").Delete Shift:=xlToLeft j = 1 For i = 2 To DS.Cells(Rows.Count, "G").End(xlUp).Row With DS .Range("A1:E3").Copy SS.Cells(j, "A") SS.Cells(j, "A") = .Cells(i, "G") Union(.Cells(i, "H"), .Cells(i, "J"), .Cells(i, "L")).Copy SS.Cells(j, "C").PasteSpecial Paste:=xlPasteValues, Transpose:=True Union(.Cells(i, "I"), .Cells(i, "K"), .Cells(i, "M")).Copy SS.Cells(j, "E").PasteSpecial Paste:=xlPasteValues, Transpose:=True End With j = j + 3 Next Application.CutCopyMode = False Application.ScreenUpdating = True Set DS = Nothing Set SS = Nothing MsgBox "終了", vbInformation End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
アウトプットシート側の、出力のための行ポインター変数を j とでも作って、1人分の3行の中で次行にデータを出したいなら j=j+1 してから、 「アウトプットシートのセル番地(Value)=元シートのデータののセル番地(valyue)」 のVBAコードを、セル(=項目)ごとに連ねたら仕舞でしょう。 元シートのデータの行が変割っても、j はそのまま使い続ける(初期化しない)。 質問するほどのことでもない内容のように思う。 ちなみにエクセル関数でも(多少複雑になろうが、どこを参照するかの計算問題であって)できそうな内容でしょう。 コードまで書いてもらうのは質問者の勉強にならない。
お礼
imogasiさん、早速のご連絡ありがとうございます! 仰る通りでございます。 わざわざVBAで実施する必要もないかもしれませんし、そもそもロジックを自分で考えなければいつまでたっても身に付かない・・。 本当にその通りです。 ただ断われないオーダーがありまして、どうしてもこのような形でしか出来ないのです。 この度は色々とご指導、ご指摘ありがとうございました。
- skp026
- ベストアンサー率45% (1010/2238)
ご存じでしたらごめんなさい。 集計した結果を出すだけでしたら、 wordの差し込み印刷の機能が、 簡単で確実にできます。 印刷時にWindows付属のXPS Document Writerを使うと、 ファイルに落とせます。 どうしてもVBAでなければいけない、 ということでしたら、 以下のサイトが参考になります。 http://excel.style-mods.net
お礼
skp026さん、早速のご連絡ありがとうございます! wordの差し込み印刷の機能でできるのですね! 知りませんでした。とても勉強になります!m(_ _)m。 しかし今回はどうしてもVBAでの実装が前提でした。。 VBA参考サイトもご紹介いただきましてありがとうございました! この度は本当に色々と教えていただきましてありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1です。 列の削除がまずい場合 SS.Columns("A:E").Delete Shift:=xlToLeft ↓ SS.Columns("A:E").Clear にしてデータだけ削除にください。
お礼
kkkkkmさん、ありがとうございました。
お礼
kkkkkmさん、早速のご連絡ありがとうございます! ご教授いただきましたロジックで実現できました! 本当に助かりました!m( _ _ )m あんなに短いロジックで実現できてしまうのですね。感動しました。 この度は本当にありがとうございました!