A列が文字列、B列~AB列が数字の羅列(1行目はタイトル行)
上記のようなデータがあります。
A列が重複する行は削除し、B列目以降は合算した結果をそれぞれの列に出したい(B列の合算はB列に、C列の合算はC列に・・・)と思っています。
下記コードはB列のみ合算するコードになっていますが、B列のみではなく、
B列~AB列を列毎に合算する構文にするにはどうすれば良いかご教授頂けないでしょうか。
Sub 重複データを削除し合計を合算()
Dim myDic As Object
Dim myKey As Variant
Dim myItem As Variant
Dim myList As Variant
Dim i As Long
Set myDic = CreateObject("Scripting.Dictionary")
'A列,AB列のデータを配列に格納
myList = Range("A2", Range("A" & Rows.Count). _
End(xlUp)).Resize(, 28).Value
'連想配列にデータを格納
For i = 1 To UBound(myList, 1)
'コードが空欄かチェック
If Not myList(i, 1) = Empty Then
If Not myDic.exists(myList(i, 1)) Then
'重複しないコードを取得
myDic.Add Key:=myList(i, 1), Item:=myList(i, 2)
Else
'加算
myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2)
End If
End If
Next
'[コード] 重複していないリストを格納
myKey = myDic.keys
'[合計] 合計を格納
myItem = myDic.items
'リストを出力
For i = 0 To UBound(myKey)
Cells(i + 2, 31).Value = myKey(i)
Cells(i + 2, 32).Value = myItem(i)
Next
'開放
Set myDic = Nothing
End Sub
No.7
- 回答日時:
Consolidate メソッドなんてのもあるんですね。
初級者は余り機能とかよく見ずに作るから長くなるのでしょうね。
'開放
Set myDic = Nothing
Next '←追加
これですと変数:myDic はDictionaryから解放されますので次のループではDictionaryオブジェクトとして使えません。
データだけを消したいとお見受けしたのですが多分以下だと思います。
myDic.RemoveAll '←追加:全てのキーと項目を削除
Next '←追加
'開放
Set myDic = Nothing
ありがとうございます。
初級者ですみません。頑張って勉強します。
ご教授頂いた内容+下記を忘れていたので修正してループ処理で対応する事が出来ました。
For i = 0 To UBound(myKey)
Cells(i + 2, 31).Value = myKey(i)
Cells(i + 2, 30+j).Value = myItem(i)
Next
No.4
- 回答日時:
こんにちは
すでに回答が出ていますが・・・
>B列のみではなく、B列~AB列を列毎に合算する構文に
>するにはどうすれば良いかご教授頂けないでしょうか。
ご提示のコードでは、加算する列を2(=B列)固定で計算しているので、ご質問文のようになっています。
条件は同じなので、列を2~28までループ等で加算するようにすれば、全体を処理することが可能になるでしょう。
ご提示のコードは配列や連想配列を利用して計算していますが、以下は、エクセルのシートとその機能を利用して算出するごくプリミティブな例です。
ご参考までに。
Sub Sample_Q12365731()
Dim rng As Range, rng2 As Range, rng3 As Range
Const mxCol = 28
Const f = "=IF(@="""","""",SUMIF($A:$A,@,B:B))"
Set rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Resize(, mxCol)
Set rng2 = rng.Offset(, mxCol + 2)
rng2.Value = rng.Value
Set rng3 = rng2.Cells(2, 2).Resize(rng.Rows.Count - 1, mxCol - 1)
' 重複を削除
rng3.Columns(1).Offset(, -1).RemoveDuplicates Columns:=1, Header:=xlNo
' 同じ文字列の値を合計
rng3.FormulaLocal = Replace(f, "@", rng2.Cells(2, 1).Address(0, 1))
rng3.Value = rng3.Value
End Sub
ありがとうございます。
VBA初心者ですが見よう見まねでループ処理の構文にしてみましたがエラーになってしまいました。根本的に間違っているでしょうか?
Dim i,j As Long
For j = 2 To 28 '←追加
For i = 1 To UBound(myList, 1)
If Not myList(i, 1) = Empty Then
If Not myDic.Exists(myList(i, 1)) Then'←2回目のループでここでエラー
myDic.Add Key:=myList(i, 1), Item:=myList(i, j) '←myList(i, 2)を変更
Else
myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, j) '←myList(i, 2)を変更
End If
End If
Next
myKey = myDic.keys
myItem = myDic.Items
For i = 0 To UBound(myKey)
Cells(i + 2, 31).Value = myKey(i)
Cells(i + 2, 32).Value = myItem(i)
Next
'開放
Set myDic = Nothing
Next '←追加
No.3
- 回答日時:
No.1です。
やっぱパワークエリですかぁ。
経験ないですけど、SQLで言うクエリ以上なのでしょうか?
フィールドが28もあって各27フィールド毎に計算結果を出すのってどうやれるのか興味はありますね。(必要ないのでそこまでは実践しませんが)
先に重複データを纏めておいて列毎にSUMIF関数って位しか思いつかない愚かな初級者ですし。
ありがとうございます。
SUMIF関数もやろうと思いましたが、10000行ほどあって処理に時間が掛かる為、VBAで配列して一気に吐き出せば処理時間が短くなるのではと思い、質問させて頂きました。
No.1
- 回答日時:
いきなり多い列数よりも少なめからやった方が良いと思い(ダミーデータ作るのが面倒だったとは言いませんよ?)、A~E列のデータをH~J列に書き出す方法なら、
Sub megu()
Dim myDic As Object
Dim st As String
Dim myList As Variant, v As Variant, vv As Variant
Dim i As Long, j As Long
Set myDic = CreateObject("Scripting.Dictionary")
myList = Range("A2", Cells(Rows.Count, "E").End(xlUp))
For i = 1 To UBound(myList, 1)
st = myList(i, 1)
vv = WorksheetFunction.Index(myList, i, 0)
If Not myDic.Exists(st) Then
myDic.Add st, vv
Else
v = myDic(st)
For j = 2 To UBound(vv)
v(j) = v(j) + vv(j)
Next
myDic(st) = v
End If
Next
Range("H1:L1").Value = Range("A1:E1").Value
With WorksheetFunction
Range("H2").Resize(myDic.Count, UBound(myList, 2)).Value = .Transpose(.Transpose(myDic.Items))
End With
Set myDic = Nothing
End Sub
参考にならない、もっと楽な回答が出てきたらスル~して下さいな。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VBAで重複データを合算したい
Excel(エクセル)
-
重複行を削除して数値を合算したい(合算列が多い)
Excel(エクセル)
-
VBAで重複する項目を1つにまとめて金額を合計したい
Excel(エクセル)
-
-
4
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
5
エクセルで重複するセル合計を別シートへ自動記入
Excel(エクセル)
-
6
VBA 重複データの合計
Excel(エクセル)
-
7
vba 重複データ合算
Visual Basic(VBA)
-
8
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
9
Dictionaryを使い4つの条件の一致で2つの集計列を集計したいのです
Visual Basic(VBA)
-
10
EXCEL 重複データの集計の仕方
Excel(エクセル)
-
11
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
12
EXCELマクロを使い、空白行ではさまれた範囲の数字を合計
Excel(エクセル)
-
13
EXCEL VBAで、セルの文字列の前後に文字を入力する方法は?
その他(Microsoft Office)
-
14
エクセル マクロで数値が変った時行挿入できますか
Excel(エクセル)
-
15
VBAでユーザーフォームにセル値を表示させるには
Visual Basic(VBA)
-
16
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
17
エクセル 重複 隣の列 一番上だけの数値を残す VBA
Excel(エクセル)
-
18
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
19
EXCEL VBA で重複するデータを抜き出し、カウントしたい
Excel(エクセル)
-
20
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
文字列の結合を空白行まで実行
-
URLのリンク切れをマクロを使っ...
-
VBAのFind関数で結合セルを検索...
-
C# dataGridViewの値だけクリア
-
vba 2つの条件が一致したら...
-
データグリッドビューの一番最...
-
VBA指定行削除
-
VBAで、特定の文字より後を削除...
-
Cellsのかっこの中はどっちが行...
-
【VBA】複数行あるカンマ区切り...
-
VBAで指定範囲内の空白セルを左...
-
VBAを使って検索したセルをコピ...
-
IIF関数の使い方
-
マクロについて。S列の途中から...
-
【VBA】2つのシートの値を比較...
-
マクロ 最終列をコピーして最終...
-
エクセルVBA シートモジュール...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
文字列の結合を空白行まで実行
-
VBA指定行削除
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
エクセルについて
-
【VBA】2つのシートの値を比較...
-
URLのリンク切れをマクロを使っ...
-
データグリッドビューの一番最...
-
Changeイベントでの複数セルの...
-
空白セルをとばして転記
-
rowsとcolsの意味
-
エクセルVBAにて =A1=B1とすれ...
おすすめ情報