- ベストアンサー
エクセル初級者向け 重複データの削除方法と新たなデータの作成法
- エクセルを使っている初級者のための、重複データの削除方法を紹介します。同じセルに複数の重複データがある場合、重複しないデータを抽出して新しいセルに入れる方法を解説します。
- 重複データの区切り方はセミコロン、パイプ区切り、空白、改行が混在している場合でも対応できます。新しいセルでのデータ区切りはコンマかパイプ区切りを選ぶことができます。
- 手作業でデータを処理する必要があり、マクロについての知識は必要ありません。エクセル初級者でも簡単に実践できる方法を紹介します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Sheet2 において、 1.セル A1 に次式を入力して、此れを下方にズズーッとドラッグ&ペースト =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Sheet1!B1,CHAR(10)," "),"|"," "),";"," ") 2.列A全体を選択して、[コピー]→[値の貼り付け]を実行 3.列A全体を選択したままで、[データ]→[区切り位置]を実行 4.カンマやタブなどの…に区切られたデータ”に目玉を入れて、[次へ] 5.“スペース”および“連続した区切り文字…扱う”にチェックを入れて、[完了] Sheet3 において、 6.セル A1 に次式を入力して、此れを下方および右方にズズーッとドラッグ&ペースト =IF(COUNTIF(Sheet2!$A1:A1,Sheet2!A1)=1,Sheet2!A1,0) 何処まで右に? 全セルのデータが 0 になる列までネ(此処ではそれを仮に列Eとしておく) 7.列A~E全体を選択したままで、[編集]→[ジャンプ]→[セル選択]を実行 8.“数式”に目玉を入れ、かつ、その配下の“数値”だけにチェックを残して[OK] 9.数値 0 の全セルが選択状態になるので、そのままの状態で[編集]→[削除]を実行 10.“左方向にシフト”に目玉を入れて「エイヤッ!」と Enterキーを叩き付け
その他の回答 (3)
- mitarashi
- ベストアンサー率59% (574/965)
#3さんと同様にデータ/区切り位置で元データを複数列に分解します。 このデータがB列からG列にあるとします。H列は空にしておきます。 2行目の例では、I列に =IF(H2="",C2,IF(ISERROR(FIND(C2,H2)),H2&","&C2,H2)) という式を入れて、右方、下方にずずっと、十分な数だけコピーします。多すぎても問題ありませんが、不足はNGです。 最終列にお望みのデータが得られると思います。ご参考まで。 なお、#1のkeithinさんと同様の方法で、但しユーザー定義式で無くてループを回して一発でやってみました。一旦配列に取り込む高速化の技は取り入れていますが、2万行を当方の環境(Core i5 3.2GHz,xl2010)で、600ミリ秒前後で処理できました。 要するにVBAを用いると、1秒かからずに処理できますよと、誘惑しています。 ※replace関数を複数回用いる方法と、Midで切り出して、","に変換してMidで書き戻す方法を試してみましたが、replace関数を用いる方が高速でした。(これが検証してみたかっただけです...)
お礼
ありがとうございます。追加の工夫の部分、トライしてみます。 スキルがあると、VBAでは1秒弱でできるというのは、確かに誘惑です。 VBAを作るところに∞秒かかるので、先に進めず誘惑を味わえないのが残念です。 今回はありがとうございました。また、教えてください。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! >※マクロは全くわからないので、多少の手作業があっても関数レベルで とありますが、関数で行うとしても結構厄介だと思います。 というコトでお望みでないVBAになってしまいますが、一例です。 データは2行目以降にあるとします。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, k As Long, str As String, buf As String, myArray, tmp Application.ScreenUpdating = False For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row tmp = Cells(i, "B") For k = 1 To Len(tmp) str = StrConv(Mid(tmp, k, 1), vbNarrow) If str = " " Or str = "|" Then tmp = WorksheetFunction.Replace(tmp, k, 1, "*") End If Next k myArray = Split(tmp, "*") For k = 0 To UBound(myArray) If InStr(buf, myArray(k)) = 0 Then buf = buf & myArray(k) & "," End If Next k Cells(i, "C") = Left(buf, Len(buf) - 1) buf = "" Next i Application.ScreenUpdating = True End Sub 'この行まで ※ 関数で簡単にできる方法があればごめんなさいね。m(_ _)m
お礼
せっかく教えていただいたのです、VBAがわからず実行できません。 今回は期限があるので実行できませんが、早く理解できるように なりたいと思いました。 実は初投稿で、こんなに教えていただけたので感激しています。 次回はよろしくお願いいたします
- keithin
- ベストアンサー率66% (5278/7941)
次の通りにするだけで出来ます。 手順: ALT+F11を押す 現れた画面で挿入メニューから標準モジュールを挿入する 現れたシートに下記をコピー貼り付ける function myf(target) as string dim buf as string dim a as variant, ax as variant dim mydic as object set mydic = createobject("Scripting.Dictionary") on error resume next ’区切り文字を統一する buf = replace(target, ";", ",") buf = replace(buf, "|", ",") buf = replace(buf, " ", " ") buf = replace(buf, " ", ",") a = split(buf, ",") ’重複を除いたデータを採取する for each ax in a if ax <> "" then mydic(ax) = 1 next ’結果を作成する myf = join(mydic.keys, ",") end function ファイルメニューから終了してエクセルに戻る 好きな場所、たとえばB列に元データを準備する てきとーなセル、たとえばC1に =myf(B1) と関数を記入する。 以下コピー。
お礼
VBAの基本的なところも説明いただいたのですが、残念ながら、 この説明でもまだVBAが理解できず、例題でも実行できませんでした。 VBAも必須だな、と思いました。これから勉強します。
お礼
ありがとうございます。これなら操作の流れがわかりました。 操作手順10以下が途中で切れているように思えますが、 後は何とか、目的は果たせそうです。 特に6に相当する操作が思いつかなかったので、助かりました。