プロが教える店舗&オフィスのセキュリティ対策術

いつも参考にさせていただいております。
仕事で行き詰ってしまい、質問しました。
アドバイスをいただきたくお願いいたします。
エクセルのマクロをVBで作成したいのですが、
以下のような操作を行いたいと考えております。

Aシートが存在します。
■Aシート
ID 名前 光熱費
001 上田 100
001 上田 300
002 丸本 300
002 丸本 0
002 丸本 200
003 土井 100

これをBシートに重複しているデータをまとめて、
件数と金額の合計をもっていくような操作を考えています。

■Bシート
ID 名前 件数 光熱費
001 上田 2 400
002 丸本 3 500
003 土井 2 0

また、さらにC・D・EシートにはBシートの詳細を記載します。
■Cシート
ID 名前  光熱費
001 上田   100
001 上田   300
■Dシート
ID 名前  光熱費
002 丸本 300
002 丸本 0
002 丸本 200
(Eシートの同様に記載します)

VBA初心者のためなかなか思うようにいかず、質問させていただきました。よろしくおねがいいたします。

A 回答 (3件)

こんなのではどうでしょうか?


Sub sample()
'シートA以外の削除
Dim ws As Worksheet
Application.DisplayAlerts = False
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "A" Then ws.Delete
Next
Application.DisplayAlerts = True
'シートBの作成
Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "B"
Sheets("A").Columns("A:B").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("B").Range("A1"), Unique:=True
With Sheets("B").Range("C2:C" & Sheets("B").Range("A" & Rows.Count).End(xlUp).Row)
.Formula = "=SUMIF(A!B:B,B2,A!C:C)"
.Copy
.PasteSpecial Paste:=xlPasteValues
End With
'明細シート作成
Dim r As Integer
'シートBのID毎をフィルタして明細シート作成
For r = 2 To Sheets("B").Range("A" & Rows.Count).End(xlUp).Row
'シートAをシートBのIDでの値で絞込み
Sheets("A").Cells.AutoFilter Field:=1, Criteria1:=Sheets("B").Range("A" & r).Value
'明細シート作成
Worksheets.Add(after:=Sheets(Sheets.Count)).Name = Chr(Asc("A") + r)
Sheets("A").Cells.SpecialCells(xlCellTypeVisible).Copy Destination:=ActiveSheet.Range("A1")
Next
'最後にAutoFilterを解除する
Sheets("A").Cells.AutoFilter
End Sub
    • good
    • 1

こんにちは。



> VBA初心者のためなかなか思うようにいかず、…
思うようにいかないコードを提示されては如何でしょうか。

> 件数と金額の合計をもっていくような操作を考えています。
手作業ではできるのですよね。
集計やフィルタを使うとか、ピボットテーブルを使う、
とかで一般機能だけでできる内容と思います。

「VBA初心者」とおっしゃられるなら、まず、作業(エクセルでの操作)の手順書を書くことから始めることをお勧めします。
作業の手順書ができたら作業を記録してコードを取得し、取得したコードの編集で判らないところをご質問されては如何でしょうか。


一例でピボットテーブルを利用した方法を書いてみました。
(おおまかな作業ですが…)
本格的にマクロ化したいのであれば、シート名のチェックが必要だったり、繰り返し処理で簡便にしたりしますが、とりあえず、マクロの自動記録で作業を記録して取得したコードの編集に取り組んでみては如何でしょうか。
頑張ってください。


ワークシートを挿入して作業用シートを用意する
Aシートのデータを元に作業用シートのA1を軸にピボットテーブルを作成する
ピボットテーブルのオートフォーマットを無しにする
ピボットテーブルのオプションで総計を非表示に設定する
ステンシルレイアウトの行エリアに「ID、名前」を置く
「ID」の集計をなしにする
データエリアに「光熱費」を2回置く
一つの光熱費の集計方法を”データの個数”にして名前を「件数」にする

作業用シートをコピーし、Bシートとする
Bシートのピボットテーブルの集計結果全体をコピーする
形式を選択して貼り付けで数値化する

作業用シートに戻る
「件数」フィールドをレイアウトから削除する

光熱費の001の金額セルを選択してダブルクリックする
作成されたシートをCシートとする
作業用シートに戻る

光熱費の002の金額セルを選択してダブルクリックする
作成されたシートをDシートとする
作業用シートに戻る

光熱費の003の金額セルを選択してダブルクリックする
作成されたシートをEシートとする
作業用シートに戻る
    • good
    • 0

Excel(エクセル) VBA入門:Dictionaryオブジェクトを利用する


http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …

Excel(エクセル) VBA入門:オートフィルタ(AutoFilter)でのデータ抽出
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …

あたりが参考になるかと。
    • good
    • 1

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