こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA 別シートへデータ集計

お世話になります。

EXCEL VBAを使って下記のことを実現したいです。

[やりたいこと]
[データ]シートに社員情報が4人分入っています。(本当は可変です)
[データ]シートに"集計"というボタンを作ってクリックするとVBAが動いて[集計]という
シートにデータを集計したいのです。この[集計]シートのフォームが少し変わっていて一人に
つき3行使用します。次の人はまた3行、また次の人は3行と繰り返していきたいのです。

上記やりたい事を画像にもしてみました。

上記動作を実現するVBAコードをどなたかご教授いただけませんでしょうか?
何卒よろしくお願い致します。

環境 EXCEL 2017 Win7

投稿日時 - 2016-06-22 23:32:50

QNo.9191453

すぐに回答ほしいです

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

まず社員情報一人分の集計シートのひな形(画像の集計シートの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

投稿日時 - 2016-06-23 03:01:39

お礼

kkkkkmさん、早速のご連絡ありがとうございます!

ご教授いただきましたロジックで実現できました!
本当に助かりました!m( _ _ )m
あんなに短いロジックで実現できてしまうのですね。感動しました。

この度は本当にありがとうございました!

投稿日時 - 2016-06-23 22:31:37

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

アウトプットシート側の、出力のための行ポインター変数を j とでも作って、1人分の3行の中で次行にデータを出したいなら j=j+1  してから、
「アウトプットシートのセル番地(Value)=元シートのデータののセル番地(valyue)」
のVBAコードを、セル(=項目)ごとに連ねたら仕舞でしょう。
元シートのデータの行が変割っても、j はそのまま使い続ける(初期化しない)。
質問するほどのことでもない内容のように思う。
ちなみにエクセル関数でも(多少複雑になろうが、どこを参照するかの計算問題であって)できそうな内容でしょう。
コードまで書いてもらうのは質問者の勉強にならない。

投稿日時 - 2016-06-23 09:54:28

お礼

imogasiさん、早速のご連絡ありがとうございます!

仰る通りでございます。
わざわざVBAで実施する必要もないかもしれませんし、そもそもロジックを自分で考えなければいつまでたっても身に付かない・・。
本当にその通りです。

ただ断われないオーダーがありまして、どうしてもこのような形でしか出来ないのです。
この度は色々とご指導、ご指摘ありがとうございました。

投稿日時 - 2016-06-23 22:36:22

ANo.3

ご存じでしたらごめんなさい。

集計した結果を出すだけでしたら、
wordの差し込み印刷の機能が、
簡単で確実にできます。
印刷時にWindows付属のXPS Document Writerを使うと、
ファイルに落とせます。

どうしてもVBAでなければいけない、
ということでしたら、
以下のサイトが参考になります。
http://excel.style-mods.net

投稿日時 - 2016-06-23 04:10:10

お礼

skp026さん、早速のご連絡ありがとうございます!

wordの差し込み印刷の機能でできるのですね!
知りませんでした。とても勉強になります!m(_ _)m。

しかし今回はどうしてもVBAでの実装が前提でした。。
VBA参考サイトもご紹介いただきましてありがとうございました!

この度は本当に色々と教えていただきましてありがとうございました。

投稿日時 - 2016-06-23 22:39:04

ANo.2

No1です。

列の削除がまずい場合
SS.Columns("A:E").Delete Shift:=xlToLeft

SS.Columns("A:E").Clear
にしてデータだけ削除にください。

投稿日時 - 2016-06-23 03:12:58

お礼

kkkkkmさん、ありがとうございました。

投稿日時 - 2016-06-23 22:39:27

あなたにオススメの質問