• ベストアンサー

Excel 住所の分割(文字数制限あり)

Excelのシート1列に住所データがあり、これを30文字以内で収まらない場合は、次の列に20文字以内で、それでも収まらない場合はその次の列にデータを分割したいのですが、どうしたら良いでしょうか? 都道府県、市町村などの単位でスペースが入っていますが、最初の列は30文字以内なので単位としては細かすぎます。 またLEFT関数、MID関数を使用すると文字数は指定どおりになりますが、番地の途中や濁点などで列が変わったりしてしまいます。 適切な区切りもありつつ、文字数も守れるような方法はないでしょうか? <例> 神奈川県 横浜市 **区 *** 1-11-11 ****************D-301号室(48文字、スペースも1文字にひとまず数えました)       これを下記のように変換したい            ↓ 神奈川県 横浜市 **区 *** 1-11-11(30文字以内、このデータは24文字) ****マンション名等***** (1列目30文字に入りきらなかったので2列目20文字以内、このデータは16文字) D-301号室 (2列目20文字以内にも入らなかったので3列目) 以上、よろしくお願いします。

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.3

神奈川県 横浜市 **区 *** 1-11-11 **************** D-301号室 のようにD-301号室の前にスペースがあるなら A1にデータがあり、A2,A3,A4に分割として A2=IF(LEN(A1)>30,LEFT(A1,MIN(FIND(" ",A1&" ",MAX(LEN(A1)/2,20))-1,30)),A1) A3=IF(LEN(A1)>30,MID(A1,LEN(A2)+2,MIN(FIND(" ",A1&" ",LEN(A2)+2)-LEN(A2)-1),20),"") A4=MID(A1,LEN(A2&A3)+2,20) ※D301号室の前にスペースがない場合、A4は"1号室"となります。

prima_u
質問者

補足

ご回答ありがとうございます!!試してみたのですが、A2の式を入れると引数が多すぎるか、少なすぎるというメッセージが出てきてしまいます。いろいろ試してみたのですが、よくわからなくて。。A2とA4は大丈夫でした!!もし、おわかりでしたら教えていただけると助かります。宜しくお願いします。

その他の回答 (7)

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.8

#3です。すみません。転記時に)の位置を間違えたようです。 正:A3=IF(LEN(A1)>30,MID(A1,LEN(A2)+2,MIN(FIND(" ",A1&" ",LEN(A2)+2)-LEN(A2)-1,20)),"") 誤:A3=IF(LEN(A1)>30,MID(A1,LEN(A2)+2,MIN(FIND(" ",A1&" ",LEN(A2)+2)-LEN(A2)-1),20),"")

prima_u
質問者

お礼

再度ご回答ありがとうございます!試してみたら出来ました!!マンション名の前の所は他の方にご回答いただいた方法でスペースを入れて処理できるかと思います。大変助かりました!!ありがとうございました!!!

noname#79209
noname#79209
回答No.7

このテの処理には「正規表現」が必須アイテムです。 既存のVBAでも、ある程度正規表現が使えるようになってはいますが、以下のDLLを採用すると、より細かな正規表現が使用できるようになります。 http://www.hi-ho.ne.jp/babaq/bregexp.html また、住所データの間違いを訂正したり、区切り位置を検出し易くするため、その住所データ内容の形式を統一するよう整形しておく必要があります。 とくに、住所の入力がクライアント側の担当者が行っており、入力担当者が複数いる場合などは、通常使用しない文字が含まれているケースがありますので、整形作業は重要です。 例えば「1-2-3」などの「-」の部分が「ー(長音記号)」であったり、文字コード表から入力したらしき横罫線などが入っている場合もあります。 また、入りきらない場合「306号室」などの「号室」などを削除するなどの工夫も必要です。 しかし、整形は、いちいち手作業で行うのではなく、StrConv関数や正規表現を組み合わせれば可能です。

prima_u
質問者

お礼

ご回答ありがとうございます!正規表現が必須なのですね。確かにデータ数がかなり多い中で半角、全角等が統一されていなかったりで困ったなと思っていました。VBAは勉強した事がないのでわからず、StrConv関数や正規表現は初めて知りました。これを機に試してみます。ありがとうございました!

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

追伸: 一応、出来ないと書きましたが、以下では、第二区切りパターンを替えれば、区切りが出来ます。 Const MPAT2 As String = "\S([ \sA-z]+)\S" '第二区切りパターン 正規表現は、その括弧( ) の中に入るものを、次の先頭に来るものとして、区切るようにします。 一応、D-301号室は、それで区切れます。Windows の RegExp を使用していますから、多少、機能的には弱いものがあります。

prima_u
質問者

お礼

いろいろと考えてくださり補足のご回答いただき、ありがとうございます!!!

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

こんにちは。 私の書いたものには、あまりキチンと返事はされなかったようですが、一応、気になっていたものなので、もう少しレスさせていただきます。今、マクロでの処理を作ってみました。 しかし、いくつかの点で問題点が発生してしまいます。 ****************D-301号室 >(1列目30文字に入りきらなかったので2列目20文字以内、このデータは16文字) >D-301号室 (2列目20文字以内にも入らなかったので3列目) こちらの住所録で調べてみましたが、例えば、「D-301」区切り相当する部分は、判断のしようがありませんね。スペースを入れていただくしかありません。以下の場合は、第二区切りパターン の工夫の仕方にあるように思いますが、分かりません。 たまたま、そこを区切れるように出来ても、統一のパターンで行うのは無理だと思います。(たぶん、お金を払ってでも、データ自体をいただかない限りは、パターンの作りようがありません。) '標準モジュール Sub MainMacro()  Dim c As Range  Dim i As Integer  Dim j As Integer  Dim k As Integer  Dim n As Integer  Dim buf As String, buf1 As String, buf2 As String  Dim Ar() As Variant  'B列/C列に出力されます。  Const MPAT1 As String = "\S([ \s]+)\S" '第一区切りパターン  Const MPAT2 As String = "\S([ \s]+)\S" '第二区切りパターン     Application.ScreenUpdating = False  For Each c In Range("A1", Range("A65536"))   If Len(c.Value) > 29 Then    buf = c.Value    buf1 = AddressSplit(c.Value, MPAT1, 29)    c.Offset(, 1).Value = Trim(buf1)    If Len(c.Offset(, 1).Value) > 19 Then     buf2 = AddressSplit(Replace(buf, buf1, ""), MPAT2, 19)     If Len(Trim(buf2)) > 0 Then     c.Offset(, 2 + n).Value = Trim(buf2)     n = n + 1     End If     c.Offset(, 2 + n).Value = Trim(Replace(buf, buf1 & buf2, ""))    End If   End If   n = 0  Next c  Application.ScreenUpdating = True End Sub Function AddressSplit(strVal As String, myPat As String, SplitNum As Integer) As String Dim Matches As Object Dim Match As Object Dim Ar() As Variant Dim i As Integer Dim j As Integer Dim k As Integer Erase Ar() i = 0: j = 0 On Error GoTo ErrHandler With CreateObject("VBScript.RegExp")  .Pattern = myPat  .Global = True  Set Matches = .Execute(strVal)  For Each Match In Matches   ReDim Preserve Ar(i)   Ar(i) = Match.FirstIndex + 1   i = i + 1  Next    If UBound(Ar()) < 0 Then Exit Function  For i = LBound(Ar()) To UBound(Ar())    If Ar(i) > SplitNum Then     j = i - 1     Exit For    End If    Next i   If j = 0 Then    k = Ar(UBound(Ar()))   Else    k = Ar(j)   End If  AddressSplit = Mid$(strVal, 1, k) End With Exit Function ErrHandler:  AddressSplit = "" End Function

prima_u
質問者

お礼

マクロまで作っていただき、再度ご回答ありがとうございます!!マクロは全然わからないのですが、ご回答いただいたもので試してみたいと思います!きっと精度の高いデータができるのではと思います。ご丁寧にありがとうございました!!

noname#79209
noname#79209
回答No.4

失礼ながら、質問者さんのお求めになっている内容は、充分お金をとれるノウハウを含んでいます。 過去にラベル印刷用の「住所分かち書き」を含んだソフトを作成しン十万円頂戴したことがあります。

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

こんにちは。 私は、一応、今のところは、参考意見までにさせていただきます。他の方の解答で出来れば、それに越したことはありません。私は、VBAの処理にはなると思います。まず、関数では不可能だと思います。 <例> たぶん、実物から抜き出したものだと思います。 神奈川県 横浜市 **区 *** 1-11-11 ****************D-301号室 区切り選択位置 4 8 12 16 24 -(41) *** 1-11-11  ←ここの区切り位置(24)にはスペースがあるようですが、 *D-301号室←こちらにはありません。 -(41) (Dの前に予想する文字列は、すべてだというなら、それは論理的には不可能だと思います。) ****************D-301号室 の「****************」は、たぶんカタカナだとは予想しますが。 せめて、区切り位置に、スペースがあるならともかく、そうでない場合は、正規表現でいけるかどうか、やってみなければ分かりません。 >番地の途中や濁点などで列が変わったりしてしまいます。 それに、番地は、「数字と[-]」の組み合わせだとして、それは良いとしても、「濁点」で変わるというのは、半角カタカナが存在する、という意味を示してはいないでしょうか? どなたかのマクロの完成を待つにしても、よほどの多くを経験した者(つまり、パターンを持っている人)でないと、回答者側で様々なサンプルを使いながら行うので、当然、トライ&エラーを繰り返します。こちらでも、Word用のはがきの印刷のために、VBAで作った経験はありますが、できれば、手作業のほうが早いかもしれません。

prima_u
質問者

お礼

貴重なお時間頂き、ご回答ありがとうございました!!

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

関数だけでやるなら例えば 1.空白を単位にしてすべて列を分ける(テキストをCSV形式で読み直せば簡単に作成できます)。ある程度の規則がある住所なんで列は10ぐらいを上限として考えておけば十分でしょう。 2.列をすべて繋げた場合の文字数をカウントします。 3.それで30文字をオーバーするなら連結する列を一つ減らします(IF関数でネストする)  ex.A1~A10までで30オーバーするならA1~A9までをカウント、の繰り返し 4.30文字の制限で何列目までが繋げられるのかをカウントする  例えば1-4列目までで30文字以下に収まるなら4 5.カウントした値を元に同様に2行目に入る列数をカウントする  今度はA5~A10までで検証。手順は3と同じ 6.最後にそれらを元にそれぞれ連結  例えば1~4、5~6、7~10というような数字が出るので、それで繋げる。 ダミー列を多数つくる必要があるのでシートを分けて作成すれば、最終シートにはきれいに並ぶかと思います。

prima_u
質問者

お礼

ご回答ありがとうございます!!細かく区切らない方法ばかり考えていたので、全然思いつかなかったです。貴重なお時間いただき、ありがとうございました。

関連するQ&A

  • 文字列を分割したい。

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

  • Access2003 文字数の合計について

    複数のフィールドに入力されている文字列(数値や文字)の文字数をカウントし, そのレコードごとの文字数合計を出したいのですが、「エラー」になってしまい うまくできないので、アドバイスを頂きたいと存じます。 ========================================================================= ☆1つのレコードA~Eのフィールドがあり、全角・半角の文字および英数字のデータが混在しています。  なお、データの入っていない空欄がところどころにあります。 [手順1] まず、フィールド内にある空白を除くためReplace関数を使って置換するため フィールドへ以下の式を入力します。 B1: Replace([B]," ", "") D1: Replace([D]," ", "") (例) [ID]  [A]         [B]       [C]       [D]            [E]     1  東京都   港区 ○○1丁目  1-2-3   ●×マンション 101  ○○様方 2  神奈川県  横浜市○○○町   10-10    NULL           NULL 3  千葉県   千葉市 ○○○町  NULL    NULL            ○○様方 ========================================================================= [手順2] 空白を取り除いたフィールドの文字数をカウントするためLen関数を使ってカウントするため フィールドへ以下の式を入力します。 文字数: Len('' & [A] & [B] & [C] & [D] & [E]) (例) [ID]  [A]         [B1]       [C]       [D1]           [E]     [文字数]   1  東京都   港区○○1丁目   1-2-3   ●×マンション101   ○○様方     29 2  神奈川県  横浜市○○○町   10-10    NULL           NULL      16 3  千葉県   千葉市○○○町   NULL    NULL           ○○様方     14 ========================================================================= [手順1]~[手順2]を行い、文字数フィールドに合計値が表示されるようにしたいのですが、 [手順1]のクエリ実行でフィールド[D]の空欄に「#エラー」が表示されてしまい、 以下のとおり、[手順2]で文字数を出すことができませんでした。 (例) [ID]  [A]         [B1]       [C]       [D1]           [E]     [文字数]   1  東京都   港区○○1丁目   1-2-3   ●×マンション101  ○○様方     29 2  神奈川県  横浜市○○○町   10-10    #エラー        #エラー     #エラー 3  千葉県   千葉市○○○町   NULL    #エラー        ○○様方     #エラー ========================================================================= 上記のようなエラーを出さずに、文字数合計をしたいので、アドバイスをいただきたいと存知ます。 よろしくお願いいたします。

  • 文字列のスペースを抜く方法

    エクセルで文字列の間にスペースが入っている文字列のスペースの抜き方を教えてください。 神奈川県 横浜市 TEL ××× 山田 太郎←この文字列のスペースを抜きたいんです。 こんな感じで、複数行に渡ったデータなので区切ることが出来ませんでした。 よろしくお願いします。

  • エクセル2003によるsumifに複数バージョン

    エクセル2003で以下の条件の関数を作成したいと考えております。 教えて頂けないでしょうか? A列、B列、C列、D列があり。 求めたいのは、【A列が「100」に等しい かつ (B列に「東京」という文字が含まれる または C列に「横浜市」が含まれる)場合のD列の和】になります。 A    B    C     D 100 東京都  三鷹市  1200 100 神奈川県 横浜市  2000 200 東京都  三鷹市  1200 100 京都    京都市  1000 100 神奈川県 ああ横浜  100 の場合、計算したいセルには1200+2000+100の3300が表示されるようにしたいです。 SUMIF関数を使いましたが、うまくできません。 また2007ではない為SUMIFS関数もない状態で困っています。 教えて頂けませんでしょうか?

  • エクセルで住所録管理データベースで

    エクセルで住所録管理データベースで (例) C列         D列 東京都台東区上野   1-234-1 神奈川県横浜市山手  2-84-6 埼玉県草加市弥勒   51-98 と入力されてますが A列にC列から 県名を抽出 B列に市・区名を抽出を 関数を使ってできないでしょうか? 又、C列の県名と市・区名を消したいのですが

  • 文字数の制限の確認

    エクセルで C列に商品名が入ってます。以前から文字数を気にせず商品名を決めていたのですが、販売ソフトの導入で文字数の制限を掛けることになりました。文字数は全角18文字以内です。半角もつかえます。現状は名称に半角・全角が混じっています。文字数制限内か否かを関数で調査し、全角18文字より長い場合は「ながいですよ」ってD列に記入したいのです。教えてください。

  • Excel 文字数に制限あり??

    Excel 「CONCATENATE」文字数に制限あり?? 「B列からF列」までに入力された数字・文字・数式を、同じシート内の「H列」にて1行に表示させるため数式を入れていますが、文字数が255文字を(スペース含む)超えると【#VALUE!】(値のエラー)が出ます。 このエラーを回避し、正しく表示させる方法はありますでしょうか? ======================================================== *B列、D列、F列  数字、文字など、直接入力されています(空のセルあり) *C列、E列(参照先のセルが空白の場合あり)  =IF(ISERROR(INDIRECT("'シート名'!D2")),"",INDIRECT("'シート名'!D2")) *H列  =CONCATENATE(TEXT(B2,";;;@"),TEXT(C2,";;;@"),TEXT(D2,";;;@"),TEXT(E2,";;;@"),TEXT(F2,";;;@")) ======================================================== 分かりにくい説明ですみません。 よろしくお願いいたします。 環境 Win XP /Excel 2003

  • EXCEL: 文字数制限

    すみません、どなたか教えてください。 セルC1に対して、文字数制限(50文字まで)をかけたいのです。メッセージboxを表示して。 C1には関数で「=A1&" "&B1」となっています。 A1とB1には文字列が入力されています。 この2つの文字列を組み合わせた文字列がC1にきます。 C1に対して、メニューバーの「データ」/「入力規則」で設定はしているのですが、関数で値を求めているせいか、メッセージboxが表示されません。セルC1に直接入力するとメッセージは表示されるのですが…。ちなみに、文字列にあるスペースもカウントしたいです。 よろしくお願いします。

  • Excel2010 住所5分割

    東京都豊島区東池袋3丁目1番1号 東京都八王子市子安町4丁目10番15号 神奈川県川崎市高津区明津12番地メゾン美鈴 とある住所を「都道府県」「市区町村郡」「通称名」「○丁目」「番地ビル」 のように分割したいです。  M列     N列      O列     P列      Q列    都道府県  市区町村郡    通称名    丁目      番地 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 「東京都」 「豊島区」   「東池袋」  「3丁目」  「1番1号」 「東京都」 「八王子市子安町」      「4丁目」  「10番15号」 「神奈川県」 「川崎市高津区」 「明津」      「12番地メゾン美鈴」 5万近く件数があり手作業では無理なので、関数かVBAで出来れば助かります。 都道府県とそれ以降の分割しかわかりません。 宜しくお願いします。

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

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

専門家に質問してみよう