質問

エクセルでセル内の重複する文字列を削除する方法を教えてください。


例えばA1のセルに次のような文字列があります

斎藤(18)
武田(21)
稲葉(41)
田中(3)
斎藤(18)
金子(8)
田中(3)

この中で重複している文字列(斎藤(18)田中(3))を削除し、以下のようにしたいと思います。

斎藤(18)
武田(21)
稲葉(41)
田中(3)
金子(8)

区切り位置にはカンマやスペースは入ってません。
(改行コードは入ってます)
わかる方おられましたら教えていただけますと幸いです。

よろしくお願いいたします。

通報する

回答 (7件)

A1セル以下、A列にデータがあるとして、変換結果をB列に書き出します。
連想配列のキーの配列をまとめるのに、Joinが使ってみたかっただけです。
重複チェックするデータ数が今回程度では、速度上のメリットもないかもしれませんが、ご参考まで。
Sub test()
Dim myCell As Range, targetRange As Range
Dim buf As Variant
Dim i As Long
Dim myDic As Object

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ActiveSheet
Set targetRange = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp))
End With
Set myDic = CreateObject("Scripting.Dictionary")
For Each myCell In targetRange.Cells
buf = Split(myCell.Value, vbLf)
For i = LBound(buf) To UBound(buf)
If Not myDic.Exists(buf(i)) Then myDic.Add buf(i), ""
Next i
myCell.Offset(0, 1).Value = Join(myDic.keys, vbLf)
myDic.RemoveAll
Next myCell
Set myDic = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

この回答へのお礼

できました!
ありがとうございます!

No.5です。
>実は同じようなセルが300行以上あるんです。。。
ということなので、もう一度コードを載せてみます。

A列データは1行目からあるとします。
前回同様B列を作業用の列として使用していますので、B列は何もない!ということだとして・・・


Sub test2() 'この行から
Dim i, k As Long
Dim str As String
Dim myArray As Variant
Application.ScreenUpdating = False
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
myArray = Split(Cells(i, 1), vbLf)
For k = 0 To UBound(myArray)
Cells(k + 1, 2) = myArray(k)
Next k
For k = Cells(Rows.Count, 2).End(xlUp).Row To 2 Step -1
If WorksheetFunction.CountIf(Columns(2), Cells(k, 2)) > 1 Then
Cells(k, 2).Delete (xlUp)
End If
Next k
For k = 1 To Cells(Rows.Count, 2).End(xlUp).Row
str = str & Cells(k, 2) & vbCrLf
Next k
Cells(i, 1) = Left(str, Len(str) - 1)
str = ""
Columns(2).Clear
Next i
Application.ScreenUpdating = True
End Sub 'この行まで

※ 操作方法は前回同様です。
こんな感じではどうでしょうか?m(_ _)m

この回答へのお礼

新しい方法をお教えくださりありがとうございます!
ただ、こちらのエクセル知識が乏しいので、A1セルじゃない時にどこをいじればいいのかがわからなくなってしまいました。。。
せっかく教えていただいたのに使いこなせなくて申し訳ありません。

こんにちは!
VBAでの一例です。
B列を作業用の列で使用していますので、B列にデータはない!という前提です。

画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub test() 'この行から
Dim k As Long
Dim str As String
Dim myArray As Variant
myArray = Split(Cells(1, 1), vbLf)
Application.ScreenUpdating = False
For k = 0 To UBound(myArray)
Cells(k + 1, 2) = myArray(k)
Next k
For k = Cells(Rows.Count, 2).End(xlUp).Row To 1 Step -1
If WorksheetFunction.CountIf(Range(Cells(1, 2), Cells(k, 2)), Cells(k, 2)) > 1 Then
Cells(k, 2).Delete (xlUp)
End If
Next k
For k = 1 To Cells(Rows.Count, 2).End(xlUp).Row
str = str & Cells(k, 2) & vbCrLf
Next k
Cells(1, 1) = Left(str, Len(str) - 1)
Columns(2).ClearContents
Application.ScreenUpdating = True
End Sub 'この行まで

※ 一旦マクロを実行すると元に戻せませんので、
別Sheetでマクロを試してみてください。m(_ _)m

この回答へのお礼

ご回答ありがとうございます。
実は同じようなセルが300行以上あるんです。。。
こういう場合はマクロの方がいいかもしれませんね。

step1)
A1セルを選ぶ
データメニュー(データタブ)から「区切り位置」を開始する
「カンマやタブで区切られた…」で次へ行き
区切り文字として「その他」にチェックを入れ,その右隣のボックスの中でCtrl+j(コントロールキーを押しながらJのキーを押す)を記入し
完了するとA1からG1に展開される。


step2)
A2に
=IF(MATCH(A1,1:1,0)=COLUMN(A1),A1&CHAR(10),"")&B2
と記入し,G2までコピー貼り付ける


step3)
A2をコピーし,形式を選んで貼り付けで値のみ貼り付けて値化する。

この回答へのお礼

ご回答ありがとうございます。
同じようなセルが300行以上あるのですが、その場合もこの方法は有効でしょうか。

[No.2]の誤謬訂正

> 4.セル C3、B4 に式 =B3、=C3&CHAR(10)&B4 をそれぞれ入力。
> 5.セル B3 を下方にズズーッとドラッグ&ペースト。

を次のように訂正します。失礼しましたm(__)m

 4.セル C3、C4 に式 =B3、=C3&CHAR(10)&B4 をそれぞれ入力。
 5.セル C4 を下方にズズーッとドラッグ&ペースト。

「セル内の重複する文字列を削除」でなく、(添付図の範囲 A3:A9 から範囲 B3:B7 を得るような)「列内の重複する文字列を削除」ならお出来になるとしてハナシを進めます。(Excel 2002 で試しました)

1.[データ]→[区切り位置]の機能で、セル A1 の内容を分解して範囲 A2:G2 を得る。
2.[形式を選択して貼り付け]の“行列を入れ替える”機能で、範囲 A3:A9 を得る。
3.列内の重複する文字列を削除」して、範囲 B3:B7 を得る。
4.セル C3、B4 に式 =B3、=C3&CHAR(10)&B4 をそれぞれ入力。
5.セル B3 を下方にズズーッとドラッグ&ペースト。
6.セル C7 を[コピー]して、それをセル B1 に[値の貼り付け]。
ちなみに、範囲 A1:B1 は“折り返して全体を表示する”に書式設定しています。

この回答へのお礼

画像までつけてくださりありがとうございました!
期待した成果は得られましたが、実は同じようなセルが300行以上あるんです。。。

Excel 2003では
▼操作方法:重複データを削除する
(A1セルにフィールド見出し、A2:A10セルに9個のデータが入力されているときに、重複データを削除した新たなリストをC列に作成する例)

メニュー[データ]-[フィルタ]-[フィルタオプションの設定]をクリック
 ↓
[フィルタオプションの設定]ダイアログで
 [抽出先]欄で[指定した範囲]オプションボタンをOnに
 [リスト範囲]欄で「A1:A10」セルを
 [抽出範囲]欄で「C1」セルを
 [重複するレコードは無視する]チェックボックスをOnに
設定
 ↓
[フィルタオプションの設定]ダイアログ-[OK]ボタンをクリック

厳密な言い方をすれば重複データを削除するのではなく、元のデータを残したまま重複データを除いた新たなリストを作成する方法です。


Excel 2007では重複データを削除するための、専用のコマンドが新たに作られています。

▼操作手順:重複データを削除する
データベース内の任意の一つのセルを選択
 ↓
[データ]タブ
 -[データツール]グループ
  -[重複の削除]ボタンをクリック
 ↓
[重複の削除]ダイアログで、
 削除したいデータの含まれるフィールドのチェックボックスのみOnに
 ↓
[重複の削除]ダイアログ-[OK]ボタンをクリック

上記の操作を行い、
データの削除が行われると、
「重複する××個の値が見つかり、削除されました。一意の値が○○個残っています。」
というメッセージが表示され、
重複データがなく削除されなかった場合、
「重複する値は見つかりませんでした。」
というメッセージが表示されます。

この回答へのお礼

ご回答ありがとうございました。
列方向だったせいか期待した成果にはなりませんでした。。。

このQ&Aは役に立ちましたか?0 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

注目の記事

おしトピ 夏のプレゼントキャンペーン

「暑~い夏に食べたくなるものと言えば何?」
「東京ディズニーリゾートで好きなアトラクションやショーは何?」
オーダーに答えて、夏が楽しくなるプレゼントをゲットしよう!

このQ&Aを見た人が検索しているワード


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集