• 締切済み

重複データの集約を繰り返す方法について

エクセルのVBAで質問です。 複数シートのB行に重複したデータがあります。 (複数シートともデータ数は違いますが同じデータがあります) この重複したーデータを集約しA行に横に出力する為下記のマクロを組みました。 '集約する Dim Dic, i As Long, buf As String, Keys Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next Do Until Cells(i, 2).Value = "" buf = Cells(i, 3).Value Dic.Add buf, buf i = i + 1 Loop '出力 Keys = Dic.Keys For i = 0 To Dic.Count - 1 Cells(1, i + 5) = Keys(i) Next i Set Dic = Nothing これで集約はできたのですが、他のシートも連続して同じ集約作業をさせたいと思っています。 しかし、くり返し作業をさせると1枚目のシートは集約できますが2枚目以降のシートが同じように集約できません。 適切なくり返しができる構文をご教示いただきたくお願い致します。

  • alex_
  • お礼率100% (1/1)

みんなの回答

  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

Sub Test()  Dim Dic, i As Long, buf As String, Keys  Set Dic = CreateObject("Scripting.Dictionary")  On Error Resume Next  Dim Sht As Worksheet  For Each Sht In Worksheets    i = 1    Do Until Sht.Cells(i, 2).Value = ""      buf = Sht.Cells(i, 2).Value      Dic.Add buf, buf      i = i + 1    Loop '出力    Sht.Cells(1, 5).Resize(1, Dic.Count).Value = Dic.Keys    Dic.RemoveAll  Next Sht End Sub '----------------------------------------------- ●buf = Sht.Cells(i, 2).Value これが提示のコードでは、Cells(i,3) とC列参照になってたので B列に修正した。   以上です。  

alex_
質問者

お礼

ご教示ありがとうございます。 しかも ●buf = Sht.Cells(i, 2).Value →●buf = Sht.Cells(i, 3).Value まで修正いただき助かりました。 今回の内容は自分のスキルアップにつながりました。 こんごも有効にマクロが使えるよう努力していく所存です。 ありがとうございました。

関連するQ&A

  • VBA 連想配列と回数

    Widowsは7 Excelは2013を使用しています。 E列のデータの重複しないリストをK列に書きだすところまでは出来たのですが、 同じ商品名が何回出てきたをカウントしたいのですが、 下記の連想配列で一緒に出来るのか、分けて組まないといけないのか、 教えて下さい。 よろしくお願い致します。 '---------------------------- '重複しないリストをK列に書き出す '---------------------------- Dim Dic, i As Long, buf As String, Keys Set Dic = CreateObject("Scripting.Dictionary") For i = 2 To maxRow buf = Cells(i, 5).Value 'E列のセルの値をbufに格納する If Not Dic.Exists(buf) Then '辞書にまだ登録されていなければ Dic.Add buf, buf 'そのセルの値を連想配列に登録する。 End If Next i '出力 Keys = Dic.Keys For i = 0 To Dic.Count - 1 Cells(i + 2, 11) = Keys(i) 'K2から下にリスト作成 Next i Set Dic = Nothing End Sub

  • VBA 複数のシートをまたいでの連想配列

    win7、Excelは2013を使用しています。 添付画像の様に、12シートの合計を連想配列に格納しsheet13に書き出したいのですが、プロシージャーの下から6行目のところで、エラーコード451が出ます。 どの様に変更すれば良いか教えて下さい。 Sub 年間集計() Dim Dic Dim i As Integer Dim j As Integer Dim sh As Worksheet Dim rng As Range Dim buf As String Dim num As Integer Set Dic = CreateObject("Scripting.Dictionary") For Each sh In Worksheets For Each rng In sh.Range("J2", sh.Cells(Rows.Count, 10).End(xlUp)) buf = rng.Value num = rng.Offset(, 1).Value If Not Dic.Exists(buf) Then Dic.Add buf, num Else Dic.Item(buf) = Dic.Item(buf) + num End If Next rng Next sh j = 2 With Worksheets("Sheet13") For i = 0 To Dic.Count - 1 .Cells(j, 1) = Dic.Keys(i)   ’エラー箇所 .Cells(j, 2) = Dic.Items(i) j = j + 1 Next i End With End Sub

  • VBA 複数シートに渡る連想配列

    Winは7、Excelは2013を使用しています。 画像の様に、シート2のA列の科目を連想配列のキーし、 シート2以降のシートのB列とC列のデータを同時に格納していきたいと思っています。 6月には、4~5月の2ヶ月分、7月には4~6月分の3ヶ月分、となるので、 シートの数だけ繰り返したいです。 それで、下記を自分で考えてみたのですが、 数々エラーになり、上手く行きません。 どなたか、ご教示頂けます様お願い致します。 Sub test_年間() '--------------------------------------- '科目を連想配列に登録し、年間集計シートに書き出す '--------------------------------------- Dim n As Integer Dim maxRow As Integer Dim Dic(36) Dim buf As String Dim Keys Dim k As Integer Dim a As Integer For s = 2 To Worksheets.Count Sheets(s).Activate maxRow = Range("A65536").End(xlUp).Row '------------------------------------ '格納 '------------------------------------ Set Dic(s) = CreateObject("Scripting.Dictionary") For n = 2 To maxRow buf = Cells(n, 1).Value 'A列のセルの値をbufに格納する b = Cells(n, 2).Value 'B列のセルの値をbに格納する c = Cells(n, 3).Value 'C列のセルの値をcに格納 If buf = "" Then '空白セルではなく ElseIf Not Dic(s).Exists(buf) Then '辞書にまだ登録されていなければ Dic(s).Add buf, b 'そのセルの値を連想配列に登録する。 'ここで Dic(S+1).Add buf, c のような事がしたいのですが.... 'でもS+1はエラーになります。 End If Next n Next s '--------------------------------------------- '書き出す '--------------------------------------------- For s = 2 To Worksheets.Count Keys = Dic(s).Keys Worksheets("年間集計").Activate With Worksheets("年間集計") k = 1 a = 1 r = 0 For n = 0 To Dic(s).Count - 1 k = k + 1 '最初の書き出しは2行目から Cells(k, 1 + r) = Keys(n) Cells(k, 2 + r) = Dic(s)(Keys(n)) ' Cells(k, 3 + r).NumberFormatLocal = "[h]:mm" ' Cells(k, 3 + r) = Dic(s + 1)(Keys(n)) r = r + 3 Next n End With Next s Set Dic(s) = Nothing MsgBox "終了" End Sub 勝手申しますが、お礼は来週月曜日なります。 どうかお許し願います。

  • 重複データーの集計、削除

    どなたかご教授下さい。 下記のようにD列に重複する行があればI列に集計し、行削除するマクロを作成しました。 さらに、重複する基準となる列を複数(D列,F列,G列)に増やしたいのですが、上手く出来ません。 宜しくお願い致します。 Sub test() Dim i, j For i = 19 To Cells(Rows.Count, 2).End(xlUp).row - 1 For j = Cells(Rows.Count, 2).End(xlUp).row To i + 1 Step -1 If Cells(i, 4).value = "" Then Exit Sub If Cells(i, 4).value = Cells(j, 4).value Then Cells(i, 9).value = Cells(i, 9).value + Cells(j, 9).value Rows(j).Delete End If Next Next End Sub

  • QエクセルVBARange3か所に合致する合計額2

    お世話になります。 下記は質問内容の現在の出力マクロです Private Sub CommandButton32_Click() Unload Me Sheets("入力").Select Set dic1 = CreateObject("Scripting.Dictionary") Sheets("入力").Select Set dic2 = CreateObject("Scripting.Dictionary") Sheets("入力").Select Set dic3 = CreateObject("Scripting.Dictionary") v = Sheets("入力").Range("D2").CurrentRegion.Resize(, 12).Value2 For i = 1 To UBound(v) sName = v(i, 10) dic1(sName) = dic1(sName) + v(i, 12) Next v = Sheets("入力").Range("B2").CurrentRegion.Resize(, 12).Value2 For i = 1 To UBound(v) sName = v(i, 2) dic2(sName) = dic2(sName) + v(i, 12) Next v = Sheets("入力").Range("B2").CurrentRegion.Resize(, 12).Value2 For i = 1 To UBound(v) sName = v(i, 4) dic3(sName) = dic3(sName) + v(i, 12) Next Workbooks.Add With Sheets("sheet1").Range("B3").Resize(dic1.Count) .Resize(, 2).Value = Application.Transpose(Array(dic1.Keys(), dic1.Items())) End With With Sheets("sheet2").Range("B3").Resize(dic2.Count) .Resize(, 2).Value = Application.Transpose(Array(dic2.Keys(), dic2.Items())) End With With Sheets("sheet3").Range("B3").Resize(dic3.Count) .Resize(, 2).Value = Application.Transpose(Array(dic3.Keys(), dic3.Items())) End With End Sub 前回質問からCD等もろもろ手抜きで書いたため少し違っています。 伝わるか心配ですが書き込みますので宜しくお願いします。 例、B列の重複した会社名C列の重複した支店加入者名D列の重複した班名そしてG列には重複した変更可能な重複した商品があります。重複したものをまとめてそれぞれに合計を出してBooks.AddのSheet1(現在はSheet1~sheet3に出力)に出力したいのです。その他の列は自動で出るように関数が張り付けてありますが質問には関係ないと思いますので割愛します。 つたない質問で申し訳ありませんがわかる方がありましたら回答をお願いします。 尚、(現在はSheet1~sheet3に出力)これではsheet1~sheet3を行ったり来たりで効率が悪くて困っています。宜しくお願いします

  • エクセルマクロ 検索して値を取得

    マクロはよく分かっていません。 既存のVBAを見ながらマネしてる状態なので、どこが間違っているのか教えて下さい。 sheet1 A 所属 1 789         2     3 sheet2    A     B 所属コード  所属 1 12345    あいう123 2 12346    あいう456   3 12347    あいう789 やりたいこと シート1の所属が「789」だったらとシート2の所属から「あいう789」を検索し、シート2の所属コード「12347」をシート1の所属に返す。 私が作ったやつだと「12347」は1行目でなく、3行目に返ってしまいます。 Dim SyozokuRange as Range Dim Syozoku as String Dim Buf as String Buf = "あいう" Syozoku = Buf & Syozoku Set SyozokuRange = worksheets(2).range("a:b").currentregion For i = 1 to SyozokuRange.rows.count If Syozoku = SyozokuRange.cells(i,2) Then worksheets(1).cells(i,1).value = SyozokuRange.cells(i,1) end if next i

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • VBA教えてください。重複データの削除

    エクセルからエクセルへのデータ取り込み、重複データ削除の方法について、とても時間がかかっており、ご教授いただきたいと思い、質問させていただきます。 よろしくお願い致します。 台帳(エクセル)とシステムから出力するcsvファイル(エクセル)があります。 csvファイル(エクセル)のデータを、台帳(エクセル)で管理します。 ‘csvファイル:商品コード、商品名、注文日、納期、などなどA~AZ列まで、1行目は項目名で、その後、1行1商品で2000行ほどデータがあります。 現在進行形のデータが全て出力されるため、台帳にあるデータと重複するものと、新規データがあり、新規データのみを台帳に追加していきたいです。 重複かどうかの判断は、A列の通し番号で判断しています。 台帳:シート4つで進捗を管理しています。 シート(1);csvファイルからデータを取り込むシート      一度出力データ全てを取り込み(※1)、シート(2)、(3)に重複があるデータを削除します(※2)。 シート(2):(1)から次工程にデータを送ったらこちらに移動(0~500行ほどあります) シート(3):(2)から次工程にデータを送ったらこちらに移動(5000行ほどあります) ※1は3秒ほどで完了するのですが、※2は1分近く時間を要しています。 もう少し短くならないかと思うのですが、いかがでしょうか。よろしくお願い致します。早ければ早いほどいいですが、10秒以内を目標にしています。 今は、csvファイルから全データをエクセルに取り込んでから(3秒ほど)、重複削除していますが、csvファイルから取り込むときに、重複データを取り込まないほうがいいのでしょうか。 現状、このような感じです。 Sub 重複削除() Dim i As Long Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ‘BA列にある重複チェックが2以上のとき、削除 For i = 5000 To 5 Step -1  If Worksheets("(1)").Cells(i, 53).Value > 1 Then Rows(i).Delete End If Next i ‘BA列に重複チェックを再設定 Application.Calculation = xlCalculationAutomatic Cells(5, 1).Select Range("BA5") = "IF(A5="""","""",COUNTIF($A$4:$A5,A5)+COUNTIF((2)!$A:$A,A5)+COUNTIF((3)!$A:$A,A5))" Range("BA5").Select Selection.Copy ‘関数を値へ変換 Range("BA6:BA2000").Select ActiveSheet.Paste Application.CutCopyMode = False ‘行幅を整える Rows("5:5").Select Range(Selection, Selection.End(xlDown)).Select Selection.RowHeight = 15.75 Range("A5").Select Application.ScreenUpdating = True '画面描画を静止 End Sub

  • 【Excel】リストボックスにデータを重複せず昇順に表示する方法

    教えてください。 ユーザーフォームにリストボックス(Listbox1)があり、日付が昇順で入力されるようになっています。 ただし、この日付データは重複が多いため重複されないよう表示しようと下記のコードを記述しましたが「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」と表示されてしまいます。 これを回避し、実行させるためにはどういう風に記述を修正したらよいでしょうか? ================================================================ Private Sub UserForm_Initialize() Dim i As Long For i = 2 To 2000 ListBox1.AddItem Worksheets("データ").Cells(i, 1) Dim myValue As Variant Dim myRng As Range, myCell As Range Set myRng = Worksheets("データ").Cells(i, 1).End(xlUp) myValue = myRng.Value Application.ScreenUpdating = False myRng.Sort Worksheets("データ").Cells(i, 1), xlAscending, Header:=xlYes With ListBox1 .Clear For Each myCell In myRng.Resize(myRng.Rows.Count - 1).Offset(1) _ .SpecialCells(xlCellTypeVisible) .AddItem myCell.Value Next .ListIndex = 0 End With Next i ListBox1.ListIndex = 0 End Sub ================================================================

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

専門家に質問してみよう