• ベストアンサー

エクセルでアルファベットと日本語の文字列を分割する方法

エクセルで各セルに "Beatlesビートルズ" "Rolling Stonesローリング・ストーンズ" のような英語とカタカナ表記がつながっている(間にスペース等ない)文字列を "Beatles" "ビートルズ" "Rolling Stones" "ローリング・ストーンズ" のように分割する方法はありますでしょうか データが少なければコピペですみますが 何千件になるととてもやってられません 関数もしくはVBAで可能であれば教えてください データは同じ列に縦に並んでいます

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。Wendy02です。 #3 のマクロの訂正です。しかし、次のマクロのほうがスピードは速いはずです。 '----------------------------------  '出力する列は?  Const OUTPUTCOL As String = "C"  '----------------------------------    iCol = Columns(OUTPUTCOL).Column  '← 入れ替え    Set rng = Range("A1", Range("A65536").End(xlUp)) '←入れ替え  Application.ScreenUpdating = False   ↓   以下のようになります。  Set rng = Range("A1", Range("A65536").End(xlUp))    iCol = Columns(OUTPUTCOL).Column - rng.Column   '---------------------------------------------------------------- なお、混在した場合のものも作っておきました。 ローリング・ストーンズRolling Stones Rolling Stonesローリング・ストーンズ でも、両方とも切り分けるように作りました。 '--------------------------------------------------------------- Sub reSeparateAlphabetKana() '英語・カタカナ混在の場合に区切るマクロ Dim rng As Range Dim c As Range Dim iCol As Long  '----------------------------------  '出力する列は?  Const OUTPUTCOL As String = "B"  '---------------------------------    Set rng = Range("A1", Range("A65536").End(xlUp))    iCol = Columns(OUTPUTCOL).Column - rng.Column    Application.ScreenUpdating = False    For Each c In rng    If VarType(c.Value) = vbString Then     c.Offset(, iCol).Resize(, 2).Value = reSplit(c.Value)    End If  Next c  Application.ScreenUpdating = True End Sub Function reSplit(strText As String) As String() '英語・カタカナを分離する関数 Dim Matches As Object Dim Match As Object Dim buf(1) As String With CreateObject("VBScript.RegExp")  .Pattern = "^([A-z ]+|[ぁ-龠 ]+|[\uFF64-\uFF9F ]+|[A-z ]+)"  '\uFF64-\uFF9F 半角カタカナ 注意:パターンには半角空白が一つ入る  .Global = False  '全角空白は紛れ込ませない  strText = WorksheetFunction.Substitute(strText, " ", " ")  Set Matches = .Execute(strText)  If Matches.Count Then    Set Match = Matches(0)    buf(0) = Match.Value    buf(1) = Replace(strText, Match.Value, "")  End If  reSplit = buf() End With End Function

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。Wendy02です。 失礼しました。 =MID(A1,1,MATCH(TRUE,INDEX(CODE(MID(A1,ROW($A$1:$A$256),1))<224,,),0)-1) 一応、これでよいと思います。 224というのは、文字コードの半角カタカナの最後に文字に1足した数です。 この現象は、良く調べてみないと分かりませんが、文字の比較に関しては、ワークシート上では、何か、特別な仕掛けがあるようです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 #3 のWendy02 です。 数式の場合は、こんに風に、等式を変えればよいと思います。 "ぁ"にした理由は特にありません。"ァ"でもよいのですが、"ぁ"のほうが小さいからです。 C列 =MID(A1,1,MATCH(TRUE,INDEX(MID(A1,ROW($A$1:$A$256),1)<"ぁ",,),0)-1) D列に出力 (こちらは同じです) =SUBSTITUTE(A1,C1,"") マクロは、17行目あたりの以下のコードを   If StrComp(StrConv(Mid(c.Value, i, 1), vbNarrow), "~") > 0 Then   ↓   If StrComp(StrConv(Mid(c.Value, i, 1), vbNarrow), "ぁ") < 0 Then に変えればよいです。 なお、混在している場合の切り分けは、また、ここの回答の補足などでご相談ください。

kkaazzuu
質問者

補足

ありがとうございます ただ、これですと ローリング・ストーンズRolling Stonesが "ローリング" "・ストーンズRolling Stones" となってしまいます

noname#204879
noname#204879
回答No.5

No.3さんのアイデアを拝借すれば、No.4の B1 の式は次式でもOKかと。 B1: =LEFT(A1,MATCH(TRUE,(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>"z",0)-1) (配列数式)

noname#204879
noname#204879
回答No.4

B1: {=LEFT(A1,MATCH(TRUE,CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>160,0)-1)} (配列数式) C1: =SUBSTITUTE(A1,B1,"")

kkaazzuu
質問者

お礼

ありがとうございました

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 A列の1行目からデータがあるとします。 C列に出力 =MID(A1,1,MATCH(TRUE,INDEX(MID(A1,ROW($A$1:$A$256),1)>"z",,),0)-1) D列に出力 =SUBSTITUTE(A1,C1,"") マクロなら、こんなものが簡単でもよいかも…… Sub SeparateAlphabet() 'アルファベットと日本文字とを分離するマクロ  Dim rng As Range  Dim i As Long  Dim c As Range  Dim iCol As Long    '----------------------------------  '出力する列は?  Const OUTPUTCOL As String = "C"  '----------------------------------    iCol = Columns(OUTPUTCOL).Column    Set rng = Range("A1", Range("A65536").End(xlUp))  Application.ScreenUpdating = False  For Each c In rng   If c.Value <> "" Then    For i = 1 To Len(c.Value)     If StrComp(StrConv(Mid(c.Value, i, 1), vbNarrow), "~") > 0 Then      c.Offset(, iCol - 1).Value = Mid(c.Value, 1, i - 1)      c.Offset(, iCol).Value = Mid(c.Value, i)      Exit For     End If    Next i   End If  Next c  Set rng = Nothing  Application.ScreenUpdating = True End Sub   p.s. zap35さんへ この前から、そのコードは見ていましたが、 "^[A-Z,A-Z, ]+" 正規表現パターンに、「,(コンマ)」区切りはないはずです。コンマも一つの文字として見なされます。余計なお世話かもしれませんが。

kkaazzuu
質問者

補足

早速ありがとうございました 関数、マクロどちらもうまくいきました。 "ビートルズBeatles"のように日本語+アルファベットの場合はどうしたらいいですか

  • hirorin00
  • ベストアンサー率50% (446/884)
回答No.2

はじめまして いったんそのデータをタグ付き置換と正規表現を使えるテキストエディタなどにコピーします。 秀丸がおすすめです。 正規表現置換で 置換前:[a-z]\f[ア-ヲ] 置換後:\0*\1 を実行します。 これで英字とカタカナの間に全角の「*」が入ります。 これを保存してエクセルで再度読み込み、ターゲットの列を選択して、データ→区切り位置で「カンマやタブで…」にチェックを入れ次へ 区切り文字のその他にチェックを入れ「*」を指定して完了をクリック これでうまくいくはずです。

kkaazzuu
質問者

お礼

早速ありがとうございます 秀丸もってないんで、今度やってみます

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

先頭から連続する「英文字(全角半角混在可)と空白」を右隣のセルに、残りを更に右隣のセルに格納するマクロです。 実際のシートに合わせて、マクロ中の  RETSU = "A" '文字列の並んでいる列を指定する の行は修正が必要です。(今はA列を指定しています) Sub AZsplit() Dim RE, strPattern, RETSU As String, Target As Range Dim idxR As Long, mchItem  Set RE = CreateObject("VBScript.RegExp")  strPattern = "^[A-Z,A-Z, ]+"  RETSU = "A" '文字列の並んでいる列を指定する  For idxR = 1 To ActiveSheet.Cells(65536, RETSU).End(xlUp).Row   Set Target = Cells(idxR, RETSU)   With RE    .Pattern = strPattern    .IgnoreCase = True    .Global = True    Set mchItem = .Execute(Target.Value)    If mchItem.Count > 0 Then     Target.Offset(0, 1) = mchItem(0).Value     Target.Offset(0, 2) = Right(Target.Value, _       Len(Target.Value) - mchItem(0).Length)    End If   End With  Next idxR  Set RE = Nothing End Sub マクロはALT+F11でVBE画面を開き、「VBAProjectエクスプローラのシート名右クリック」→「挿入」→「標準モジュール」で表示される画面にペーストして下さい。実行はALT+F8を押して、マクロ名を選択します。

kkaazzuu
質問者

お礼

早速ありがとうございました ためしてみます

関連するQ&A

  • エクセルで数字とアルファベットと文字列を分割する方法

    こんばんは。 エクセルのセルで数字とアルファベットの文字列を分割する方法を教えて下さい。 100AB3.4C → "100" "AB" "3.4" "C" 間にスペースやカンマなど無く、文字数は異なります。 数字は小数点がある場合と無い場合があります。(上記の "100" "3.4" のように) 同じ列に同様のデータが数件~数千件あり、まとめて分割したいです。 関数もしくはマクロ(VBA)で可能であれば教えて下さい。 最近マクロの勉強を初めたのですが、方法が思いつきません。。。 宜しくお願いします。

  • 文字列内の記号、スペースなどを削除する方法

    エクセル2000 OS:WinXPpro 本人の技量レベル:VBAはコピペして実行しても、修正が出来ないので、なるべく関数で処理したい。 半角カタカナ英数だけの文字列を作りたいのです。 元のデータには()などの記号、句読点、スペース等が含まれています。 一応TRIM関数で余分なスペースは削除しましたが文字列中の半角スペースが残っています。 これを半角カタカナ英数だけを残してベタの文字列にしたいのです。

  • エクセルで文字列をスペースで列に分割

    エクセルマクロ超初心者です。 住所録を作成しているのですが、既存データの形式が、G列に郵便番号と住所がスペースを挟んで同一セルに入っています。 コレを、何かボタンを押したら郵便番号と住所を別々の列に分割するようなマクロを教えて頂きたいのですが。色々本で調べているのですが思うように進みません。 教えていただけると非常に助かります。

  • Excelでカンマ区切りの文字列をセルに分割する?

     住所録をExcelにコピーしたら、 カンマ区切りに一つのセルに入ってしまいました。 ◇カンマごとに一つのセルに分割して文字列を分ける。 ◇氏と名の間は半角スペースでカンマでは有りませんが、   二つのセルに分ける。 上記について分ける関数を教えてください。    

  • Excelで任意の文字列を半角スペースで分割

    一つのセルに複数の内容が半角スペースで区切られて記載されているデータがあります。 これを半角スペースで分割することは可能でしょうか? 例:A列に 01 22 3 444 5555 6 77 888 999 111 222 333 11111 2 33 44 5555 これをB~J列に B C D E F G H I J 01 22 3 444 5555 6 77 888 999 111 222 333 11111 2 33 44 5555 という様に自動的に分割・入力させたいのですが可能でしょうか? ※添付イメージを参照ください。 A列の様な形式のデータを日常的に分割する必要があり、現在は[データ>区切り位置]で手動入力を行っているのですが手間がかかる上ミスをしてしまうこともありなんとか自動化したいのです。 項目数・文字数ともデータによりバラバラなため、単にfind関数やmid関数などを使っても上手く行かず、 アイデアをいただけますと助かります。何卒よろしくお願い致します。 ※実際の環境では「BS列に記載の内容をBT列以下に入力」「データの内容は【aaa.jpg bb_1.gif …】の様な画像ファイル名」となりますが質問ではシンプルにさせていただきました。

  • 【エクセル】文字列分割の関数

    エクセルで文字列を分割する数式を探しております。 以下のデータを 右から4桁とそれ以外に分割したいのです。 20002  → 2 0002 30003  → 3 0003 40010  → 4 0010 511000 → 51 1000 1019550 →101 9550 1012279 →101 2279 2019220 →201 9220 3338850 →333 8550 たとえばLEFT関数やRIGHT関数ですと、分割というよりも 抽出になってしまい、私の求めているものとは異なってしまいます。 考えが煮詰まってしまい、これ以上進めない状態です。。。 何卒よろしくお願いいたします。

  • EXCELで、文字列を任意の文字数毎に分割するには

    ≪やりたい内容と条件≫ ◆EXCELで、文字列を任意の文字数毎に分割したいです。 ◆文字列は、全角・半角・記号を含みます。 ◆1つのセルが半角80桁という制限があり、その上限を超えると、右の次のセルに流し込まれるようにしたいです。(A1は元の文字列1500桁くらい、以降B1,C1,D1,E1・・・という具合に流し込み) ≪試した内容≫ MIDB関数を見つけ挑戦しましたが、1つ目のセルはうまくいきますが、その後が出来ません。例えば、文字列が「・・・・・・abcあいうえお」となっていた場合、B1は「・・・・・・abcあいう」、C1は「 お」(「お」の前は、半角スペース)となります。 何かよい方法はないでしょうか。 一度に出来ないようであれば、A1-B1で残りの文字列が表示できれば、それ以降はまた関数を入れて一つ一つやっていきたいと思っています。 よろしくお願いいたします。

  • 文字列を分割したい。

    (A1)のセルにある文字列は、数個の文字列をスペース(半角)を開けて配置しています。 (2行目以下も同様の多種の文字列があります。) サンプル 「学校 東京 神奈川県横浜市 ABC アメリカ」 これを、 1行目のセルに関数を用いて、 (B1)に「学校」 (C1)に「東京」 (D1)に「神奈川県横浜市」 (E1)に「ABC」 (F1)に「アメリカ」 と表示したいのです。 関数で処理できましたら、その関数式を教えてください。 関数で処理できない場合は、マクロを教えていただければありがたいです。 よろしくお願いします。 ※エクセルの「区切り位置]機能を試しましたが、うまくいかないようです。

  • エクセル関数の文字列操作で困ったことが

    競馬のオッズデータの取り込みを行っていますが、外部データをエクセルのシート(sheet2)に取り込んだ際、決まった場所に単勝と複勝のオッズデータが入っているのですが、(000022000336・・・のように6バイトを1頭分のオッズとして表示:上の例では馬番(1)のオッズが2.2倍、馬番(2)のオッズが33.6倍というように)17頭までは文字列でずらーっと表示されるのになぜか18頭のときだけ1.17E+105などというような表示になってしまいます。 このオッズデータからMID関数で6文字ずつ分割してそれぞれの馬番のセルに貼り付けていたので18頭の時はエラーになってしまいます。参考書はVBAでプログラムを組んでオッズの取り込みからセルへの貼り付けまでスムーズに行えているようですが、私がやってもVBAでうまくいかないためやむを得ずエクセル関数で処理した次第です。 この問題うまく解決できますか?

  • セル内文字列を分割する方法

    Excelの文字列操作について質問です。 2つのセルの内容を1つのセルに結合する関数はあると思うのですが、逆に1つのセルの中身を複数のセルに分割したいときには、どうしたらよいのでしょうか。 例えば、 「Q1-1&Q1-2&Q2-1&Q2-2&Q3-1&Q3-2」 このようなセルの内容を以下のように「&」の前後で切り離したいのです。 「Q1-1」「Q1-2」「Q2-1」「Q2-2」「Q3-1」「Q3-2」 何か関数があるのでしょうか。ご存知の方がいらっしゃいましたら、教えてください。

専門家に質問してみよう