こんばんは。
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
お探しの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も見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
ちょっと先の未来クイズ第6問
2025年1月2日と1月3日に行われる、第101回箱根駅伝(東京箱根間往復大学駅伝競走)で、上位3位に入賞するチームはどこでしょう?
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAで重複データを合算したい
Excel(エクセル)
-
VBA:セルの空白を検索
Excel(エクセル)
-
VBAで繰り返しコピーしながら下へ移動させる方法
Excel(エクセル)
-
-
4
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
5
VBAで重複する項目を1つにまとめて金額を合計したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelの条件付き書式のコピーと...
-
【マクロ】重複する同じ行を、...
-
vba 印刷設定でのカラー印刷と...
-
Excel について教えてください。
-
至急お願いいたします 屋上の備...
-
エクセルで、数字ではない値(...
-
【Excel】 1つのセルの日にちを...
-
Excelの開始ブックを固定したい...
-
ファイル名の変更
-
エクセルを使ってQRコードを作...
-
エクセルでセルに入力する前は...
-
エクセルで、数字の下4桁の0を...
-
カーソルを合わせてる時のみ行...
-
Excelで項目の種類ごとに番号を...
-
標準、数値、文字列・・・VLOOK...
-
=INDIRECT(RIGHT(CELL("filenam...
-
関数を教えて下さい
-
1.5ヶ月分の費用按分 エクセル関数
-
【マクロ】メッセージボックス...
-
大容量があつかえるソフトを探...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、数字ではない値(...
-
Excel いい方法教えてください。
-
納期順に勝手に並べ替えられる...
-
エクセルで作成した書類の印刷...
-
Excel初心者です、Excelの日付...
-
エクセルで作った表が印刷する...
-
実務の処理について。
-
AM8:30から翌朝8:30まで勤務す...
-
Excelのデータの入力規則の問題...
-
Excelの罫線を消す方法
-
桁をセルで区切って計算をした...
-
スプレッドシート(Excelでも良...
-
VLOOKUP関数で複数条件を設定に...
-
Excel初心者です。 Excelでやり...
-
エクセルでAのセルに「家電」と...
-
ファイルとフォルダの移動につ...
-
XMLHTTP60で前日のデータが取れ...
-
ファイルパスについて。
-
エクセルの数式について教えて...
-
スプレッドシートで適切な条件...
おすすめ情報