![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
こんばんは。
EXCEL VBAで重複するデータを抜き出し、カウントする方法をご教示ください。
(sheet1からsheet2へ)
sheet1
a b
NO 氏名
1 田中
2 鈴木
3 松尾
1 田中
4 池田
5 松尾
2 鈴木
(sheet1にはこの他にもたくさんデータが入っています。2万行ぐらい(変動有)))
sheet2
NO 氏名 回数
1 田中 2
2 鈴木 2
3 松尾 2
4 池田 1
5 松尾 1
NO順で氏名出現回数をカウントしたい。(NOと氏名は連動)
dictionaryを使えば、いいと思うのですがうまくできません。
ご教示よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
こんにちは!
一例です。
標準モジュールにしてください。
Sub Sample1()
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:C").ClearContents
With Worksheets("Sheet1")
wS.Range("A1:B1").Value = .Range("A1:B1").Value
wS.Range("C1") = "回数"
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(2, "A"), .Cells(lastRow, "B"))
For i = 1 To UBound(myR, 1)
myStr = myR(i, 1) & "_" & myR(i, 2)
If Not myDic.exists(myStr) Then
myDic.Add myStr, 1
Else
myDic(myStr) = myDic(myStr) + 1
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
myR = Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "C"))
For i = 0 To UBound(myKey)
myAry = Split(myKey(i), "_")
myR(i + 1, 1) = myAry(0)
myR(i + 1, 2) = myAry(1)
myR(i + 1, 3) = myItem(i)
Next i
Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "C")) = myR
wS.Range("A1").CurrentRegion.Sort key1:=wS.Range("A1"), order1:=xlAscending, Header:=xlYes
Set myDic = Nothing
wS.Activate
MsgBox "完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
No.7
- 回答日時:
うちのは古いので参考にならないかもですが。
Sub megu()
Dim myLst As Object
Dim r As Range, i As Long, v
Set myLst = CreateObject("System.Collections.SortedList")
With Worksheets("Sheet1")
For Each r In .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
If Not myLst.Contains(r.Value) Then myLst.Add r.Value, Array(r.Value, r.Offset(, 1).Value, 0)
v = myLst.GetByIndex(myLst.IndexOfKey(r.Value))
v(2) = v(2) + 1
myLst.Item(r.Value) = v
Next
End With
With Worksheets("Sheet2")
.Cells.ClearContents
.Range("A1:C1").Value = Array("NO", "名前", "回数")
For i = 0 To myLst.Count - 1
.Range("A2").Offset(i).Resize(, 3).Value = myLst.GetByIndex(i)
Next
End With
Set myLst = Nothing
End Sub
No.6
- 回答日時:
以下でどうなりますか
元データを3列分読み込んで、上に詰め直しながら3列目に出現数を・・・
結果は、詰め直した分を書き出すだけ
Option Explicit
Public Sub Samp1()
Dim dic As Object
Dim vA As Variant
Dim sS As String
Dim i As Long, k As Long, n As Long
Set dic = CreateObject("Scripting.Dictionary")
With Worksheets("Sheet1")
With .Range("A1", .Cells(Rows.Count, "A").End(xlUp))
vA = .Resize(, 3).Value
End With
End With
n = 1
vA(n, 3) = "回数"
For i = 2 To UBound(vA)
sS = vA(i, 1) & vbTab & vA(i, 2)
k = dic(sS)
If (k = 0) Then
n = n + 1
dic(sS) = n
vA(n, 1) = vA(i, 1)
vA(n, 2) = vA(i, 2)
vA(n, 3) = 1
Else
vA(k, 3) = vA(k, 3) + 1
End If
Next
Application.ScreenUpdating = False
With Worksheets("Sheet2")
With .Range("A1").Resize(n, 3)
.EntireColumn.ClearContents
.Value = vA
.Sort .Cells(1), xlAscending, Header:=xlYes
End With
End With
Application.ScreenUpdating = True
Set dic = Nothing
End Sub
No.5
- 回答日時:
行の重複をカウントするだけでしたら、基本的にはVBAを使わなくてもピボットテーブルでもできます。
Sheet2に、「Sheet1をソースにしたピボット」を作り、以下のようなフィールド構成にします。
・行ラベル:「NO」「氏名」
・値:氏名(計算方法は「個数」)
バカみたいなダサいプログラムですみませんが、そのようなピボットを作成するサンプルプログラムを、いちおう、ご紹介いたします。
(※注!!! データがどうなってしまうか分かりませんので、必ずバックアップをいくつか作ってから、そのバックアップのほうでテストしてみてください。また、Sheet1の1行目がすべて列名となっていて、空白行や空白列が無いことが前提です。A1セルに表の名前などが入っていてその右が空白セルドだと誤作動します。)
・以下のプログラムをVBEの標準モジュールにコピペしたのち、
・ピボットを作りたい空白のシートをアクティブにしてから、
・「PivotMake02()」のほうだけを実行してみてください。
Sheet1のデータの列が増えても行が増えても可変の、再設定は何もしなくていいピボットが、現在アクティブなシートに作成されます(・・・るはずです・・・^^。動かなかったら本当にごめんなさい。なお、行と列を可変にしてピボットを作る処理は関数化?というんでしょうか?してあります。)
===================
Sub PivotMake02()
Dim o_Pvt01 As PivotTable
'現在のシートにピボットテーブルの作成
Call Off2010MakePvt0022("Sheet1", "testTblRng02", ActiveSheet.Name, "A3", "test01Pivot")
'できたピボットを選択
Set o_Pvt01 = ActiveSheet.PivotTables("test01Pivot")
'値を"氏名"の個数で。(勝手に個数になるみたい)
o_Pvt01.AddDataField o_Pvt01.PivotFields("氏名")
'行ラベルを"NO"と"氏名"に設定。
o_Pvt01.AddFields RowFields:=Array("NO", "氏名")
'小計フィールドの非表示設定
o_Pvt01.PivotFields("NO").Subtotals(1) = False
End Sub
'##################################################################################
'Office2010形式で、ピボットソースの列と行の増加を可変にして、
'古い形式のピボットを作る関数
'
'「s_SrcTblShtNm」:ピボットのソースにしたい表(テーブル)が在るシートの名前
'「s_AddSrcRngNm」:その表を、名前定義機能で名前をつけるときの、そのセル範囲の名前
'「s_PvtTgtShtNm01」:ピボットを作成したいシートの名前
'「s_PvtTgtCelAdrr01」:そのシートの、ピボットを出力したい起点となるセルのアドレス。
' (ピボットの上の2行分はページ切り替え用の領域になるので2行分はあけておく。
' なのでこの値は「A3」が一般的。でも「D5」でも「F10」でもどこでもOKです。)
'「s_PvtTbleNm01」:ピボットテーブルそのものに付けたい名前
'
'##################################################################################
Function Off2010MakePvt0022(s_SrcTblShtNm As String, _
s_AddSrcRngNm As String, _
s_PvtTgtShtNm01 As String, _
s_PvtTgtCelAdrr01 As String, _
s_PvtTbleNm01 As String)
Dim ObjCache As PivotCache
Dim ObjTable As PivotTable
Dim StrActvShtName As String
Dim CurrentShtNm01 As String
Dim PvtOutputShtName01 As String
CurrentShtNm01 = ActiveSheet.Name
'現在のシート(アクティブなシート)の行と列が増えても
'ピボットの再設定をしなくても済むようにする処置
'「=OFFSET($A$1,0,0,COUNTA($A:$A),COUNTA($1:$1))」にて
'名前の定義の操作をして、ソースとなる表に「pvtsrc01」という名前を付けます。
' ActiveWorkbook.Names.Add Name:="pvtsrc01", RefersToR1C1:= _
' "=OFFSET(データセット1!R1C1,0,0,COUNTA(データセット1!C1),COUNTA(データセット1!R1))"
' StrActvShtName = ActiveSheet.Name
ActiveWorkbook.Names.Add Name:=s_AddSrcRngNm, RefersToR1C1:= _
"=OFFSET(" & s_SrcTblShtNm & "!R1C1,0,0,COUNTA(" & s_SrcTblShtNm & "!C1),COUNTA(" & s_SrcTblShtNm & "!R1))"
ActiveWorkbook.Names(s_AddSrcRngNm).Comment = ""
'ピボットキャッシュの作成(名前の定義をした「pvtsrc01」をソースにして。)
' Set ObjCache = ActiveWorkbook.PivotCaches.Create _
' (SourceType:=xlDatabase, SourceData:=Range("A1").CurrentRegion)
Set ObjCache = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=s_AddSrcRngNm)
'ピボット作りたいシートの指定。(既存か新規かの設定)
If CurrentShtNm01 = s_PvtTgtShtNm01 Then
'既存のシートへ作りたいなら、そのままそこを指定。
PvtOutputShtName01 = CurrentShtNm01
Else
'新しいシートへ作りたいなら、新規シートを作ってからそこを指定。
Worksheets.Add '新しいシートの作成
ActiveSheet.Name = s_PvtTgtShtNm01 'そのシートの名前を「Pvt01」にする
PvtOutputShtName01 = ActiveSheet.Name
End If
' '新しいシートへの空のピボットテーブルの作成
' Set ObjTable = ObjCache.CreatePivotTable _
' (TableDestination:=Worksheets("Pvt01").Range("A3"), TableName:="test01Pivot")
'新しいシートへの空のピボットテーブルの作成
Set ObjTable = ObjCache.CreatePivotTable _
(TableDestination:=Worksheets(PvtOutputShtName01).Range(s_PvtTgtCelAdrr01), TableName:=s_PvtTbleNm01)
'古いタイプのピボットの表示・操作性への切り替え
'(古いタイプでなくても良ければここは5行全部をコメントアウトします)
Worksheets(s_PvtTgtShtNm01).Range(s_PvtTgtCelAdrr01).Select '新しく作ったピボットの任意のセルを選択
With ActiveSheet.PivotTables(s_PvtTbleNm01)
.HasAutoFormat = False
.InGridDropZones = True
.RowAxisLayout xlTabularRow
End With
End Function
![「EXCEL VBA で重複するデータを抜」の回答画像5](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/6/542861431_5ccbce11f0200/M.png)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- その他(データベース) 20万行あるデータを動かしたい 2 2023/06/13 15:21
- Excel(エクセル) Excelでの複数条件のカウントについて 1 2022/09/25 07:40
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- Excel(エクセル) (教えて下さい)ExcelのSUMIF又はSUMIFSを使って合計値の算出 4 2023/07/24 11:23
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
配列の重複する値とその個数を取得したい
Visual Basic(VBA)
-
VBAで重複データを合算したい
Excel(エクセル)
-
-
4
VBAで重複する項目を1つにまとめて金額を合計したい
Excel(エクセル)
-
5
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
6
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
7
特定の複数のシートに同じ処理をさせたい
Excel(エクセル)
-
8
[EXCEL]列の項目を何種類かカウントする方法
Excel(エクセル)
-
9
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
10
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
11
Excelで2つのデータの突合せをしたいです
Excel(エクセル)
-
12
エクセル 重複したデータを別シートに抽出させる
Excel(エクセル)
-
13
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
14
VBAで列の比較をする
Visual Basic(VBA)
-
15
【エクセル】一列中にある文字列の種類をカウントする関数
Excel(エクセル)
-
16
Excelのマクロでソートがうまく動かない
Excel(エクセル)
-
17
Excel データの種類が何種類あるか数えるには…
Excel(エクセル)
-
18
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
19
VBA 半角スペースを入れるには...
その他(Microsoft Office)
-
20
EXCELのVBAでRange(A1:C4")を変数にする方法を教え"
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記マクロでMsgBox "空白です...
-
在庫管理表に使うエクセルの関...
-
エクセルでバーコード作成し使...
-
【マクロ】for next構文について
-
ユーザー定義関数をアドイン登...
-
職場の人から聞かれており、こ...
-
PDFの請求明細をエクセルにしたい
-
エクセルで表
-
Excel関数-文字列で自動作成さ...
-
Microsoft Officeの中古は信用...
-
Excelデータをコピペして、ペー...
-
Excelで50個のセルに同じ文字を...
-
エクセルで会社の従業員のデー...
-
エクセルの関数について教えて...
-
エクセルの表で1年間の曜日を...
-
スプレッドシート、Excelでの数...
-
Excelで、項目の種類ごとにカウ...
-
「問題が発生しました」ですと?
-
LOOKUP関数を使えばいいのでし...
-
Excel:一部のフォントでセルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA、別ブックへ転記す...
-
エクセルでの作業計算方法について
-
時間によってファイル名が変わ...
-
【関数】適切な文字数の数字を...
-
Excelについて教えてください
-
エクセル初心者です 関数の入れ...
-
【マクロ】ファイル名の変更に...
-
UNIQUE関数が使えないバージョ...
-
エクセルの計算
-
【関数】先頭だけにある、半角...
-
Excelで、決まった行を繰り返し...
-
Excelでセルの値が同じか...
-
LOOKUP関数を使えばいいのでし...
-
Excel
-
はがきについて。
-
エクセルの条件付き書式につい...
-
エクセルのデーターが2か月前の...
-
エクセル②
-
エクセルで「-0.0」と表示さ...
-
Microsoft1Officeの互換ソフト...
おすすめ情報