- ベストアンサー
VBAでリストのフィルタリングと重複カウントをする方法について
- VBA初心者の方が、Sheet1にリストを配置し、Sheet2のフィルタ条件を使って重複を1件としてカウントしたいという質問です。
- 現在作成中のコードでは、重複を1件としてカウントせず全件の件数が出力されるとのことです。
- 解決方法として、COUNTIF関数を使い重複をカウントする際に条件を指定することで、重複分を1件としてカウントすることができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>できれば文字列で教えていただけるとたいへん助かります。 以下です。 Sub RecCounter() Dim SQL As String Dim cn As Object Dim rs As Object Dim MyCnt As Long Dim MyKey As String '検索キーを取得 With ThisWorkbook.Sheets("Sheet2") MyKey = .Cells(3, 3).Value End With 'SQL全文を組み立て、実行 SQL = "SELECT count(列名3) as RecCnt" & vbCrLf SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf SQL = SQL & "Where 列名10 = " & "'" & MyKey & "'" & vbCrLf SQL = SQL & "GROUP BY 列名3" & vbCrLf Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1" cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name rs.Open SQL, cn 'レコード数を数える MyCnt = 0 If Not rs.EOF Or Not rs.Bof Then rs.MoveFirst Do If rs.EOF = True Then Exit Do MyCnt = MyCnt + 1 rs.MoveNext Loop End If '数えたレコード数を出力 With ThisWorkbook.Sheets("Sheet2") .Cells(3, 5).Value = MyCnt & "件" End With '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub
その他の回答 (2)
- HohoPapa
- ベストアンサー率65% (455/693)
添付画像のように、J列の値たちが数値なら 後記のコードはいかがでしょうか。 SQLの知識も必要なので若干ハードルが上がりますが 身に着ければ大きな武器になるはずです。 もし、J列の値たちが文字列なら指摘してください。 コードを修正してポストします。 ご自身で作ったコードをポストして質問するのはとってもいいことと思いますが 合わせて、サンプルシートと具体的にどのような集計をしたいのかを 説明するとよりコメントが得やすいと思います。 Sub RecCounter() Dim SQL As String Dim cn As Object Dim rs As Object Dim MyCnt As Long Dim MyKey As Long '検索キーを取得 With ThisWorkbook.Sheets("Sheet2") MyKey = .Cells(3, 3).Value End With 'SQL全文を組み立て、実行 SQL = "SELECT count(列名3) as RecCnt" & vbCrLf SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf SQL = SQL & "Where 列名10 = " & MyKey & vbCrLf SQL = SQL & "GROUP BY 列名3" & vbCrLf Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1" cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name rs.Open SQL, cn 'レコード数を数える MyCnt = 0 If Not rs.EOF Or Not rs.Bof Then rs.MoveFirst Do If rs.EOF = True Then Exit Do MyCnt = MyCnt + 1 rs.MoveNext Loop End If '数えたレコード数を出力 With ThisWorkbook.Sheets("Sheet2") .Cells(3, 5).Value = MyCnt & "件" End With '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub
お礼
丁寧にありがとうございます。 なんかやりたいことにぐっと近づいた気がします。 できれば文字列で教えていただけるとたいへん助かります。 サンプル画像つければいいんですね。 慌てていて思いつかなかったです(泣) でも、貼り付けていただいたものみたいな感じです。
- imogasi
- ベストアンサー率27% (4737/17069)
例データ A1:A10 データ 特徴=文字列 数値だと後半のSUBTOTALの引数が変わる。 a s d a s f g a a ーー 標準モジュールに Sub test01() ActiveSheet.Range(Cells(1, 1), Cells(10, 1)).AdvancedFilter _ Action:=xlFilterInPlace, Unique:=True End Sub を実行。 ーー 結果 見てくれのままー>行はとびとびになっている データ a s d f g ーー 同じく標準モジュールに Sub test02() x = Application.WorksheetFunction.Subtotal(103, Range("A2:A10")) MsgBox x End Sub で5が返る。Xはセルの値に代入するとか、お好みで。 VBAの中だが、関数を使うのがコード行数が少なくなるので、使った。 ーー 関数でのやり方もふくめ 参考 https://office-hack.com/excel/duplicate-data/ https://vbabeginner.net/check-number-excluding-duplicates/ ーー VBAでも 同じ値は1つとカウントしたい場合 配列を2つ使った二重ループの方法 Dictionaryを使う方法 COUNTIF関数での方法 などある。 初心者のVBAの勉強項目としては、特殊な個所。 もっとほかに大切で、勉強することが多くある、と思う。
お礼
教えていただきありがとうございました。 どうしても必要だったのでやってみた次第ですが、私にはまだ早いということなのですね。 いろいろ他を勉強してからまたチャレンジしてみます。
お礼
お言葉に甘えてしまいましたが、大変勉強になりました。 がんばってやってみますね。 本当にありがとうございました!