No.4ベストアンサー
- 回答日時:
こんばんは!
No.2さんがおっしゃっているように、別シートへ集計した方が良いのではないでしょうか。
(元データが変化してしまうと、確認のしようがありません)
というコトで、元データはSheet1にありSheet2に表示するコードにしてみました。
データ数は極端に多くないというコトなので、一例です。
標準モジュールにしてください。
Sub Sample1()
Dim lastRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet1")
With Worksheets("Sheet2")
.Range("A:B").ClearContents
.Range("A1:B1").Value = wS.Range("A1:B1").Value
wS.Range("A:A").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("A1"), unique:=True
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
With Range(.Cells(2, "B"), .Cells(lastRow, "B"))
.Formula = "=SUMIF(Sheet1!A:A,A2,Sheet1!B:B)"
.Value = .Value
End With
.Range("A1").CurrentRegion.Sort key1:=.Range("A1"), order1:=xlAscending, Header:=xlYes
End With
End Sub
※ ↓のコードは余計なお世話になるかもしれませんが、
コードは長いですが、データ数が数万行あってもそんなに時間を要しない方法です。
(参考程度で・・・)
Sub Sample2()
Dim myDic As Object
Dim i As Long, lastRow As Long
Dim wS As Worksheet
Dim myKey, myItem, myR
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
wS.Range("A:B").ClearContents
With Worksheets("Sheet1")
wS.Range("A1:B1").Value = .Range("A1:B1").Value
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(2, "A"), .Cells(lastRow, "B"))
For i = 1 To UBound(myR, 1)
If Not myDic.exists(myR(i, 1)) Then
myDic.Add myR(i, 1), myR(i, 2)
Else
myDic(myR(i, 1)) = myDic(myR(i, 1)) + myR(i, 2)
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
For i = 0 To UBound(myKey)
With wS.Cells(i + 2, "A")
.Value = myKey(i)
.Offset(, 1) = myItem(i)
End With
Next i
wS.Range("A1").CurrentRegion.Sort key1:=wS.Range("A1"), order1:=xlAscending, Header:=xlYes
Set myDic = Nothing
End Sub
こんな感じではどうでしょうか?m(_ _)m
お返事ありがとうございます。
標準モジュールで、無事うまくいきました。
すごいです。この短い時間でしかも2つもコードを作成できるのにはびっくりです。今日朝9時からずーっとパソコンの前に座ってVBAを考えているのですがなかなか進まなかったのですが・・・
みなさんに助けてもらって非常にうれしいです。
本当にありがとうございます。
No.5
- 回答日時:
No.4です。
投稿後気になったのですが、
>添付図のように4つの条件をひとつにまとめるところまでできましたが
とありますが、元データは5列のデータなのですかね?
そうであればわざわざ一つの列にまとめなくてもそのままの状態で可能です。
前回の「Sample2」に少し手を加えるだけです。
前回同様元データはSheet1のA~E列にあり、Sheet2に表示するとします。
尚、1行目は項目名が入っているという前提です。
(A~D列は何らかの名目でE列が合計する数値列だとします。)
標準モジュールにしてみてください。
Sub Sample3()
Dim myDic As Object
Dim i As Long, lastRow As Long
Dim myStr As String, wS As Worksheet
Dim myKey, myItem, myR, myAry
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
wS.Range("A:E").ClearContents
With Worksheets("Sheet1")
wS.Range("A1:D1").Value = .Range("A1:D1").Value
wS.Range("E1") = "合計"
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(2, "A"), .Cells(lastRow, "E"))
For i = 1 To UBound(myR, 1)
myStr = myR(i, 1) & "_" & myR(i, 2) & "_" & myR(i, 3) & "_" & myR(i, 4)
If Not myDic.exists(myStr) Then
myDic.Add myStr, myR(i, 5)
Else
myDic(myStr) = myDic(myStr) + myR(i, 5)
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
For i = 0 To UBound(myKey)
myAry = Split(myKey(i), "_")
With wS.Cells(i + 2, "A")
.Value = myAry(0)
.Offset(, 1) = myAry(1)
.Offset(, 2) = myAry(2)
.Offset(, 3) = myAry(3)
.Offset(, 4) = myItem(i)
End With
Next i
Set myDic = Nothing
'//▼A→B→C→D列の順の優先順位で並び替え(すべて昇順)//
With wS.Range("A1").CurrentRegion
.Sort key1:=wS.Range("D1"), order1:=xlAscending, Header:=xlYes
.Sort key1:=wS.Range("A1"), order1:=xlAscending, _
key2:=wS.Range("B1"), order1:=xlAscending, _
key3:=wS.Range("C1"), order1:=xlAscending, _
Header:=xlYes
End With
'//▲ココまで//
wS.Activate
MsgBox "完了"
End Sub
こんな感じで大丈夫だと思います。m(_ _)m
色々とありがとうございます。
vbaは本当に色々なことができると感心させられます。
親切に教えていただいて本当にありがとうございます。
No.3
- 回答日時:
No2です。
以下のマクロを標準モジュールに登録してください。-----------------------------------
Option Explicit
Public Sub 並べ替え加算()
Dim maxrow As Long
Dim dicT As Object '連想配列 キー:A列 値:B列合計
Dim row As Long
Dim key As Variant
Dim i As Long
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
'A列でソート
Range("A1").Sort key1:=Range("A1"), Header:=xlYes
maxrow = Cells(Rows.Count, "A").End(xlUp).row 'A列の最大行取得
'A列の値をキーとして、連想配列に加算
For row = 2 To maxrow
key = Cells(row, 1).Value
If dicT.exists(key) = True Then
dicT(key) = dicT(key) + Cells(row, 2).Value
Else
dicT(key) = Cells(row, 2).Value
End If
Next
Rows("2:" & Rows.Count).ClearContents 'Sheetの2行以降をクリア
'Sheetへ出力
row = 2
For Each key In dicT
Cells(row, 1).Value = key
Cells(row, 2).Value = dicT(key)
row = row + 1
Next
End Sub
ありがとうございます。
標準モジュールで試してみましたら、無事うまくいきました。
VBAで合算は非常に難しくて、何度コードを読み返してもしっかりと理解できないです。この合算のコードを考えているだけで6時間以上かかってもできませんでした。この短時間でこの完璧なコードを作成するのはすご過ぎです。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Visual Basic(VBA) Excel(VBA) 特定の条件に該当する行の値、書式を同じセルにコピ&ペーストしたいです 1 2022/05/21 18:18
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- Excel(エクセル) Excel_マクロ_複数のシートのVLOOKUPで表示された#N/A以外に色付けをしたいです 1 2023/02/16 22:37
- Visual Basic(VBA) 2つの条件が一致したら一覧へコピーしたい。 左から4番目以降のシート名にコードが入ったシートを全て、 5 2022/09/20 19:41
- Visual Basic(VBA) VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。 13 2023/02/26 09:31
- Visual Basic(VBA) VBA エクセル 条件の設定 1 2022/03/28 10:24
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Worksheets メソッドは失敗しま...
-
【VBA】2つのシートの値を比較...
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
Cellsのかっこの中はどっちが行...
-
vbaでシートより100より大きい...
-
文字列の結合を空白行まで実行
-
セルに値が入っていた時の処理
-
空白セルをとばして転記
-
【Excel VBA】 B列に特定の文字...
-
VBAのFind関数で結合セルを検索...
-
VBAで指定範囲内の空白セルを左...
-
マクロ 最終列をコピーして最終...
-
マクロについて。S列の途中から...
-
リストボックス セルの値を取得...
-
VBAを使って検索したセルをコピ...
-
マクロ 関数を使った抽出でエラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
VBAのコードを教えてください
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
エクセルvbaについて
-
vba 2つの条件が一致したら...
-
Excelで、あるセルの値に応じて...
-
VBA UserFormからの転記で
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
エクセルVBAにて =A1=B1とすれ...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
VBマクロ 色の付いたセルを...
-
VBAで指定範囲内の空白セルを左...
おすすめ情報