質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1392閲覧

VBAで列が特定の値ならば複数行を1行にまとめたいです

skjdujr9djhf

総合スコア28

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/03/05 06:29

前提・実現したいこと

VBAで特定の列が特定の値ならば複数行を1行にまとめたいです
図も添付します。
イメージ説明

●現在の状態ですが、
図のD列「メニュー名」の値testが4行存在しています。

それをメニュー名「test」として1行にまとめたいです。
なおかつ、「金額1」、「金額2」も足し合わせて表示したいと思っています。
testのレコードはソートで並び変えていて一番下にくるようになっています。

現在はj番目に「小計行」の空行を挿入して、小計を算出
j+1番目に「testの小計」空行を挿入して、
testの小計を算出(SUMIF関数で計算) をしています。

testが1行として合算できれば、testの小計行は出さないようにして
実現できると思います。

色々調べましたが、サンプル的なものが見つけられませんでした。
何かサンプル的なコードを教えて頂けないでしょうか。

該当のソースコード

VBA

1現在はなし

試したこと

現在方法を模索中

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ちょっと、質問の意図とは違うかもしれませんが、ピボットテーブルを使うと簡単に意図されている結果に近い形を表示することができます。

まず、以下のように現在の状態の表をシートの1行目A列から始まるようにして、途中に空列が表示されてないようにします。ラベル名が無いであれば、”タイプ1"と書いたように何かラベル名を指定します。
イメージ説明
次にピボットテーブルを作成し次のように定義します。
イメージ説明
これによって、名前列毎に金額1と金額2で集計することができます。

ご質問では、メニュー名などをそのまま出したいというご希望があるようですが、ピボットテーブルはあくまでの集計用なのでには添えないとは思いますが、とりあえず合計を出すのであれば、この方法もノンプログラミングで可能です。
どうしてもメニュー名なども出したいというのであれば、結果表をVBAなどでコピーしてから、メニュー列やA/B/Cなどと書かれた列を表示することは可能かと思います。

投稿2018/03/11 08:49

diracpaul

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skjdujr9djhf

2018/03/12 04:05

回答ありがとうございます。 ピボットテーブルでもそのようなことが可能なんですね。
guest

0

ベストアンサー

メニュー名でソートされているという前提ならば。

同じメニュー名の間、金額1と金額2を加算し続け、かつ重複した行は削除してしまえば
よいです。ただし行の削除で行数が変わってしまうので、処理は下から行なう必要あり。

dim cx1 as long: cx1=xxx '「金額1」のカラムインデックス dim cx2 as long: cx2=xxx '「金額2」のカラムインデックス dim mcx as long: mcx=xxx '「メニュー名」のカラムインデックス dim prvx as long: prvx=i ' 初期値はj-1とメニュー名が同じでない行(同じでなければどこでもよい)の行インデックス dim rx as long ' ループ変数 ' ' 【注意】以下の処理の前に、メニュー名をキーとしたSortが必要 ' for rx=j-1 to i step -1 ' 下から上へ。jとiは設定済とする。 '※ if (cells(rx,mcx) <> "test") then goto SKIP01 ' ※test行のみ処理させたいのならコメントを外す if (cells(rx,mcx) = cells(prvx,mcx)) then ' prvとrxのメニュー名が同じなら cells(prvx,cx1)=cells(prvx,cx1)+cells(rx,cx1) ' prvにrxの金額1を積算 cells(prvx,cx2)=cells(prvx,cx2)+cells(rx,cx2) ' prvにrxの金額2を積算 rows(rx).delete ' rxは同じメニュー名だから削除 end if SKIP01: prvx=rx ' 次の処理のためにprvxの値を記録 next rx

投稿2018/03/12 03:41

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skjdujr9djhf

2018/03/12 04:04

回答ありがとうございます。 参考にします。 調べてみましたが、削除処理は下から行うことの方が一般的のようですね。
guest

0

数式でも Coutif+Sumif等 で集計できますが、
VBAでしたいなら、Dictionary が使いやすいです。

集計方法の簡単な例を載せておきます。
Dim Dic As Scripting.Dictionary
Dic.Item([商品名]) = Dic.Item([商品名]) + [金額]

投稿2018/03/05 06:36

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skjdujr9djhf

2018/03/05 08:01

Dic.Item([商品名])、[金額]にはそれぞれどのような値が入るのでしょうか。 集計するとありますが、この処理で既存のtestの4行は消えませんよね?
ExcelVBAer

2018/03/05 08:39

自分で考えてください。
ExcelVBAer

2018/03/05 08:41

ヒント:Dic.Exists([商品名])
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問