
こんにちは。
OSはWindowsXP、Excelは2003を使用している者です。
電話番号からハイフンをとりたいのですが、電話番号の末尾についたハイフンだけは取りたくないのです。末尾のハイフンはいくつつくかわかりません。
関数でそれを実現したいと思っています。
例えば、ExcelのA1セルに
03-1234-5678---
という電話番号があるとします。
関数の結果としては、
0312345678---
という結果を返してほしいのです。
そこで、ネットでいろいろ調べて以下の関数を作るに至りました。
=SUBSTITUTE(A1,"-","")&RIGHT(A1,MATCH("*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*",INDEX(RIGHT(A15,COLUMN(1:1)),),0)-1)
03-1234-5678---のハイフンを一度全部取り(前半のSUBSTITUTE(A1,"-","")部分)、その後一番右側にあるハイフンと合体させています。
実は、前半のSUBSTITUTE(A1,"-","")部分以外は全く自分ではわからず、似た様な関数が掲載されていたネット部分を修正して作りました。
よって、どうしても意味不明な箇所があります。
COLUMN(1:1)はどういう意味なのでしょうか?
1~256の配列を返しているという風に言っている人がいましたが、それの意味が理解できません。
また、上の例で言うとRIGHT(A1,COLUMN(1:1))の部分では「8」を返すようなのですが、どうしてでしょうか。
COLUMN(1:1)=1になるみたいなのでRIGHT(A1,1)としてみるとエラーになってしまいます。
なぜCOLUMN(1:1)だとうまくいくのに、1だとダメなのでしょうか。
そもそも、COLUMN(1:1)というのはどういうことなのでしょうか。
大変お手数ですが、どうしてもわかりません。
どなたかお詳しい方、教えていただけますでしょうか。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
>実は、前半の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を引いた数が最後のハイフンの数になるわけです。
この回答への補足
>RIGHT関数でA15セル(A1セルの間違い?)
すみません。
そうですね。
A1の間違いでした。
ご指摘ありがとうございました。
MackyNo1さん、ありがとうございました。
お礼が遅れてすみません。
"*"&RIGHT(SUBSTITUTE(A1,"-",""),1)&"*"の部分は、最初の"*"&は不要なのですね。
>ちなみに最大文字数がもっと短いならCOLUMN(A1:P1)などに変更することも可能です(この方が計算負荷が少ない)。
こちらも全くわかりませんでした。
最大文字数は実はわかりませんが、電話番号なので一番長そうな国際電話を考えてもそれほど長くはならないんかもしれません、
できそうならやってみます。
ありがとうございました。
No.5
- 回答日時:
#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つでした。
それで残業が続いたりした為、お礼が遅れて申し訳ございませんでした。
皆さんのおかげで理解出来たような気がいたします。
ありがとうございました。
No.4
- 回答日時:
>なぜ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つのセルの中で文字を分割して配列化できるという発想がなかったので混乱していました。
皆さんが教えてくださったおかげで少しずつわかってきました。
ありがとうございました。
No.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列目
サンプルの配列は(配列定数で途中まで)
{"-","--","---","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] で確定した時についても教えていただき、ありがとうございます。
だいぶ関数の意味がわかるようになりました。
まだ配列の部分は何となくでしかありませんが、だいぶわかるようになった気がします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelでなぜこのような式をつかっているのでしょうか、行に1,2,3と連番を振るだけなのに 5 2023/04/08 20:00
- Excel(エクセル) substitute関数についての質問です 3 2023/06/21 11:57
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- Excel(エクセル) 何故割り算なのでしょうか? 6 2022/11/09 13:30
- Excel(エクセル) セル内の一部に別セルを差し込む 3 2022/09/18 04:39
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COLUMN(1:1)の意味を教え...
-
excelの、ある数式内の{}の意...
-
数値を浮動小数点32bitHEXコー...
-
○桁にある数値を取得する VB.N...
-
vbsでテキストファイル内の文字...
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
Excel-vba 文字列と変数を...
-
プレゼント交換プログラム
-
C言語(DXlib)での音ゲーについ...
-
CGIのPerlの変数をJavaScrip...
-
C#でのIF文 時間比較のやり方
-
1つ前の値を変数に保存する方法
-
VBScriptでの正規表現パターン...
-
C言語 アロー演算子について質...
-
Windows11のカメラで動画を撮り...
-
for the first timeとfirst tim...
-
VBAで配列のNULL判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の値を置換するにはどうす...
-
excelの、ある数式内の{}の意...
-
vbsでテキストファイル内の文字...
-
VBAのWorksheetFunctionの引数...
-
COLUMN(1:1)の意味を教え...
-
数値を浮動小数点32bitHEXコー...
-
VB6で配列を文字列に変換する方...
-
エクセル、この関数の意味は?
-
○桁にある数値を取得する VB.N...
-
VB 配列の内容をファイルに書...
-
VB.NET 2つの配列を連動して並...
-
RichTextBoxの改行を認知してく...
-
copyRecordsetの数値16桁以上に...
-
エクセルへのデータの貼付時に...
-
VBAで配列に文字列が入らない?
-
VBSで特定の文字列が含まれる場...
-
in_addrからchar型の文字列の変換
-
VB.NET 2次元配列
-
配列要素の演算
-
Win32APIでシリアル通信をする...
おすすめ情報