
No.2ベストアンサー
- 回答日時:
ブログにも記述していますが、以下、使えそうなところを・・・・
標準モジュールに以下を記述しておきます。
Public Sub GrpSums(rng1 As Range, rng2 As Range, rng3 As Range)
Dim dic As Object
Dim r As Range
Dim sS As String
Dim v As Variant
Dim iLoop As Long
Dim i As Long, j As Long
Const sDLM As String = "__"
iLoop = rng1.CurrentRegion.Rows.Count - 1
If (iLoop < 1) Then Exit Sub
If (rng3.Count <> 1) Then Exit Sub
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To iLoop
sS = ""
For Each r In rng1.Offset(i)
sS = sS & sDLM & r
Next
v = dic.Item(sS)
If (Not IsArray(v)) Then ReDim v(rng2.Count + 1)
j = 0
For Each r In rng2.Offset(i)
v(j) = v(j) + r
j = j + 1
Next
v(j) = v(j) + 1 ' 出現個数(後々使えるかも)
v(j + 1) = i ' 見出しからの相対行(結果を表示する際のコピー元)
dic.Item(sS) = v
Next
With rng3
rng1.Copy .Offset(0, 0)
i = rng1.Count
For Each r In rng2
.Offset(, i) = r & "計"
i = i + 1
Next
i = 1
For Each v In dic.items
j = v(rng2.Count + 1)
rng1.Offset(j).Copy .Offset(i)
.Offset(i, rng1.Count).Resize(, rng2.Count) = v
i = i + 1
Next
End With
Set dic = Nothing
End Sub
使い方)
Call GrpSums(rng1 As Range, rng2 As Range, rng3 As Range)
rng1:グループとしてみなす項目を指定
rng2:合計する項目を指定
rng3:結果を表示するところを指定
指定例)
Call GrpSums(Range("B3:F3"), Range("H3:I3"), Range("B20")) とか
Call GrpSums(Range("B3,C3,E3,F3,H3"), Range("J3,L3"), Range("B20")) とかとか
添付図であれば以下の様な雰囲気かも
> 部署別に品名が一致
ということですが、「型番」もグループ条件に含めます
Sheet2 をクリアしてから
With Worksheets("Sheet1")
Call GrpSums(.Range("A1:C1"), .Range("D1"), Worksheets("Sheet2").Range("A1"))
End With
もし、「型番」をグループ条件から外す場合は、"A1:C1" を "A1:B1" とか "A1,B1" に・・・
その時には、結果の表示からも「型番」は消えます。
まず、rng1、rng2 で指定する項目の行は、同じでなくてはなりません。
rng1 で指定された CurrentRegion の範囲で Offset を用いてグループ、合計を処理していきます。
グループを管理する方法として、
・全項目を1つの文字列にして、同じ文字列になったものをグループとして扱いましょう。
・この同じ・・・ Dictionary のキーとしてまとめていきましょう。
・合計値は、Dictionary のItem として、配列で加算していきましょう。
そして、Item の配列内に、グループとして何個扱ったか、
また、元々の値は何行目を参照したか覚えておいて、結果出力時にコピー元にしちゃいましょう。
なお、グループ化するセルの内容はそのままになります。
(数値であっても文字であってもかまいません)
データが正しければ、そこそこ動くと思います。
不都合あれば、修正してください。
No.1
- 回答日時:
こんな感じです。
データシートのシートタブ上で右クリック→コードの表示→サンプルコード貼り付け→シート上でAlt+F8キー押下、sample実行
Sub sample()
Dim i As Long, db, wk
Set db = CreateObject("Scripting.Dictionary")
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
wk = Cells(i, 1) & "," & Cells(i, 2) & "," & Cells(i, 3)
db(wk) = db(wk) + Cells(i, 4)
Next
wk = db.keys
With Sheets("sheet2")
.Cells.Clear
.Cells(1, 1).Resize(, 4) = Cells(1, 1).Resize(, 4).Value
For i = 0 To UBound(wk)
.Cells(i + 2, 1).Resize(, 3) = Split(wk(i), ",")
.Cells(i + 2, 4) = db(wk(i))
Next
End With
Set db = Nothing
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】元のシート内の文字列を別シートと比較し、一致したら元のシートの別のセルへ転記する方法。 3 2023/03/23 17:30
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Excel(エクセル) エクセルのSUM関数について 4 2023/04/18 10:37
- Excel(エクセル) 関数で割合を表示する 2 2022/09/27 06:09
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) ある文字を含む際に、値を返す数式についてです 5 2022/08/28 16:58
- その他(Microsoft Office) Excelで該当しない項目(#N/Aの商品名)を簡単に表示・抽出させる方法についてです 1 2022/08/25 22:12
- Excel(エクセル) SUMIFS 一部の条件のどちらかを参照する場合を教えてください。 2 2022/04/26 12:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAをつかってクエリの情報を抽...
-
実行時エラー3131 FROM 句の構...
-
codeigniter 複数モデルでトラ...
-
SELECT文を発行して、ACCESSよ...
-
エラー3011
-
SQL文が実行できません
-
phpのPEARのMDB2を使って出たエ...
-
SQL文の実行に失敗しました???
-
DBで検索結果に該当するデータ...
-
PEAR::DBで取得したデータで処...
-
JAVA SQLServerException 列名 ...
-
テーブルに入っているデータと...
-
dbに登録したデータをphpのプル...
-
PHPからMySQLへの検索
-
php、PDOでの接続とクエリの記...
-
order by での変数使用について。
-
Resource id #3 をフィールドの...
-
PHPからデータベースに接続した...
-
PHP の ファイルアップロード
-
Mysqlにhtmlのフォームから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスに入れた内容...
-
VBAをつかってクエリの情報を抽...
-
実行時エラー3131 FROM 句の構...
-
Accessのテーブルへ複数の主キ...
-
LocalのNotesメールDBをVBAで参...
-
エラー3011
-
SQL文が実行できません
-
phpのPEARのMDB2を使って出たエ...
-
SQL文の実行に失敗しました???
-
PDOで取得される値がすべて文字...
-
SQLiteのデータベースについて
-
SELECT文を発行して、ACCESSよ...
-
時刻型にNULLでセットしたい
-
zend(phpフレームワーク)でトラ...
-
pearのdisconnect()が使えない。
-
classの使い方について
-
DBデータをcsvで出力の際カンマ...
-
ExcelVBAでAccessのデータを検...
-
PHP(PDO)でDBの情報を完全一...
-
例外処理
おすすめ情報