vbaをネットで検索しながら作成しているのですが、うまくいかず困っています。
お助けいただけたら嬉しいです。
やりたいことは、A列、B列、C列が全て同じデータの場合、D列の個数を合算します。合算した場合、E列とF列の一番最初(行列の番号の低い)の値を転記します。取得結果を、H列以降に出力します。
E列とF列の値をL列とM列に転記する部分がどうしても分からず、ご教示いただけたら助かります。
-------------------------------------------------------------------------------------------------
Sub 重複データを削除し合算()
Dim myDic As Object
Dim myKey As Variant
Dim myItem As Variant
Dim i As Long
Dim Target As String
Dim tmp As Variant
Set myDic = CreateObject("Scripting.Dictionary")
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Target = Cells(i, 1) & "_" & Cells(i, 2) & "_" & Cells(i, 3)
If Not myDic.exists(Target) Then
myDic.Add Key:=Target, Item:=Cells(i, 4)
Else
myDic(Target) = myDic(Target) + Cells(i, 4)
End If
Next
myKey = myDic.keys
myItem = myDic.items
Application.ScreenUpdating = False
For i = 0 To UBound(myKey)
tmp = Split(myKey(i), "_")
Cells(i + 1, 8) = tmp(0)
Cells(i + 1, 9) = tmp(1)
Cells(i + 1, 10) = tmp(2)
Cells(i + 1, 11).Value = myItem(i)
Next
Application.ScreenUpdating = True
Set myDic = Nothing
End Sub
No.3ベストアンサー
- 回答日時:
一例です。
Sub try()
Dim myDic As Object
Dim r As Range
Dim st As String, v
Set myDic = CreateObject("Scripting.Dictionary")
Range("H:M").ClearContents
For Each r In Range("A1", Cells(Rows.Count, "A").End(xlUp))
With Application
st = Join(.Index(r.Resize(, 3).Value, 1, 0), "_")
If Not myDic.Exists(st) Then
myDic.Add st, .Index(r.Range("A1:F1").Value, 1, 0)
Else
v = myDic(st)
v(4) = v(4) + r.Range("D1").Value
myDic(st) = v
End If
End With
Next
Range("H1").Resize(myDic.Count, 6).Value = _
Application.Transpose(Application.Transpose(myDic.Items))
Set myDic = Nothing
End Sub
お返事ありがとうございます。
ご教示いただいたコードでうまくいきました。
連想配列やっぱり難しいです。このコードが書けるのは本当にすばらしいです。
No.5
- 回答日時:
こんばんは
ご提示の方法とはまったくの別発想ですが、シート機能の「重複の削除」で重複を取り除き、シート関数の「SUMIFS」で合計を算出する方法です。
以下、ご参考にでもなれば。
※ 最初にH:M列をクリアしますのでご注意。
Sub Q_13521754()
Dim n As Long, f As String
Dim r As Range, s As Range
Columns("H:M").ClearContents
n = Cells(Rows.Count, 1).End(xlUp).Row
If n < 2 Then MsgBox "データがありません": Exit Sub
Set r = Range("H1:M1").Resize(n)
Set s = Range("A2").Resize(n - 1)
r.Offset(, -7).Columns("A:C").Replace "", Chr(27), xlWhole, , 1
r.Value = r.Offset(, -7).Value
r.RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes
Set r = Range("K2").Resize(Cells(Rows.Count, 8).End(xlUp).Row - 1)
f = "=SUMIFS(@4,@1,H2,@2,I2,@3,J2)"
For n = 1 To 4
f = Replace(f, "@" & n, s.Offset(, n - 1).Address)
Next n
r.FormulaLocal = f
r.Value = r.Value
s.Resize(, 10).Replace Chr(27), "", xlWhole, , 1
End Sub
お返事ありがとうございます。
ご教示いただいたコードでうまくいきました。
色々なやり方があるのですね。VBAはまだまだ奥が深いなっと感心させられます。
No.4
- 回答日時:
No2です。
下記URLへアップしました。
https://ideone.com/ump0GD
H1~M1の見出し行は、マクロでは設定していません。
予め、H1~M1の見出し行を手作業で、設定しておいてください。
マクロは、H列~M列の2行目以降を設定します。
お返事ありがとうございます。
URL見てみたのですが、わたしの理解不足で分かりませんでした。
色々とお手伝いいただいてありがとうございました。
No.2
- 回答日時:
もう1つ、dictionaryを作って、それに格納しておけば良いです。
もう1つのdictionaryのキー:myDicと同じキー
もう1つのdictionaryのアイテム:キーが最初に出現した時の行番号
ところで、このシートの1行目は見出し行になっていますが、
マクロをみたところ、1行目からデータが始まっているように見えます。
1行目は見出し行でしょうか。それともデータ行でしょうか。
お返事ありがとうございます。
1行目は見出し行です。
dictionaryもうひとつ作るのは、どうすればいいかご教示いただけると助かります。簡易なvbaは理解しているのですが、連想配列を今ひとつ理解できていません。記載のコードは、ネットで探し当てたものを一部加工したものです。
No.1
- 回答日時:
Sub SumAndTranspose()
Dim lastRow As Long
Dim currentRow As Long
Dim sumValue As Double
Dim previousValue As Variant
lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' A列の最終行を取得
' 出力先のセルを指定
Dim outputCell As Range
Set outputCell = Range("H1")
' データを処理
For currentRow = 2 To lastRow ' ヘッダー行をスキップしてデータを処理
' A列、B列、C列が全て同じデータの場合
If Cells(currentRow, "A").Value = Cells(currentRow, "B").Value And _
Cells(currentRow, "A").Value = Cells(currentRow, "C").Value Then
' D列の値を合算
sumValue = sumValue + Cells(currentRow, "D").Value
' E列とF列の最初の値を転記
If IsEmpty(previousValue) Then
previousValue = Cells(currentRow, "E").Value
outputCell.Value = previousValue
End If
End If
' A列、B列、C列の値が変わった場合、合計値と新しい値を出力
If Cells(currentRow, "A").Value <> Cells(currentRow + 1, "A").Value Or _
Cells(currentRow, "B").Value <> Cells(currentRow + 1, "B").Value Or _
Cells(currentRow, "C").Value <> Cells(currentRow + 1, "C").Value Then
' 合計値を出力
outputCell.Offset(0, 1).Value = sumValue
' 新しい値を出力
outputCell.Offset(0, 2).Value = Cells(currentRow + 1, "E").Value
' 出力先のセルを次の行に移動
Set outputCell = outputCell.Offset(1, 0)
' 合計値をリセット
sumValue = 0
previousValue = Empty
End If
Next currentRow
End Sub
お返事ありがとうございます。
「補足する」で画像を添付したのですが、いただいたコードでうまくいきませんでした。画像を添付したので、投稿までにかなりの時間を要しているので、先にこちらで連絡しておきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
2024年に成し遂げたこと
今年も残すところわずか。 皆さんが今年達成したことを教えていただきたいです。 どんな小さなものでも構いません。
-
自分の通っていた小学校のあるある
進学したり大人になってから、「あれって自分の小学校だけだったのかな」と思うことありますよね。 逆に「他の小学校ってそんなことするの!?」と思ったり。 そんな「自分の通っていた小学校」のあるあるを教えてください!
-
我がまちの「給食」自慢を聞かせてっ!
富山県の給食には「ベニズワイガニ」が出る、、、なんて話を聞いたことがあります。 日本全国「え、給食にそれ出るの!?」な驚きメニューがまだまだあるはず!
-
VBAで重複データを合算したい
Excel(エクセル)
-
VBAで重複する項目を1つにまとめて金額を合計したい
Excel(エクセル)
-
重複行を削除して数値を合算したい(合算列が多い)
Excel(エクセル)
-
-
4
重複データの合算(VBA)
Visual Basic(VBA)
-
5
重複するIDのデータを1行にまとめるvbaのコード
Access(アクセス)
-
6
Excelで一行おきに2行の空白行を挿入したい
その他(Microsoft Office)
-
7
UserForm1.Showでエラーになります。
工学
-
8
ShowAllDataのエラーを回避したい
Access(アクセス)
-
9
Dictionaryを使い4つの条件の一致で2つの集計列を集計したいのです
Visual Basic(VBA)
-
10
エクセルでデータがある部分だけ罫線で囲いたいです。
Excel(エクセル)
-
11
なぜShowAllDataだとうまく行かないのでし
Access(アクセス)
-
12
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
13
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
14
エクセルVBA 4行飛ばしで転記するループ処理
Excel(エクセル)
-
15
EXCEL VBA Dictionaryで複数の値を格納→離れた位置に出力する方法
Excel(エクセル)
-
16
複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。
Visual Basic(VBA)
-
17
VBA 最終行まで数式をコピーする
Visual Basic(VBA)
-
18
【ExcelVBA】インデックスが有効範囲にありません。の理由が分かりません
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
IIF関数の使い方
-
B列の最終行までA列をオート...
-
VBAを使って検索したセルをコピ...
-
Excelで、あるセルの値に応じて...
-
URLのリンク切れをマクロを使っ...
-
vba 2つの条件が一致したら...
-
【Excel VBA】カンマと改行コー...
-
【VBA】2つのシートの値を比較...
-
Cellsのかっこの中はどっちが行...
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
データグリッドビューの一番最...
-
VBAにて 商品と月別ごとにの...
-
rowsとcolsの意味
-
【VBA】複数行あるカンマ区切り...
-
VBA 何かしら文字が入っていたら
-
Changeイベントでの複数セルの...
-
VBAで、離れた複数の列に対して...
-
【Excel VBA】 B列に特定の文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
Changeイベントでの複数セルの...
-
C# dataGridViewの値だけクリア
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
rowsとcolsの意味
-
VBAで、離れた複数の列に対して...
-
VBAでのリスト不一致抽出について
-
VBA 何かしら文字が入っていたら
-
VBAコンボボックスで選択した値...
-
マクロ 最終列をコピーして最終...
おすすめ情報
お返事ありがとうございます。
早速試してみたのですが、添付のようになりうまくいきません。
せっかくご教示いただいたのに、申し訳ありません。