こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Excel列内部分一致を削除又は文字列分解の方法

Excelで部分一致している行を削除する方法を探しています。
A列に様々なマンション名が4万行近く入ってます。

やりたい事は主に以下の選択肢です。
1、マンション名が部分一致していた場合その前後を探して行を削除し、一つだけ残す状態にできればと思っています。
2、漢字とカタカナ、ひらがな、数字を分解できる方法はないでしょうか。
3、部分一致しているセルを塗りつぶす方法はないでしょうか。

上記の内のどれか一つでもできはしないかと考えています。

データの状態は以下の通りです。(例になります)

   A列
エクセルマンション横浜
エクセルマンション相模原
エクセルマンション横須賀コート
立川マンション11
立川マンション22
目白ガーデン
目白マンション

例としてこのような状態です。これを最終的に↓以下の状態にしたいと思ってます。

エクセルマンション
立川マンション
目白ガーデン
目白マンション

※同一マンションはソートされて基本的にはひとかたまりになっています。
※重複しないマンションも存在します

「立川マンション 11」のように空白があれば良かったのですが、ない状態です。
基本的に文字列の前半が重複していますが、例の目白のように前半少し重複してても違う建物の場合もあるので余計に難しい事になってます。

とても簡単なマクロや関数等は使った事はあります。
ただ今回は、何を利用すればいいのか、関数にしてもマクロにしても何も思い浮かんでこなかったので、調べてみましたが、やはりよくわからず、こちらで質問をさせていただきました。
無理であれば無理と教えていただければと思います。
一発で解決する方法がなくとも、なんとかデータをうまいこと処理できる方法があれば教えていただけますと幸いです。
Excelは2007を使用しています。
以上ご助力何卒よろしくお願いします。

投稿日時 - 2015-04-06 18:20:55

QNo.8950532

困ってます

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

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

こんにちは。

ご質問でなさりたい事は、
 【固有名詞に含まれている'ブランド名'を抜き出す】こと
という一点なのだと理解しています。

この作業をどこまで自動化できるか、
というトライなのだと思いますが、
部外者には何とも言えない面がありますね。
当事者だから手に入れられる資料だとか、
当事者だから気が付く手法が色々とあると思いますし、
目視を基準にした手作業の負担を軽減させる方法ならば、
きっと見つけられるとは思います。
まず手を動かして、色々と試しながら、
まだ気が付いていない手法を見つけたり、
時には、Excel一般機能のお浚いをしながら、
少しずつ形にしながら、少しずつ効率化してゆく
ということになると思います。
一足飛びに最適な手順を見つけようと考えてしまうと、
却って大変な気がしますね。

作業工程としては、
既存データに含まれている'ブランド名'の重複を削除していく、
その際、'ブランド名'の文字長が長い方から順に、
抜き出した'ブランド名'を
'ブランド名一覧'として新しい表に纏めていくことを
並行して処理していくことが重要になると思います。

そういう意味では、
> 2、漢字とカタカナ、ひらがな、数字を分解できる方法はないでしょうか。
これは決して直接的な方法ではないですけれど、
【'ブランド名'を抜き出す】作業を補助して能率を高める
可能性はあるように思います。
最後まで、そのやり方を通すのでは、やはり大変そうだけど、
ひとつの手掛かり、足掛かり、にはなるのかな?と。

対比して、
> 1、マンション名が部分一致していた場合その前後を探して行を削除し、一つだけ残す状態にできればと思っています。
...
> 3、部分一致しているセルを塗りつぶす方法はないでしょうか。
これらは、'ブランド名'と部分一致させる、という意味でしょうから、
求めるべき答えが先にある筈もなく、順番的に矛盾した作業ですね。
【'ブランド名'を抜き出す】作業を段階的に進める過程で、
次々に確定した'ブランド名'を基準に重複を削除する、という、
作業の一局面で必要になることです。
Excel一般機能でいうと、
 [オートフィルター][詳細設定]
 (旧バージョンでは[フィルターオプション])
を使って、
'ブランド名'をキーに部分一致で抽出した行
を削除する、
または、(作業用の列に)フラグ([残す/削除/未処理]の3通り)を立てておく、
というような方法になるかと思います。

重複を削除する、ということに拘らなくても、
可能なら作業プランを変更して、
1)4万行のデータを丸ごと、別シート(別ブック)にコピー
2)【'ブランド名'を抜き出】して'ブランド名一覧'に追加
3)一覧への反映が済んだ'ブランド名'が含まれる行をすべて削除
という風にして、作業が終わった時には、
4万行がゼロになるような工程の方がやり易いかもしれませんね。
或いは、今予定している作業と並行して進めてみるとか。
'ブランド名一覧'というリスト(テーブル)さえ作ってしまえば、
既存のデータも扱い易くなります。

以下、ご提示の工程2、に対する直接的な回答です。
正規表現を使って、
A列にある文字列を
 「英数字」
 「カタカナ」
 「ひらがな漢字」
の3つのグループに分けて、
それぞれ連続した文字列を
セル範囲(使用中のセル範囲の右外)に、
複数列に分けて出力します。

カタカナの"ヵ"や"ヶ"は、カタカナ名詞では使われないので、
「ひらがな漢字」に分類しています。
こういうことを一例として、ちょっとした気づきの積み重ねで、
少しずつ改善していくことになるのかと思います。
3つに分けたのは最初の足掛かりですので、
今回の作業に適した分類は他にもあるだろうと思います。
最初に見つかる「カタカナ」部分だけを抜き出す※、
という工程なら、先に実行すると結構絞り込めそうかな?とか。
そちらで気付いたり、不足をみつけた事があれば補足してみて下さい。

こちらで試した限りでは、
マクロ実行後に続けて文字長順に並べ替えをして
すべてカタカナの'ブランド名'については
抜き出す作業の効率化に見通しが立ちそうな気はしています。

' ' ///

Sub ReW8950532()
Dim mtxS
Dim mtxP
Dim oRegExp As Object ' As VBScript_RegExp_55.RegExp
Dim colMatch As Object ' As VBScript_RegExp_55.MatchCollection
Dim nLastRow As Long
Dim nXSize As Long
Dim iY As Long
Dim iX As Long

  Set oRegExp = CreateObject("VBScript.RegExp")
  oRegExp.Global = True
  oRegExp.Pattern = "([0-9a-zA-Z0-9a-zA-Z\s]+|[ァ-ヴー]+|[ヵヶぁ-ゞ一-龠]+)"
'  oRegExp.Pattern = "([ァ-ヴー]+)" ' ※「カタカナ」部分だけを抜き出す場合上の行と差し替え

  nLastRow = Cells(Rows.Count, "A").End(xlUp).Row
  mtxS = Range("A1:A" & nLastRow).Value
  ReDim mtxP(1 To nLastRow, 0 To 9)

  For iY = 1 To nLastRow
    Set colMatch = oRegExp.Execute(mtxS(iY, 1))
    For iX = 0 To colMatch.Count - 1
      mtxP(iY, iX) = colMatch(iX).Value
    Next iX
    If iX > nXSize Then nXSize = iX
  Next iY
  Set colMatch = Nothing:  Set oRegExp = Nothing

  With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .EnableEvents = False
  End With
  Cells(1, ActiveSheet.UsedRange.Columns.Count + 1).Resize(nLastRow, nXSize).Value = mtxP
  With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
  End With
End Sub

投稿日時 - 2015-04-07 12:51:11

ANo.2

 おそらく機械を使って自動的に処理する事は無理ではないかと思います。
 質問者様の例において「立川マンション」と「目白マンション」はどちらも「マンション」という部分が一致しているのにもかかわらず、2つとも残しておられるという事は、漢字とカタカナを分けた際に同じ文字列となっているかどうかで区別する訳には行かないという事です。
 では、「立川マンション11」という文字列の中で、片仮名が連続している「マンション」という部分が終わっている所で区切る事で「立川マンション」と「11」に分けてしまい、前半が同じものに関しては1つだけ残す様にすれば良いかと言うと、それもうまくありません。
 例えば、鈴木さん人物が経営している「コーポ鈴木」と、横浜市に建てられている「コーポ横浜」があった場合、片仮名が終わる所で分けたのではどちらも同じ「コーポ」になってしまいます。
 それに、全国各地には「元町」、「本町」、「東町」、「富士見町」等々、全国各地に良く見かける町名や地名というものがあり、それに因んで名付けられた「コーポ元町」とか「富士見マンション」等と言った同じ名前の建物が複数存在しているのではないかと思われます。
 又例えば、斉藤さんという人物が複数のマンションを経営していて、その名称が「第一斉藤マンション」、「第二斉藤マンション」となっている場合には、それらのマンションは全て残ってしまう事になります。
 数字や漢数字を除外した部分で比較する様にするとしても、「東斉藤マンション」や「西斉藤マンション」と言う名称もあるかも知れませんし、「東京斉藤マンション」や「大阪斉藤マンション」もあるかも知れません。
 又、藤さんと言う人物が経営している「藤マンション」と、佐藤さんと言う人物が経営している「佐藤マンション」や、伊藤さんと言う人物が経営している「伊藤マンション」などがある場合には、「藤マンション」だけを残して「佐藤マンション」や「伊藤マンション」の類が消えてしまう事になっても良いのでしょうか?
 その程度であればまだしも、藤さんと言う人物が経営している「西藤マンション」、「東藤マンション」がある一方で、西藤さんと言う人物が経営している「西藤マンション」があった場合には一体どうやって区別するのでしょうか?

投稿日時 - 2015-04-07 00:52:53

ANo.1

まずデータを昇順にソートして その後で 上のセルと比較して「左から○文字
までが一致するか」でチェックしたらどうですか?

投稿日時 - 2015-04-06 23:26:15

あなたにオススメの質問