こんにちは!今回はExcelのVBAを使って、あらかじめ用意したワードリストに存在するデータの種類を自動でカウントと分類する方法をご紹介します。データ数が少ないうちは構いませんが、膨大になればなるほど手間や間違いが起こるので、是非このコードを使って正確に自動化していきましょう。用途としては、業務データの整理や報告書の作成、データベースの管理、プロジェクト管理、リストのメンテナンスなどが考えられます。これにより、手作業では見逃しがちな重複や誤りを防ぎ、データ管理の精度と効率を大幅に向上させることができます。
使用するワードリスト
まず使用するワードリストについて解説します。
ワードリストは「データリスト」のワークシート上に、「№」「品番」「工程」という構成となっており、今回はデータを1000行分作成しました。

VBAの実行結果
VBAを実行した結果下図のような結果を得る事が出来ます。列ごとに4行目に種類の数を入力し、その下に具体的な項目名を並べております。

コード解説★★★(コピーはここ)★★★
Sub Sample07()
Dim Grade As New Collection, Process As New Collection
Dim C_N As Long, LastRow As Long
Dim wsSource As Worksheet, wsResult As Worksheet
Dim GradeResultCell As String, ProcessResultCell As String
' ワークシートの設定
Set wsSource = Worksheets("データリスト")
Set wsResult = Worksheets("結果")
' 結果を入力するセルの設定
GradeResultCell = "C4"
ProcessResultCell = "D4"
' 最終行を取得(データがある行まで動的に取得)
LastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
' コレクションにデータを追加(重複を防ぐ)
On Error Resume Next
For C_N = 2 To LastRow
If wsSource.Cells(C_N, 2).Value <> "" Then
Grade.Add wsSource.Cells(C_N, 2).Value, CStr(wsSource.Cells(C_N, 2).Value)
End If
If wsSource.Cells(C_N, 3).Value <> "" Then
Process.Add wsSource.Cells(C_N, 3).Value, CStr(wsSource.Cells(C_N, 3).Value)
End If
Next C_N
On Error GoTo 0
' グレードの種類数を結果シートに入力
wsResult.Range(GradeResultCell).Value = Grade.Count
' 工程の種類数を結果シートに入力
wsResult.Range(ProcessResultCell).Value = Process.Count
' グレードを結果シートに出力
For C_N = 1 To Grade.Count
wsResult.Cells(C_N + 4, wsResult.Range(GradeResultCell).Column).Value = Grade(C_N)
Next C_N
' 工程を結果シートに出力
For C_N = 1 To Process.Count
wsResult.Cells(C_N + 4, wsResult.Range(ProcessResultCell).Column).Value = Process(C_N)
Next C_N
End Sub
解説
変数の宣言
Sub Sample07()
Dim Grade As New Collection, Process As New Collection
Dim C_N As Long, LastRow As Long
Dim wsSource As Worksheet, wsResult As Worksheet
Dim GradeResultCell As String, ProcessResultCell As String
ここでは使用する変数やコレクションを宣言しています。
設定
' ワークシートの設定
Set wsSource = Worksheets("データリスト")
Set wsResult = Worksheets("結果")
' 結果を入力するセルの設定
GradeResultCell = "C4"
ProcessResultCell = "D4"
ここではそれぞれのワークシート名を変数に入力し、データ種類の結果を返すセルを変数へ入力する。
データ数を確認
' 最終行を取得(データがある行まで動的に取得)
LastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
ここではデータリストのA列最終行を確認し変数へ入力する。
データの種類を確認
' コレクションにデータを追加(重複を防ぐ)
On Error Resume Next
For C_N = 2 To LastRow
If wsSource.Cells(C_N, 2).Value <> "" Then
Grade.Add wsSource.Cells(C_N, 2).Value, CStr(wsSource.Cells(C_N, 2).Value)
End If
If wsSource.Cells(C_N, 3).Value <> "" Then
Process.Add wsSource.Cells(C_N, 3).Value, CStr(wsSource.Cells(C_N, 3).Value)
End If
Next C_N
On Error GoTo 0
ここでは重複を排除するためにワードをコレクションに格納していきます。その際にエラー発生時にはスキップする処理などを定義しています。このコードでは2列分を定義してありますが、列数の増加に合わせて繰り返し処理を追加して動的に対応できるようにするのもいいかもしれませんね。
データの格納
' グレードの種類数を結果シートに入力
wsResult.Range(GradeResultCell).Value = Grade.Count
' 工程の種類数を結果シートに入力
wsResult.Range(ProcessResultCell).Value = Process.Count
' グレードを結果シートに出力
For C_N = 1 To Grade.Count
wsResult.Cells(C_N + 4, wsResult.Range(GradeResultCell).Column).Value = Grade(C_N)
Next C_N
' 工程を結果シートに出力
For C_N = 1 To Process.Count
wsResult.Cells(C_N + 4, wsResult.Range(ProcessResultCell).Column).Value = Process(C_N)
Next C_N
End Sub
ここでは結果をセルに入力しています。データ種類の数やデータ項目をリストとしています。
使用している技術
基本:FOR-NEXT、Collection、Add
まとめ
このVBAコードを活用することで、Excel内のデータリストに含まれるデータの種類を自動でカウントし、分類する作業が大幅に効率化されます。手作業では見逃しがちな重複や誤りを防ぎ、正確なデータ管理が可能となるため、データ数が多くなるほどその効果は大きくなります。VBAの基本機能を駆使し、コレクションオブジェクトやループ処理を利用することで、複雑なデータ処理を簡単に実現できます。是非このコードを活用して、データ管理の精度を向上させてください。



コメント