📊 AIとビジネス - Excel
ChatGPTでExcelチャート作成 - AIデータ可視化完全ガイド
数字だけ見ても分からない?AIがデータを一目で分かる素敵なチャートに変える方法を教えます。
データ重複整理
データ整理していると重複が本当に厄介ですよね。同じ顧客が何度も登録されていたり、似た会社名が違って入力されていたり... 一つ一つ目で探して消すには量が多すぎます。
しかも完全に同じ重複だけあるわけじゃありません。空白が違ったり、大文字小文字だけ違ったり、スペースが少し違う「類似重複」も多いです。こういうのはExcelの基本重複削除機能では見つけられません。
AIを活用すればこんな複雑な重複も簡単に見つけて整理できます。完全重複から類似重複、論理的重複まで全部検出できます。さらに類似度分析までして「80%以上似ていれば重複」という基準も適用できます。
この記事では、AIでデータの重複を見つけて整理する様々な方法を学びます。単純な重複削除から高度なファジーマッチングまで、実務ですぐ使える技法を見ていきましょう。
1. 重複タイプの把握
AIプロンプト
"次の状況別に重複を見つける方法を教えてください:
1. 完全に同一の行
2. 特定列だけ重複している場合
3. 似ているが少し違うデータ (例: 空白、大小文字)
4. 論理的重複 (同じ人の異なるメール)"
AI回答
1. 完全重複: すべての列の値が同一
→ 重複項目削除機能を使用
2. 部分重複: 主要キー値だけ確認
→ COUNTIFSで特定列基準カウント
3. 類似重複: 空白/大小文字の差
→ TRIM、UPPER関数で正規化後比較
4. 論理的重複: ビジネスルール基準
→ 複合条件で判別
2. 基本重複削除
Excel基本機能で重複削除
AIプロンプト:
"A1:E100範囲でメール(C列)基準で
重複を削除するVBAコードを作ってください。
最初の項目は維持して残りは削除してください。"
AI生成VBA:
Sub メール重複削除()
Dim ws As Worksheet
Dim lastRow As Long
Dim deleteCount As Long
Set ws = ThisWorkbook.Sheets("顧客データ")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 作業前確認
If MsgBox("重複したメールを持つ行を削除しますか?" & vbCrLf & _
"(最初の項目は維持されます)", _
vbYesNo + vbQuestion, "重複削除確認") = vbNo Then
Exit Sub
End If
' 画面更新停止 (速度向上)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' 重複削除実行
ws.Range("A1:E" & lastRow).RemoveDuplicates _
Columns:=3, _ ' C列(メール)基準
Header:=xlYes
' 削除された行数計算
deleteCount = lastRow - ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 画面更新再開
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox deleteCount & "個の重複項目が削除されました。", vbInformation
End Sub
3. 重複表示 (削除せずに)
条件付き書式で重複強調
AIプロンプト:
"重複した値を削除せず赤色で表示してください。
電話番号(D列)基準で2個以上現れる値を探してください。"
AI生成VBA:
Sub 重複表示_条件付き書式()
Dim ws As Worksheet
Dim lastRow As Long
Dim rng As Range
Set ws = ThisWorkbook.Sheets("顧客データ")
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
Set rng = ws.Range("D2:D" & lastRow)
' 既存条件付き書式削除
rng.FormatConditions.Delete
' 重複値強調条件追加
With rng.FormatConditions.Add( _
Type:=xlExpression, _
Formula1:="=COUNTIF($D$2:$D$" & lastRow & ",$D2)>1")
.Interior.Color = RGB(255, 199, 206) ' 薄い赤
.Font.Color = RGB(156, 0, 6) ' 濃い赤
.Font.Bold = True
End With
MsgBox "重複した電話番号が強調表示されました。", vbInformation
End Sub
重複回数表示
AIプロンプト:
"各行の隣にそのメールが何回現れるか表示してください。"
AI生成数式:
// F列に重複回数表示
=COUNTIF($C$2:$C$1000, C2)
// 重複有無だけ表示
=IF(COUNTIF($C$2:$C$1000, C2)>1, "重複", "")
// 何番目の重複か表示
=IF(COUNTIF($C$2:$C$1000, C2)>1,
COUNTIF($C$2:C2, C2) & "番目",
"唯一")
4. 高度な重複処理
複数列組み合わせで重複確認
AIプロンプト:
"名前(A列)と生年月日(B列)が同時に同じ場合だけ
重複と判断して表示してください。"
AI生成数式:
// ヘルパー列(E列)生成: 名前+生年月日結合
=A2&"|"&TEXT(B2,"YYYY-MM-DD")
// F列に重複有無表示
=IF(COUNTIF($E$2:$E$1000, E2)>1, "重複", "")
AI生成VBA (ヘルパー列なしで):
Sub 複合キー重複確認()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, j As Long
Dim dict As Object
Dim key As String
Dim dupCount As Long
Set ws = ThisWorkbook.Sheets("社員データ")
Set dict = CreateObject("Scripting.Dictionary")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
' 最初のパス: 重複探し
For i = 2 To lastRow
key = ws.Cells(i, 1).Value & "|" & _
Format(ws.Cells(i, 2).Value, "YYYY-MM-DD")
If dict.Exists(key) Then
dict(key) = dict(key) + 1
Else
dict.Add key, 1
End If
Next i
' 2番目のパス: 重複表示
For i = 2 To lastRow
key = ws.Cells(i, 1).Value & "|" & _
Format(ws.Cells(i, 2).Value, "YYYY-MM-DD")
If dict(key) > 1 Then
ws.Cells(i, 6).Value = "重複 (" & dict(key) & "件)"
ws.Rows(i).Interior.Color = RGB(255, 235, 156)
dupCount = dupCount + 1
Else
ws.Cells(i, 6).Value = ""
ws.Rows(i).Interior.ColorIndex = xlNone
End If
Next i
Application.ScreenUpdating = True
MsgBox dupCount & "個の重複項目が発見されました。", vbInformation
End Sub
5. 類似重複探し
空白/大小文字無視
AIプロンプト:
"会社名に空白と大小文字の違いだけある重複を探してください。
例: 'Samsung', 'SAMSUNG', ' Samsung 'はすべて同じものとして処理"
AI生成VBA:
Sub 類似重複探し()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim normalizedDict As Object
Dim originalValue As String
Dim normalizedValue As String
Set ws = ThisWorkbook.Sheets("会社リスト")
Set normalizedDict = CreateObject("Scripting.Dictionary")
normalizedDict.CompareMode = vbTextCompare ' 大小文字無視
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' E列にヘッダー追加
ws.Cells(1, 5).Value = "正規化された値"
ws.Cells(1, 6).Value = "重複状態"
For i = 2 To lastRow
originalValue = ws.Cells(i, 1).Value
' 正規化: 空白削除 + 大文字変換
normalizedValue = UCase(Trim(Replace(originalValue, " ", "")))
ws.Cells(i, 5).Value = normalizedValue
' 重複確認
If normalizedDict.Exists(normalizedValue) Then
ws.Cells(i, 6).Value = "重複 (原本: " & _
normalizedDict(normalizedValue) & ")"
ws.Rows(i).Interior.Color = RGB(255, 199, 206)
Else
normalizedDict.Add normalizedValue, originalValue
ws.Cells(i, 6).Value = "最初"
End If
Next i
MsgBox "類似重複検査が完了しました。", vbInformation
End Sub
ファジーマッチング (類似度ベース)
AIプロンプト:
"レーベンシュタイン距離を使って
80%以上類似した会社名を探してください。"
AI生成VBA:
' レーベンシュタイン距離関数
Function LevenshteinDistance(str1 As String, str2 As String) As Integer
Dim i As Integer, j As Integer
Dim cost As Integer
Dim d() As Integer
Dim min1 As Integer, min2 As Integer, min3 As Integer
ReDim d(Len(str1), Len(str2))
For i = 0 To Len(str1)
d(i, 0) = i
Next
For j = 0 To Len(str2)
d(0, j) = j
Next
For i = 1 To Len(str1)
For j = 1 To Len(str2)
If Mid(str1, i, 1) = Mid(str2, j, 1) Then
cost = 0
Else
cost = 1
End If
min1 = d(i - 1, j) + 1
min2 = d(i, j - 1) + 1
min3 = d(i - 1, j - 1) + cost
d(i, j) = WorksheetFunction.Min(min1, min2, min3)
Next
Next
LevenshteinDistance = d(Len(str1), Len(str2))
End Function
' 類似度計算 (0~100%)
Function SimilarityPercent(str1 As String, str2 As String) As Double
Dim maxLen As Integer
Dim distance As Integer
maxLen = WorksheetFunction.Max(Len(str1), Len(str2))
If maxLen = 0 Then
SimilarityPercent = 100
Exit Function
End If
distance = LevenshteinDistance(str1, str2)
SimilarityPercent = (1 - distance / maxLen) * 100
End Function
Sub 類似会社名探し()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, j As Long
Dim similarity As Double
Dim threshold As Double
Set ws = ThisWorkbook.Sheets("会社リスト")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
threshold = 80 ' 類似度閾値80%
' 結果シート生成
On Error Resume Next
Application.DisplayAlerts = False
Sheets("類似項目").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Dim resultWs As Worksheet
Set resultWs = Sheets.Add(After:=ws)
resultWs.Name = "類似項目"
resultWs.Cells(1, 1).Value = "項目1"
resultWs.Cells(1, 2).Value = "項目2"
resultWs.Cells(1, 3).Value = "類似度(%)"
Dim resultRow As Long
resultRow = 2
Application.ScreenUpdating = False
' すべてのペアを比較
For i = 2 To lastRow - 1
For j = i + 1 To lastRow
similarity = SimilarityPercent( _
ws.Cells(i, 1).Value, _
ws.Cells(j, 1).Value)
If similarity >= threshold Then
resultWs.Cells(resultRow, 1).Value = ws.Cells(i, 1).Value
resultWs.Cells(resultRow, 2).Value = ws.Cells(j, 1).Value
resultWs.Cells(resultRow, 3).Value = Round(similarity, 2)
resultRow = resultRow + 1
End If
Next j
' 進捗状況表示
If i Mod 10 = 0 Then
Application.StatusBar = "処理中... " & _
Format(i / lastRow, "0%")
End If
Next i
Application.StatusBar = False
Application.ScreenUpdating = True
MsgBox (resultRow - 2) & "個の類似項目が発見されました。", vbInformation
End Sub
まとめ
AIでデータ重複整理:
- ✅ 多様なタイプの重複検出
- ✅ 類似度ベースのファジーマッチング
- ✅ 重複の統合と集約
- ✅ データ品質レポート
次の記事では、IF文とVLOOKUPを自動で作成する方法を学びます。