エクセル勉強中です。問題集で理解できないところがあります。
数式がどういう意味をもつのか教えて頂けるとありがたいです。
よろしくお願いします。
画像添付の問題になります。
A列に製品名が入っています。(製品番号:半角文字)(製品名:全角文字)
B列に半角文字の製品番号だけを取り出しなさいというものです。
半角文字の開始位置がバラバラになっているところが問題のポイントになっています。
回答ですが
B2:
=MID(A2,MATCH(1,INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0),),LEN(A2)*2-LENB(A2))
こちらで半角文字のみ取り出せるようです。回答には数式のみで何故この関数を使うのか?
使うことでどういった結果を導くなどの解説が一切ありません。(ちなみに出版会社の便利技的な問題集です)
MID関数で製品名A2から開始位置を指定して、全角半角をLEN関数LENB関数で半角文字数を
算出して文字列を抽出するという事は理解できます。
ただ、この開始位置の指定の所が理解できません。
数式を分割してみましたが
=MID(A2,COLUMN(2:2),1)の所はどの行も製品名の1文字目ですよね・・・
その値にLENB関数で文字数?
数式の検証で見てみると配列のような結果が次々と現れて・・・
MATCH関数もありますしINDEX関数が何か関係しているような気はしているのですが、
INDEX関数と言えば配列に行番号・列番号と例えば表の該当するセルの位置抽出の
知識しかありません。一つのセルでINDEX関数?
すいません。独学で勉強していてこの程度の知識ですが、この数式の考え方教えてくださる方よろしくお願いします。
No.6ベストアンサー
- 回答日時:
ご質問のような半角文字を抽出するなら、提示された数式は一部非効率でわかりにくいところがありますが、個人的には最も簡単な配列数式になっていると思いますので参考までに検証方法を補足します。
まずB2セルに以下の式を入力してください(半角文字が11文字目までに出現する場合)。
=MID(A2,MATCH(1,INDEX(LENB(MID(A2,COLUMN(A:K),1)),0),),LEN(A2)*2-LENB(A2))
COLUMN関数の部分はROW関数で以下のようにするほうが数式がわかりよいかもしれません。
=MID(A2,MATCH(1,INDEX(LENB(MID(A2,ROW($1:$11),1)),0),),LEN(A2)*2-LENB(A2))
この画面上部の数式バーの数式のCOLUMN(A:K)(またはROW($1:$11))の部分をドラッグして選択しF9キーを押すと,「{1,2,3,4,5,6,7,8,9,10,11}」と表示されます(Escで解除)。
次に、MID(A2,COLUMN(A:K),1)の部分を選択し、F9キーを押すと、「{"お","徳","用","M","G","0","5","K","R","カ","ラ"}」とA2セルの先頭から11文字目までの文字が取得できていることがわかります。
次に、LENB(MID(A2,ROW($1:$11),1))の部分を選択し(INDEXを含む部分はこの配列を範囲に変換しているだけですので、この部分を省略するならCtrl+Shift+Enterで確定する必要があります)、F9キーを押すと、「{2,2,2,1,1,1,1,1,1,2,2}」のように、それぞれの文字の半角、全角が1と2で表示されます。
次にMATCH(1,INDEX(LENB(MID(A2,ROW($1:$11),1)),0),)の部分はMATCH関数(第三引数が0または省略)で1(=半角文字)が最初に出現する場所を調べています(上記の例なら4番目)。
MackyNo1様
再び、ご回答ありがとうございます。
皆様からご指導いただいた内容を1つずつ確認していたら
お礼がたいへん遅くなりお詫び申し上げます。
まさにご提示いただいたような検証内容を順に作成し理解しようともがいていました。
素晴らしいです。このような内容のものがすらすらと作成できればいいのですが。
COLUMNの所は確かにROW関数を利用する方が文字数として理解しやすいですね。
LENBの所の*1についても回答者3のbunjii様のご指導で理解できました。
>一部非効率でわかりにくいところがありますが・・・
皆様からのご指導で回答者1・4 Chiquilin様も仰られる非効率が理解できました。
あくまで学習用の参考書なので編集者の方の意図はわかりませんが、ある意味
非効率の理由など皆様から教えて頂き単なる回答以上の学習ができたように思います。
この本の内容の良し悪しを判別するほどの知識がまだ私にはありません。
この先にも内容で非効率な物も出てくるかわかりません。
本を捨てた方が良いというご意見も頂戴しましたが、とりあえず残り半分程度
学習し、非効率を判別できるような知識を身につけて行きたいと思います。
すいません。重ね重ねご丁寧にありがとうございました。
No.5
- 回答日時:
何度も失礼。
もし「お徳用MG05KRカラーマグネット」から「MG05KR」を抜き出したいなら
=REPLACE(LEFT(A2,LOOKUP(100,ROW(A$1:A$99)/(LENB(MID(A2,ROW(A$1:A$99),1))=1))),1,MATCH(1,INDEX(LENB(MID(A2,ROW(A$1:A$99),1)),0),0)-1,"")
これでいいんじゃないかと思います。
Chiquilin 様
再び、ご回答ありがとうございます。
お礼が遅くなりお詫び申し上げます。
ご提示いただきました
=REPLACE(LEFT(A2,LOOKUP(100,ROW(A$1:A$99)/(LENB(MID(A2,ROW(A$1:A$99),1))=1))),1,MATCH(1,INDEX(LENB(MID(A2,ROW(A$1:A$99),1)),0),0)-1,"")
確認できました。ただ、ご想像がつくと思いますが、まだ理解はできていません。
LOOKUP(100,ROW(A$1:A$99)/(LENB(MID(A2,ROW(A$1:A$99),1))=1))),
これもLOOKUP関数 配列形式の特性を利用するテクニックなのですかね?
ご回答を下さっている皆さんにとってはテクニックではなくごく自然な事で当たり前の事なのでしょうね。
しばらく時間をかけて調べ学習したいと思います。
すいません。ご丁寧に度々ありがとうございました。
No.4
- 回答日時:
> 例えば製品名に“MG05KRカラーマグネットお徳用”というように
> “お徳用”という文字が各々に入っていた場合は目的が果たせません。
何の問題もないはずですが……
=MID(A2,IF(LENB(LEFT(A2))=1,1,LENB(A2)-LEN(A2)+1),LEN(A2)*2-LENB(A2))
でも同じです。
「お徳用MG05KRカラーマグネット」なら別ですが その場合は元の式
でもダメなはずですね?
> ようやく半分ぐらいまで進んだのですがこの本ダメなのかな??
その式を見る限りでも 突っ込みどころがいくつかあります。
まず何故「COLUMN(2:2)」なんて馬鹿な指定の仕方をしたのか合理的
な理由がありません。 Excel2003以前なら「COLUMN(2:2)」は「1~256」
くらいで ちょうど良かったかもしれませんが。「ROW(A$1:A$99」な
どとした方が よほど分かりやすいはずです。
次に「*1」が入っていますが これは飾り以上の何の意味もありません。
この部分だけを見ても この数式を書いた人が意味をほぼ理解せずに使っ
ていることが読みとれます。
INDEXを入れているのも Enter確定にしたいだけの理由です。きっぱり
無駄です。
この数式を見る限り 10年近く前の質問掲示板で流行った方法を そのま
まもってきたという印象ですね。多分理解もせずに。
Chiquilin 様
再び、ご回答ありがとうございます。
お礼が遅くなりお詫び申し上げます。
こちらの説明不足で申し訳ございません。お察しの通り
“MG05KRカラーマグネットお徳用”の各々というのは文字の前後にという意味です。
“MG05KRカラーマグネットお徳用”でも”お徳用MG05KRカラーマグネット”でも
=MID(A2,MATCH(1,INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0),),LEN(A2)*2-LENB(A2))
なら両方半角文字を抽出してくれます。
前後どちらに来ても配列内の半角文字位置を探すからだとこちらで理解しています。
「COLUMN(2:2)」につきましてはご指摘の通りムダですね。当初数式の検証で確認した際にも今思えば、
この範囲の数字の羅列が次から次にあり余計に何のこっちゃ?となりました。ほかの方も仰って頂いている
通り適度な文字数でという事ですね。
記述頂いている通りROW(A$1:A$99) 単に配列カウントが欲しいだけならCOLUMNをあえて使う必要もないのですね。
すいません。ご丁寧にありがとうございました。
No.3
- 回答日時:
>INDEX関数と言えば配列に行番号・列番号と例えば表の該当するセルの位置抽出の
知識しかありません。一つのセルでINDEX関数?
質問の数式「INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0)」はMATCH関数へ配列値を渡すための1つの方法です。
INDEX関数で1列の配列値「LENB(MID(A2,COLUMN(2:2),1))*1」から1以上の行番号を指定すると1つの値が返りますが行番号に0を指定すると配列値の全てが返ります。
この性質を利用してMATCH関数に渡せば1つのセル内の文字列を配列値としてMATCH関数に渡せます。
LENB関数は与えられた文字のバイト数を返しますのでA2セルの文字列を一文字ずつ切り離して配列値に変換できます。
LENB(MID(A2,COLUMN(2:2),1))*1の*1はLENB関数の戻り値は数値なので不要です。
数式を組み立てた人はLENB関数の戻り値が文字列と勘違いして1を乗じて数値化する積りだったと思われます。
下記の2つの数式は等価ですが、2番目の数式はCtrl+Shift+Enterで確定しないと正しい結果が得られません。
INDEX関数を介してMATCH関数に引き渡すときはEnterキーで確定しても正しい処理になります。
=MATCH(1,INDEX(LENB(MID(A2,COLUMN(2:2),1)),0),)
=MATCH(1,LENB(MID(A2,COLUMN(2:2),1)),0)
bunjii 様
早々にご回答を寄せて頂きありがとうございます。
申し訳ございません。皆さんの様に充分な知識があり柔軟に考えられれば
すぐに理解できるのでしょうが、なんせ頭を整理するのに時間がかかってしまいお礼が遅くなりました。
ご指導いただきましたINDEX関数について行番号・列番号の“0”が重要ポイントなのですね。
>1以上の行番号を指定すると1つの値が返りますが行番号に0を指定すると配列値の全てが返ります。
ここの部分ですが、仮に1つのセル内(例えばA7セル)に
=INDEX(LENB(MID(A2,COLUMN(A:K),1)),0)
と入力をして(column(2:2)はムダと教えて頂きましたので(A:K)の11文字にしています)
決定するとA7セル表示には“1”が返ってきますが表示上の問題で
配列全ての{1,1,1,1,1,1,2,2,2,2,2}で先頭の1だけが表示されている。しかし同じように
=INDEX(LENB(MID(A2,COLUMN(A:K),1)),1)
と入力するとA7セルには “1”が返ってきますが、こちらは表示上の配列の先頭ではなく
1文字目を指定した1文字で“1”
=INDEX(LENB(MID(A2,COLUMN(A:K),1)),7)
と入力すると7文字目の1文字“2”のみ返ってくる。だから今回の様にMATCHにつなげる為、
全体の配列が必要な場合は“行番号は”0“入力が必須という感じで考え方よろしいのですね?
こちらもご丁寧にご解説ありがとございました。このお礼の文面でもどこで引っかかっていたか、
こちらのレベルが容易に推測できるかと思います。
これまでINDEX関数についても配列についても何問も学習してきたつもりでしたが、
分かったつもりの浅知恵なのですね。昨日からINDEXの“0”ネットなどで色々物色してみましたが
なかなか見つけられずで、お時間かかってしまいました。
このような使い方あまり一般的ではないのでしょうか?
だいぶ賢くなったような気になっています。継続して身につけて行きたいと思います。
本当に、ありがとうございました。
No.2
- 回答日時:
数式を説明すると、まず「=MID(A2,COLUMN(2:2),1)」の部分ですが、COLUMN(2:2)は2行目の列番号、すなわち「1,2,3,4・・・・、最大列番号」のような連続する数値の配列になります。
しかし文字数がそんなに多くなることはないので、実際は「MID(A2,COLUMN(A:K),1)」のような数式にしたほうが検証も容易になるだけでなく、計算負荷が少ないので実戦的にも適切だと思います。
この数式の意味は、A2セルの1文字目から、11文字目までの1文字ずつを抽出した配列を取得している(この部分を選択してF9で計算内容が確認できます)ことになります。
次に「LENB(MID(A2,COLUMN(A:K),1))*1」の数式は上記の配列の全角半角をLENB関数で判定しています(1になる場所が半角文字)。
INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0)
上記のINDEX関数は上記の配列をCtrl+Shift+Enterで確定しなくても通常の範囲データとして扱えるようにしています(第一引数に配列、第二引数を省略または0にします)。
最後にMATCH関数で最初に1が出てくる(=半角)文字の開始位置を求めていることになります。
MackyNo1 様
早々にご回答を寄せて頂きありがとうございます。
理解を深めるのにお時間を要し遅くなりすいません。
まず、COLUMN(2:2)について2行目全体という事はカラーリファレンスで想像がついたのですが、
単体の数式でセルに入れるとCOLUMN(2:2)でも(3:3)でも結果が1になるのでどういう事??と
パニックでした。No1回答者様も仰って頂いているとおり私、配列についてド素人以下という事ですね。
COLUMN関数はCOLUMN(A1)等例えばVLOOKUP関数の時に列番号として単体数値として利用するもの
ぐらいの知識しかなかったです。
範囲にする事で配列として利用できるのですね。
A2文字列の1文字目2文字目とMID関数で1文字ずつ抽出と。
"文字数がそんなに多くなることはないので"
というのは今エクセル2013を使用していますので、16384文字分1文字ずつ抽出させている
という式になると、それによって処理時間も変わるし単にムダという事ですね。
INDEX関数は範囲にしたいだけの為なのですか。
確かに配列数式で
{=MID(A2,MATCH(1,LENB(MID(A2,COLUMN(A:K),1))*1,0),LEN(A2)*2-LENB(A2))}
と入力すれば同じ結果が得られました。
お忙しい中ご丁寧に順序立てて、この猿にでも(猿以下かも知れませんが)理解できる
ご解説ありがとうございました。まだ、このようなレベルなものなので応用が利くほどでは
ございませんが、繰り返し繰り返しで少しずつより深く知識を身につけて行きたいと思います。
本当に、ありがとうございました。
No.1
- 回答日時:
読んでる限り 現時点であなたに説明してもまず理解できないと思います。
おそらく配列数式すら分かりませんよね? 配列計算と INDEXの配列の
使い方を理解しないと 説明しても分かったつもりになるのが関の山です。
「COLUMN(2:2)」という使い方から見て 10年近く前にネットで出回っ
ていた数式をそのままパクったのだろうと思います。
というか今回の場合なら そんな馬鹿みたいな(失礼)式いらんでしょう。
半角の文字列はどちらか一方に固まっていることが前提なんだから
=IF(LENB(LEFT(A2))=1,LEFT(A2,LEN(A2)*2-LENB(A2)),RIGHT(A2,LEN(A2)*2-LENB(A2)))
これでいいはずです。1000件くらいで試してみれば分かりますが 処理
の重さが全く違います。
> ちなみに出版会社の便利技的な問題集です
数式見る限り碌な会社ではないです。その本 捨てた方がいいと思います。
Chiquilin様
早々にご回答を寄せて頂きありがとうございます。
学習中でこれまでも色々な問題を繰り返し解いていきながら
Excelの理解を深めている途中です。ご指摘の通り“分かったつもりに”っていうのが
今の私の的確なるご指摘ですね。。。
バカには無理ですかね~まだハードルが高すぎるのか?
そんな私にご回答を寄せて頂きありがとうございます。
ご指導いただきましたIF関数の数式
=IF(LENB(LEFT(A2))=1,LEFT(A2,LEN(A2)*2-LENB(A2)),RIGHT(A2,LEN(A2)*2-LENB(A2)))
こちらについては私も考えました。仰る通りこの問題に関してはこの数式でも回答が得られますが、
例えば製品名に“MG05KRカラーマグネットお徳用”というように“お徳用”という文字が各々に入っていた場合は目的が果たせません。
ただ、回答にある数式でしたらこの商品名でも対応できます。(まぁ商品名なんて色々になりますので無理やり感は否めませんが)目的はあくまで学習であり関数の理解ですので、できればまず何となくでもどういった数式なのか?きっかけをつかみ理解を深められればと思いご質問させて頂きました。
出所について、商品名はこのような所でまずいのかと思いまして濁しましたが
○和○ステムの○○○○極意っていう物です。
一応伏せ文字にしてみました。
ようやく半分ぐらいまで進んだのですがこの本ダメなのかな??
すいません。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- その他(ソフトウェア) ソースネクストアプリをインストールし、製品登録で半角英数字が入力できない 5 2022/07/03 22:44
- Excel(エクセル) エクセルで重複データから重複を削除して指定の列に抽出したい 11 2022/05/11 11:26
- Excel(エクセル) MID関数について 2 2022/04/22 09:13
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
フォントについて教えてください!
みなさんの一番好きなフォントは何ですか? よく使うフォントやこのフォント好きだなあというものをぜひ教えてください!
-
これが怖いの自分だけ?というものありますか?
人によって怖いもの(恐怖症)ありませんか? 怖いものには、怖くなったきっかけやエピソードがあって聞いてみるとそんな感覚もあるのかと新しい発見があって面白いです。
-
自分の通っていた小学校のあるある
進学したり大人になってから、「あれって自分の小学校だけだったのかな」と思うことありますよね。 逆に「他の小学校ってそんなことするの!?」と思ったり。 そんな「自分の通っていた小学校」のあるあるを教えてください!
-
我がまちの「給食」自慢を聞かせてっ!
富山県の給食には「ベニズワイガニ」が出る、、、なんて話を聞いたことがあります。 日本全国「え、給食にそれ出るの!?」な驚きメニューがまだまだあるはず!
-
エクセルで、半角文字列を抽出するには
Excel(エクセル)
-
EXCELで、セル内の半角カナのみを削除する関数
Excel(エクセル)
-
Excel2007でカタカナの文字のみを抽出、表示するには?
その他(Microsoft Office)
-
-
4
文字列から英数字のみを抽出する関数
Excel(エクセル)
-
5
EXCELで、漢字のみ抽出する式を教えてください。
Excel(エクセル)
-
6
エクセルで全角と半角を分離する方法って?
Excel(エクセル)
-
7
Excelで半角の文字を含むセルを探したい
Excel(エクセル)
-
8
Excel VBA 半角英数の抽出もしくは全角文字の削除
Excel(エクセル)
-
9
テキストの半角文字を全部削除したい
その他(パソコン・スマホ・電化製品)
-
10
《excel or word》全角文字を検索して削除、もしくは半角文字のみを抜き出したい
Word(ワード)
-
11
全角文字と半角数字を分けるには?
Excel(エクセル)
-
12
エクセルの削除
Excel(エクセル)
-
13
2バイト文字を一括削除するマクロ
Word(ワード)
-
14
excelシート内で半角文字を検索したい
Excel(エクセル)
-
15
半角/全角文字混在データの分割方法
Visual Basic(VBA)
-
16
Excelにて、カタカナだけのセルを抜き出す方法は?
Excel(エクセル)
-
17
セル内文章から、英数字のみ取り出す関数を教えてください
Excel(エクセル)
-
18
エクセル、関数でセル内の半角カタカナ漢字、を分けて他のセルへ表示する方法
Excel(エクセル)
-
19
エクセルでセルの中身が漢字かどうか識別する方法は?
Excel(エクセル)
-
20
エクセルで(1)文字列の中からひらがなだけを削除(2)文字列の中からカタカナだけを削除 する方法
その他(OS)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォルダの中にファイルがある...
-
PC Excel マクロ
-
【マクロ】関数の入力にてエラ...
-
excelVBAについて。
-
AA、AA(1)、BB、BB(1)、CC、CC(...
-
【マクロ】AブックからBブック...
-
納期順に勝手に並べ替えられる...
-
エクセルで作れる簡単なスケジ...
-
エクセルの数式について教えて...
-
エクセルの印刷について
-
エクセルを使ってQRコードを作...
-
Excelで並べ替えをするとおかし...
-
エクセルシートの作成(関数)...
-
履歴書をパソコンで描きたいの...
-
【関数】データベースから2つ...
-
エクセルのブック名の付け方
-
エクセルで、数字ではない値(...
-
XMLHTTP60で前日のデータが取れ...
-
識別子の表示について
-
VLOOKUP関数で複数条件を設定に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
excelVBAについて。
-
excelVBAについて。
-
UNIQUE関数、配列数式を使わず...
-
エクセルのデータ整理の方法
-
11ケタの数字を打つと、エク...
-
エクセルの関数ついて
-
エクセル初心者です 用語とか良...
-
エクセル2021 範囲指定印刷をす...
-
【マクロ】メッセージボックス...
-
Excelで合計を求めたいです
-
IEを使わずHTMLを取得する
-
1.5ヶ月分の費用按分 エクセル関数
-
エクセル初心者です 用語等まだ...
-
excelVBAについて。
-
エクセルの不調について
-
Excelで、毎月の月曜と金曜の合...
-
vbe でのソースコード参照(msgb...
-
エクセル数式に問題があります
-
アクセス2016 エクセル2016 重...
おすすめ情報