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

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

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

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

Q&A

2回答

848閲覧

Excel VBAで任意の種類同士を足し合わせたものを集計したいです

tatsu2

総合スコア3

VBA

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

0グッド

0クリップ

投稿2021/06/16 01:18

編集2021/06/16 01:26

前提・実現したいこと

完全なVBA初心者です。
自分で調べてできる範囲でチャレンジしてみましたが行き詰まり、ここで質問させていただきます。

Sheet1内のデータを、タイトル毎の集計だけではなく
購入国をJPかそれ以外かで分け、更に購入額+消費税額で集計したものと、購入額のみで集計したものを分けて算出したいです。

変数シートに記載したものをVBAで参照してその通りに足し合わせようとしましたがうまくいかず、
コードもめちゃくちゃなことになってしまいました。

どのようにすれば意図したデータの抽出ができるか教えていただきたいです。

データサンプル

【Sheet1】

イメージ説明

【変数】
イメージ説明

【理想の集計後データ】
イメージ説明

コード

Option Explicit Public Sub 集計() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim dictTransaction As Object '取引区分 Dim dictTitle As Object 'タイトル Dim dictAmount As Object '金額 Dim s1 As String 'JP変数 Dim s2 As String 'JP以外変数 Dim s3 As String '入金額変数 Dim s4 As String '売上金額変数 Dim key As Variant Dim maxrow1 As Long Dim row1 As Long Dim row2 As Long Dim keys As Variant Dim colTest As New Collection Set dictAmount = CreateObject("Scripting.Dictionary") ' 連想配列の定義 Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") Set sh3 = Worksheets("変数") maxrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row '元データ 最終行を求める s1 = sh3.Range("D2").Address s2 = sh3.Cells("D3").Select s3 = sh3.Range("A2:A5").Address s4 = sh3.Range("B2:B3").Address For row1 = 2 To maxrow1 'タイトル+取引区分+購入国をキーとする key = sh1.Cells(row1, "G").Value & "|" & s3 & "|" & s1 '最初のキーの場合、値を0で初期化する If dictAmount.Exists(key) = False Then dictAmount(key) = 0 'dictBara(key) = 0 End If dictAmount(key) = dictAmount(key) + sh1.Cells(row1, "D").Value '金額を加算 Next '集計結果へ出力する '2行目以降をクリアする sh2.Rows("2:" & Rows.Count).ClearContents 'Sheet2の2行目以降をクリア row2 = 2 For Each key In dictAmount keys = Split(key, "|") 'キーを日付と商品コードにばらす sh2.Cells(row2, "A").Value = keys(0) 'タイトル sh2.Cells(row2, "B").Value = keys(1) '取引区別 sh2.Cells(row2, "C").Value = dictAmount(key) '金額 sh2.Cells(row2, "D").Value = keys(2) '購入国 row2 = row2 + 1 Next MsgBox ("完了") End Sub

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

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

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

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

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

guest

回答2

0

Excel

1=SUM(SUMIFS(Sheet1!$D:$D,Sheet1!$B:$B,$B2,Sheet1!$C:$C,$C2,Sheet1!$A:$A,OFFSET(変数!$A$1:$A$10,0,MATCH($A2,変数!$A$1:$C$1,0)-1)))

投稿2021/08/09 05:11

jinoji

総合スコア4592

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

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

0

せっかくのExcelですから
アプローチを変えてVBAではなく
EXCELとしての機能を
有効活用することをおすすめします。

おそらく商品の名前は毎回変わるんですよね?

別シートにコピーして
タイトルで重複削除すれば
簡単に商品リストが手に入ります

商品リストをコピーして2つにして
それぞれ日本用と海外用としましょう

商品リストの横に
商品名をキーとして目的の値を算出する
数式を入れましょう
sumifsだけで行けますね

数式を消したいなら
最後は出来上がった表をコピーして
同じ場所に値貼り付けすればいいですね

上記の処理をVBAで書くと
かなりらくできると思います

投稿2021/08/08 08:57

編集2021/08/08 08:59
kamikazelight

総合スコア305

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問