- ベストアンサー
Excelの電話番号からハイフンを取り除く方法
- 電話番号からハイフンを取り除くExcelの関数について質問です。末尾のハイフンだけは取りたくない場合はどうすればいいか教えてください。
- 質問者は、「=SUBSTITUTE(A1,"-","")&RIGHT(A1,MATCH("*"&RIGHT(SUBSTITUTE(A1,"-",''),1)&"*",INDEX(RIGHT(A15,COLUMN(1:1)),),0)-1)」という関数を見つけたが、COLUMN(1:1)やRIGHT(A1,COLUMN(1:1))の意味が理解できずに困っているそうです。
- 質問者は、関数の部分は他の人の修正したものを利用しており、具体的な意味はわからないと述べています。COLUMN(1:1)は配列を返しているが意味がわからないし、RIGHT(A1,COLUMN(1:1))でなぜ「8」が返されるのかもわかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>実は、前半のSUBSTITUTE(A1,"-","")部分以外は全く自分ではわからず、似た様な関数が掲載されていたネット部分を修正して作りました。 >COLUMN(1:1)はどういう意味なのでしょうか? エクセル2003までなら、COLUMN(1:1)は1行目の列番号の配列、すなわち1から256までの連続した数字(配列)を返します。 ちなみに最大文字数がもっと短いならCOLUMN(A1:P1)などに変更することも可能です(この方が計算負荷が少ない)。 数式の後半部分を説明すると、 INDEX(RIGHT(A15,COLUMN(1:1)),)の部分は RIGHT関数でA15セル(A1セルの間違い?)の文字列の右から1文字、2文字、・・・、256文字(文字数が満たない場合は最大文字数)を切り取った文字列の配列を取得し、その配列をINDEX関数で範囲に変換しています(Ctrl+Shift+Enterで確定するならINDEX関数は不要)。 例えば、「0312345678---」なら、「-」「--」「---」「8----」「78---」・・・と続く配列になります。 "*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*"の部分は A1セルから「‐」を削除した文字列の一番右の文字の前後にワイルドカード文字を挿入して、一番右の文字の前後に何か文字列が続いている(何もない場合もOK)文字列を示しています。 例えば、「0312345678---」なら、「*8*」になりますが、実際の数式では前方の文字列はMATCH関数で考慮する必要はないので前半の「"*"&」の部分は必要なく、「RIGHT(SUBSTITUTE(A1,"-",""),1)&"*"」の部分だけでOKです。 MATCH("*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*",INDEX(RIGHT(A15,COLUMN(1:1)),),0)の部分は MATCH関数は、上記のワイルドカード文字を含む検索値(すなわち最後のハイフンの前の文字列の前後に任意の文字列が続く)をRIGHT関数で元の文字列の右から1文字、2文字、・・・、256文字を切り取った文字列の配列の中から検索し、最初に見つかったデータの位置を求めることができます。 この位置は、最後のハイフンの前の数字ですので(8---が最初にヒット)、これから1を引いた数が最後のハイフンの数になるわけです。
その他の回答 (4)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
#1です。回答が表示されないようなのでもう一度 かなりややこしい式ですね。 問題の部分 =RIGHT(A1,MATCH("*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*", INDEX(RIGHT(A1,COLUMN(1:1)),),0)-1) 1. RIGHT(SUBSTITUTE(A1,"-",""),1) は いちばん右の数字 サンプルの場合8 2. "*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*" アスタリスクを前後に入れる(ワイルドカード) "*8*" 3. RIGHT(A1,COLUMN(1:1)) 右の1文字分を配列の1列目("-")、右2文字分を配列の2列目("--")・・・256列目("03-1234-5878---") サンプルの配列は(配列定数で途中まで提示) {"-","--","---","8---","78---","878---","5878---","-5878---","4-5878---","34-5878---","234-5878---","1234-5878---","-1234-5878---","3-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---"} 4. INDEX関数は 配列を認識させるためのもの ([Ctrl]+[Shft] +[Enter] で確定すればINDEX関数不要) 5. MATCH関数で、8を含んだものを探す。 4列めに最初に見つかるので 4 ここまで分かればよいでしょうか? 考え方は似ていますが =SUBSTITUTE(A1,"-","")&RIGHT(A1,LEN(A1)+1-FIND("--",A1&"--")) "--"を検索させ、右の"-"をくっつける。
お礼
CoalTarさん、再びありがとうございます。 震災でシステムがストップしてしまいまして、システムがようやく今週より稼動し始めました。 それまでにたまった仕事を今週ずっとやっていました。 今回質問させていただいた数式は、震災以前に「どうにかして」と言われていた課題の1つでした。 それで残業が続いたりした為、お礼が遅れて申し訳ございませんでした。 皆さんのおかげで理解出来たような気がいたします。 ありがとうございました。
- mu2011
- ベストアンサー率38% (1910/4994)
>なぜCOLUMN(1:1)だとうまくいくのに、1だとダメなのでしょうか。 >そもそも、COLUMN(1:1)というのはどういうことなのでしょうか。 ⇒INDEX関数の範囲として、RIGHT関数の文字数を1・2・3・・・で配列化とする工夫の為に使用しているから1では駄目です。 例えば、配列は、(1)"-",(2)"--",(3)"---",(4)"0---"・・・になり、検索値の"*0*"から 4が戻され、-1とする事で入力セルの末尾ハイフンの文字数の3が求まることになる。 電話番号のハイフンの構成バリエーションが色々あり且つ、末尾のハイフンの個数がランダムで ある為、かなり練られた数式と思います。
お礼
mu2011さん、コメントありがとうございます。 お礼が遅れてすみませんでした。 >⇒INDEX関数の範囲として、RIGHT関数の文字数を1・2・3・・・で配列化とする工夫の為に使用しているから1では駄目です。 そうなんですね。 COLUMN(1:1)が1を返しているからと、1にしてはだめなんですね。 配列の理解が乏しいのと、複数のセル範囲のみならず、1つのセルの中で文字を分割して配列化できるという発想がなかったので混乱していました。 皆さんが教えてくださったおかげで少しずつわかってきました。 ありがとうございました。
「末尾のハイフン」より左のハイフンが二つと決まっているなら、次式で如何かと。 =SUBSTITUTE(SUBSTITUTE(A1,"-","",1),"-","",1)
お礼
mike_gさん、コメントありがとうございました。 お礼が遅れましてすみませんでした。 実は末尾のハイフンより左のハイフンも2つとは限らないのです。 私も一瞬mike_gさんがおっしゃるような式でいいかなと思ったのですが、2つ以上のケースもたまにあることを思い出してしまいました。 ありがとうございました。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
かなりややこしい式ですね。 問題の部分 =RIGHT(A1,MATCH("*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*",INDEX(RIGHT(A1,COLUMN(1:1)),),0)-1) 1. RIGHT(SUBSTITUTE(A1,"-",""),1) は いちばん右の数字 サンプルの場合8 2. "*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*" アスタリスクを前後に入れる(ワイルドカード) "*8*" 3. RIGHT(A1,COLUMN(1:1)) 右の1文字分を配列の1列目("-")、右2文字分を配列の2列目("--")・・・256列目 サンプルの配列は(配列定数で途中まで) {"-","--","---","8---","78---","878---","5878---","-5878---","4-5878---","34-5878---","234-5878---","1234-5878---","-1234-5878---","3-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---","03-1234-5878---"} 4. INDEX関数は 配列を認識させるためのもの ([Ctrl]+[Shft] +[Enter] で確定すればINDEX関数不要) 5. MATCH関数で、8を含んだものを探す。 4列めに最初に見つかるので 4 考え方は似ていますが =SUBSTITUTE(A1,"-","")&RIGHT(A1,LEN(A1)+1-FIND("--",A1&"--")) "--"を検索させる
お礼
CoalTarさん、回答ありがとうございました。 お礼が遅れてすみませんでした。 ご丁寧に回答していただき、とても感謝しています。 質問事項のみならず(こちらも知りたかったのですが)、[Ctrl]+[Shft] +[Enter] で確定した時についても教えていただき、ありがとうございます。 だいぶ関数の意味がわかるようになりました。 まだ配列の部分は何となくでしかありませんが、だいぶわかるようになった気がします。 ありがとうございました。
お礼
MackyNo1さん、ありがとうございました。 お礼が遅れてすみません。 "*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*"の部分は、最初の"*"&は不要なのですね。 >ちなみに最大文字数がもっと短いならCOLUMN(A1:P1)などに変更することも可能です(この方が計算負荷が少ない)。 こちらも全くわかりませんでした。 最大文字数は実はわかりませんが、電話番号なので一番長そうな国際電話を考えてもそれほど長くはならないんかもしれません、 できそうならやってみます。 ありがとうございました。
補足
>RIGHT関数でA15セル(A1セルの間違い?) すみません。 そうですね。 A1の間違いでした。 ご指摘ありがとうございました。