Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
IF関数とCOUNTIF関数で困っています。
投稿日時: 21/06/03 14:59:53
投稿者: まゆエクセル

はじめまして。
商品マスターを作成するのに、
てこずっていて、困っています。
 
セルにある商品名が
末尾にこの二つがある場合に、
 
*R*
*RW*
 
*R*が入っていると、*R*
*RW*が入っていると、*RW*
 
と表示できるようにするには、どういう関数になりますか?
 
IFとCOUNTIFを組み合わせて、別々ならできました。
(ただし、*R*と指定しても、*RW*にRが入ってくるから、Rが末尾にあるもの
すべて取り出してくる、というふうになって、正確性にかけてしまいます。
 
よろしくお願いいたします。
 

回答
投稿日時: 21/06/03 15:36:25
投稿者: QooApp

具体例を提示してもらえますか。
 
「*」は正規表現のワイルドカードだと思いますが、正確な意見を提示できません。
*R*と*RW*をそれぞれ検索するとき、RWの商品がRで検索した時に出現してしまうのであれば、
先にRWを検索し、検索結果がFALSEになっている商品に対してRで検索すればいいんじゃないでしょうか。

回答
投稿日時: 21/06/03 15:44:00
投稿者: QooApp

商品名       判定結果
リンゴRサイズ    *R*
イチゴRWサイズ   *RW*
柿RW        *RW*
バナナR       *R*
RWパイナップル   *RW*
 
こうなればいいってことですか?
あってるならば、判定結果の一番上の数式に下記数式を代入、下へ複製してください。
 
▼数式
=IF(COUNTIF(A2,"*RW*")>0,"*RW*",IF(COUNTIF(A2,"*R*")>0,"*R*",""))

回答
投稿日時: 21/06/03 15:52:54
投稿者: QooApp

連投すみません
 
上記で掲示した数式は、あくまでも「セルに R or RW が含まれれば」という判定なので、
「どこから商品名末尾なのか」という判定を無視しています。
そこは具体例がない状態ではどうにも答えられません。
 
商品名が「Re:ゼロから始める・・・・」というような場合でも判定されますのでそこはご注意ください。
「商品名の頭何文字はカウントしない」とするならば
 
=RIGHT("セルまたは文字列をここに入力",LEN("セルまたは文字列をここに入力")-5)

「文字列をここに入力」
 
とすると左から5文字(-5の部分が消したい文字数)を無視してテキスト出力されます。
末尾しか判定しないのであればこのような工夫が必要です。

回答
投稿日時: 21/06/03 16:26:15
投稿者: Suzu

引用:
セルにある商品名が
末尾にこの二つがある場合に、
  
*R*
*RW*

 
との事なので、
 
末尾に、ワイルドカードとしての 【*】が入る事 はあり得ないので、単なる文字なのかと思いました。
 
なので、純粋にセルの文字数を取得し、検索対象文字の文字数を減数として渡せば判定できると思いました。
 
=IF(MID(A1,LEN(A1)-2,3)="*R*","*R*",IF(MID(A1,LEN(A1)-3,4)="*RW*","*RW*",""))
 
減数を直接 数として渡さないで、文字列を指定するのであれば
=IF(MID(A1,LEN(A1)-LEN("*R*")+1,LEN("*R*"))="*R*","*R*",IF(MID(A1,LEN(A1)-LEN("*RW*")+1,LEN("*RW*"))="*RW*","*RW*",""))
こんな感じでしょうか・・

回答
投稿日時: 21/06/03 21:53:06
投稿者: んなっと

「末尾」だからこうしたほうがいいのかもしれないような気がしてきました。
修正。
 
=IF(COUNTIF(A2,"*?RW*"),"*RW*",IF(COUNTIF(A2,"*?R*"),"*R*",""))
 
※大文字小文字も区別するとき
=LOOKUP(1,0/FIND({"","R","RW"},MID(A2,2,LEN(A2)-1)),{"","*R*","*RW*"})

投稿日時: 21/06/04 10:30:44
投稿者: まゆエクセル

QooApp さんの引用:
商品名       判定結果
リンゴRサイズ    *R*
イチゴRWサイズ   *RW*
柿RW        *RW*
バナナR       *R*
RWパイナップル   *RW*
 
こうなればいいってことですか?
あってるならば、判定結果の一番上の数式に下記数式を代入、下へ複製してください。
 
▼数式
=IF(COUNTIF(A2,"*RW*")>0,"*RW*",IF(COUNTIF(A2,"*R*")>0,"*R*",""))
 

そうです!そうです!ありがとうございます。
おっしゃる通りやってみたら、できました〜(涙)
 
ただ、商品名の他のところに、Rが入ってくると、
そちらも、検出されてしまいます。
 
例)
ボウル13CM ブルーR 1P *WB*

投稿日時: 21/06/04 10:36:29
投稿者: まゆエクセル

んなっと さんの引用:
「末尾」だからこうしたほうがいいのかもしれないような気がしてきました。
修正。
 
=IF(COUNTIF(A2,"*?RW*"),"*RW*",IF(COUNTIF(A2,"*?R*"),"*R*",""))
 
※大文字小文字も区別するとき
=LOOKUP(1,0/FIND({"","R","RW"},MID(A2,2,LEN(A2)-1)),{"","*R*","*RW*"})

 
 
んなっとさん、
お忙しい中ありがとうございます。
皆さんのやさしさが沁みます。
こちらで、やってみたら、商品名の途中にRが入っった場合も*R*で検出されてしまうようです。涙
 

投稿日時: 21/06/04 10:44:56
投稿者: まゆエクセル

Suzu さんの引用:
引用:
セルにある商品名が
末尾にこの二つがある場合に、
  
*R*
*RW*

 
との事なので、
 
末尾に、ワイルドカードとしての 【*】が入る事 はあり得ないので、単なる文字なのかと思いました。
 
なので、純粋にセルの文字数を取得し、検索対象文字の文字数を減数として渡せば判定できると思いました。
 
=IF(MID(A1,LEN(A1)-2,3)="*R*","*R*",IF(MID(A1,LEN(A1)-3,4)="*RW*","*RW*",""))
 
減数を直接 数として渡さないで、文字列を指定するのであれば
=IF(MID(A1,LEN(A1)-LEN("*R*")+1,LEN("*R*"))="*R*","*R*",IF(MID(A1,LEN(A1)-LEN("*RW*")+1,LEN("*RW*"))="*RW*","*RW*",""))
こんな感じでしょうか・・

 
SUZUさん!
本当に、ありがとうございます。
やってみたところ、末尾だけと思ったら、
その後に、1Pと入れている商品名がありました。。。(ちーん)
それ以外は完璧に拾ってこれてます。
 
シリーズ名(空白)サイズ(空白)商品名(空白)商品名2(空白) *RW* 1P
みたいな感じです。

回答
投稿日時: 21/06/04 11:33:05
投稿者: んなっと

最初から具体例を表形式で書けばよかったとは思いませんか?
 
              A   B
1            商品 結果
2   ボウル13CM ブルーR 1P *WB*   
3 ボウル13CM ブルーR 2P *RW* 1P *RW*
4  ボウル13CM ブルーR 2P *R* 2P  *R*
 
B2
=IF(COUNTIF(A2,"*~*RW~**"),"*RW*",IF(COUNTIF(A2,"*~*R~**"),"*R*",""))
下方向・↓

回答
投稿日時: 21/06/04 11:42:15
投稿者: んなっと

不要だとは思いますが、もしも大文字(*R*)小文字(*r*)も区別するときは
=LOOKUP(1,0/FIND({"","*R*","*RW*"},A2),{"","*R*","*RW*"})

回答
投稿日時: 21/06/04 11:48:38
投稿者: Suzu

回答者は、質問者の質問文から いろいろ推測し回答しています。
 
いろいろ曖昧な事もありながらも回答するのです。
その回答をもって、質問者の方の 助けになればと思っています。
回答内容で、質問者の希望の動作にならなくともヒントになればと思っています。
 
 
それらの内容に対し、まゆエクセルさんは、希望の結果が得られるかの確認はされている様ですが
内容は確認されていますか?
 
 
QooApp さんは 具体例を求めており、それに対し、

引用:
ボウル13CM ブルーR 1P *WB*

 
これで、「*」は、正規表現のワイルドカードでは ないと判断できましたが、
 
COUNTIF の場合、「*」はワイルドカードと判定されます。
なので「R」も対象となってしまうのです。
 
・ワイルドカードと認識させたくなければ、COUNTIF関数ではなく、SUBSTITUTE関数を使う。
・「*」を予め別文字に置換し、COUNTIF関数を使う。
 
 
これは *WB* が求めたいのですか? *R*、*RW* だったのでは?
 
このキーワードは何個あるのですか?
何個もあるのであれば、末尾に、1P が含まれている分も含め 列方向に、キーワードを配し
 
                            *W*    *RW*  *R*    *RW* 1P
ボウル13CM ブルーR 1P *WB*     FALSE  FALSE  FALSE  FALSE
ボウル13CM ブルーR 1P *W*       TRUE  FALSE  FALSE  FALSE
ボウル13CM ブルーR 1P *RW*     FALSE   TRUE  FALSE  FALSE
ボウル13CM ブルーR 1P *R*      FALSE  FALSE   TRUE  FALSE
ボウル13CM ブルーR 1P *RW* 1P  FALSE  FALSE  FALSE   TRUE

B2: =MID($A2,LEN($A2)-LEN(B$1)+1,LEN(B$1))=B$1
   下方向・右方向 オートフィルとしてみてください。

回答
投稿日時: 21/06/04 12:00:56
投稿者: Suzu

んなっとさん
「*」そのものを 検索対象とした場合には、「〜」をエスケープ文字として使用できたのですね。
 

引用:
・ワイルドカードと認識させたくなければ、COUNTIF関数ではなく、SUBSTITUTE関数を使う。

は取り下げさせてください。

回答
投稿日時: 21/06/04 12:42:08
投稿者: んなっと

*から*までを取り出すのであれば、
 
              A   B
1            商品 抽出
2   ボウル13CM ブルーR 1P *WB* *WB*
3 ボウル13CM ブルーR 2P *RW* 1P *RW*
4  ボウル13CM ブルーR 2P *R* 2P  *R*
5 ボウル13CM ブルーR 2P *RW* 3P *RW*
6  ボウル13CM ブルーR 2P *R 4P   
7  ボウル13CM ブルーR 2P R* 5P   
 
B2
=IF(COUNTIF(A2,"*~**~**"),"*"&TRIM(MID(SUBSTITUTE(A2,"*",REPT(" ",200)),200,200))&"*","")
下方向・↓

投稿日時: 21/06/07 11:03:00
投稿者: まゆエクセル

んなっと さんの引用:
最初から具体例を表形式で書けばよかったとは思いませんか?
 
              A   B
1            商品 結果
2   ボウル13CM ブルーR 1P *WB*   
3 ボウル13CM ブルーR 2P *RW* 1P *RW*
4  ボウル13CM ブルーR 2P *R* 2P  *R*
 
B2
=IF(COUNTIF(A2,"*~*RW~**"),"*RW*",IF(COUNTIF(A2,"*~*R~**"),"*R*",""))
下方向・↓

 
んなっとさん
ありがとうございます。
こちらの数式で大丈夫でした!!!
本当にありがとうございます。
自分のエクセルレベルがまだまだだということを感じました。
時間の余裕ができたので、一つ一つ、みなさんから頂いた
コメントの内容の意味をちゃんと落とし込み、次回にいかします。ありがとうございました。