[[20100415125908]] 『漢字や半角カタカナのみ抽出』(さあら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『漢字や半角カタカナのみ抽出』(さあら)

初めまして。早速ですが質問させてください。エクセルは2003と2007を使っています。

ひとつのセルに名前とフリガナ(漢字、ひらがな、半角カタカナ、記号(半角・全角)で構成されている)が連続して入力されています。

例を挙げるとこのような感じです。

 「ユゲ キヨミ弓削 貴代美」
 「フクハラ シゲコ<改行>福原 しげ子」
 「山田嘉夫ヤマダ゛ヨシオ」
 「ウチダトモコ<改行><改行>内田 智子」

<改行>はセル内での改行です。

このように何の統一性も無く、はっきり言ってぐちゃぐちゃな状態です。中には名前の間に","や"_""/"など記号まで入っている始末です。恐らく前任者が作成したものだと思うのですが…

そこで、これをきれいに整理したいと考えているのですが、
特定の種類の文字列(「半角カタカナだけ」や「漢字とひらがなだけ」など)のみを抽出し、隣のセルに抜き出すというようなことがマクロなどで処理できますでしょうか?

文字列の規則性が無い以上、このセル中からフリガナや名前を抜き出そうと思ったらカタカナや漢字といった文字の種類しか区別する方法がないのでは?と思いました。

作業としては、先ずは不要な記号などをセルから一括削除(ただ、カタカナの濁点なども消されてしまうと困ります)。
次に名前とフリガナを別々のセルに別ける。といった手順を考えています。

ひとつのシートにデータが5万件ほどあり、ひとつひとつ手作業で分けていくのでは厳しいです。マクロなどを使って一括処理ができれば大変有り難いです。

大変厚かましい限りですが、どなたか良い案があればお知恵を拝借できませんでしょうか?よろしくお願い致します。


 なかなか回答がつかないですね・・・
 私もちょっと悩むのですが、単純に半角カタカナと漢字という決めで分離するのは
 わりと簡単に出来るんです。

 ところが、問題は名前という所なんですね。

 名前は漢字だけではなく、例にもありますが「しげ子」のように平仮名もあれば
 カタカナを使った名前の方もいらっしゃいます。

 どこまでの文字を考慮すれば綺麗に分離できるのか・・・という所で
 レスするのに腰が引けています^^;

 一番良いのはちゃんと決まりごとで入力してもらう事ですが。
 あとは手作業で確認しながら不要文字を置換で消して、フリガナと氏名の間に","でも入れて
 データの区切り位置でセルを分けるとか。
 意外と悩む内容ですね・・・
 (momo)

 (momo)さん

 回答ありがとうございます。やはり難しいのですね…。わたしは単純に半角と全角という括りで分離できるものだと考えていました。

 兎に角、一括でキレイにというのはムリそうですので、一括とはいかないまでも少しでも作業効率を上げるように手順を考えてみようと思います。

 先ずは、↓のようなマクロで不要文字を置換でひとつずつ指定して消していこうかと思います。

 Sub 置換()
 Range(Range("A1"), Range("A1").End(xlDown)).Replace What:="_", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
 Range(Range("A1"), Range("A1").End(xlDown)).Replace What:="/", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
 End Sub

 それでデータを見ていて気付いたのですが、「フクハラ シゲコ<改行>福原 しげ子」のように、「半角カタカナ<改行>名前」のパターンのものが8〜9割のようです。
 次に多そうなのが、「ウチダトモコ<改行><改行>内田 智子」のように<改行>が2つあるもので、それ以外の例に挙げたようなパターンは20〜30件程度で殆どありませんでした。

 こういった場合は、この<改行>を区切りとして、<改行>の前後でフリガナと名前のどちらかを抽出というのはできないものでしょうか?素人考えですが、ひらがなやカタカナの名前といったことを考慮せずに、単純に区切りの前後で抜き出せるようになるのかなと思いました。

 全て一括はムリでも、8〜9割のパターンに適合するものだけでもマクロで処理ができると大変助かります。残りは手作業になるとしてもそれは仕方ないと思いますので。どうぞよろしくお願い致します。

 (さあら)

 データ>区切り位置 で、区切り文字「その他」の文字指定の欄に、
Ctrl+J を入力すると(画面上は何も表示されませんが)、改行文字を区切
りとして分割することができます。
 
同じ列で分割が不都合であれば、ウィザード3/3での表示先を適宜指定してください。
 
(みやほりん)(-_∂)b


 私なら。。。。

 並べ替えをすると、ある程度まとまると思うので
 まとまった所でセルを選択して
 メニュー・データ(D)→区切り位置(E)
  ○カンマやタブなどの区切り文字によって・・・
  ●スペースによって右または左に揃えられた・・ ←こちらを選択

 で、確認しながら分けていくと思います。

 あ、改行で区切れば良いのですか?
 だったら
 メニュー・データ(D)→区切り位置(E)

 区切り位置指定ウィザード − 1/3
  ●カンマやタブなどの区切り文字によって・・・ ←こちらを選択
  ○スペースによって右または左に揃えられた・・
               [ 次へ(N) ]

 区切り位置指定ウィザード − 2/3
  区切り文字
   □タブ(T)      □セミコロン(M)  □カンマ(C)
     □スペース(S) ■その他(O)      [Ctrl + J] ←その他にチェックを入れて
                                      ~~~~~~~~     Ctrlキーを押しながら キーボードの J のキーを押す
                                     表示は無いですがデータのプレビュー(P)が変わります。

 。。。ってみやほりんさんと衝突してんじゃん。

 (HANA)

 マクロを利用するなら、区切り位置ウィザードを実行する前に、
半角カタカナと全角文字の間の文字を
Ctrl+J = Chr(10) に置換するという作業をやるのが良いかもしれません。
(区切り位置ウィザードで直接やってもそれほど時間的に変わらないかもしれませんが)
(みやほりん)(-_∂)b

 (みやほりん)さん、(HANA)さん

 回答ありがとうございます。区切り位置はカンマやスペースなどしかできないものだと勝手に思っていました。
 改行はCtrl+Jで指定できたのですね。大変勉強になりました。

 やり方まで丁寧に教えていただいて助かりました。
 その通りに区切り位置指定ウィザードを試したところちゃんと分離することができました。本当にありがとうございました。

 あとは折角なのでマクロを使っての改行を区切るというのも試してみたいと思います。
 ありがとうございました。

 (さあら)

 一応、決め事を作ってコード化してみました。
 名前には漢字、ひらがな、全角カタカナのみの前提
 半角カタカナは全てフリガナという前提
 以上の条件でA1から↓にデータがあるとして・・・

  Sub test()
  Dim myR As Range, tbl As Variant
  Dim dat() As String, buf(1 To 2) As String, i As Long
  Set myR = Range("A1").CurrentRegion
  tbl = myR.Value
  ReDim dat(1 To UBound(tbl), 1 To 2)
  For i = 1 To UBound(tbl)
    myReg tbl(i, 1), buf
    dat(i, 1) = buf(1): dat(i, 2) = buf(2)
    Erase buf
  Next i
  myR.Offset(, myR.Columns.Count).Resize(UBound(dat), 2).Value = dat
  End Sub

  Private Sub myReg(ByVal myStr As String, mySplitStr() As String)
  Dim myPt As Variant, m As Object
  myPt = Array("[ぁ-んァ-ヶ亜-K]+", "[ヲ-゚]+")
  For i = 0 To 1
    With CreateObject("VBScript.RegExp")
      .Global = True
      .IgnoreCase = True
      .Pattern = myPt(i)
      For Each m In .Execute(myStr)
        mySplitStr(i + LBound(mySplitStr)) = mySplitStr(i + LBound(mySplitStr)) & m.Value
      Next m
    End With
  Next i
  End Sub

 こんなコードを試してみてください
 (momo)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.