• ベストアンサー

エクセルで文字列検索の関数

エクセルのワークシート関数で質問です。 「A1セルに、文字列、A、B、Cの何れかを含み、かつCDを含まない」ことを調べる関数です。 素直に、 =AND(ISNUMBER(FIND("A",A1)),ISNUMBER(FIND("B",A1)),ISNUMBER(FIND("C",A1)),NOT(ISNUMBER(FIND("CD",A1)))) と長ったらしく書けば取得できることはわかるのですが、もっと簡潔なやり方がありそうな気がします。 どうか教えてください。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

=AND(ISERROR(FIND("CD",A1)),OR(ISNUMBER(FIND({"A","B","C"},A1)))) とかで十分です。

emaxemax
質問者

お礼

実に簡潔なすばらしいご回答、ありがとうございます! とても勉強になりました。

その他の回答 (12)

回答No.13

No.12です。一点、言い忘れました。度々すみません。 =sum(true,true,true) =sum(true,true,true)<3 =sum({true,true,true}) =sum({true,true,true})<3 =sum(--{true,true,true}) =sum(--{true,true,true})<3 上の6式はそれぞれ、上から順に、「3」、「FALSE」、「0」、「TRUE」、「3」、「FALSE」を返します。つまり、上から1番目の数式の書き方はオッケーだが、3番目のように「{ }」のみを混ぜるのには(「3」にならないので)問題があって、5番目のように「--」が付くと問題が解消されるということです。

emaxemax
質問者

お礼

ご親切になんどもありがとうございました。 これからもご指導ください。

回答No.12

SUM関数は、「TRUE」あるいは「FALSE」という論理値を合計することができます。そういう仕様です。例えば、 =sum(true,1,false,0,-3,,,) という数式は、「-1」を返します。つまり、「TRUE」を「1」として、「FALSE」を「0」として合計しています。 ただし、A1セルに「TRUE」が、B1に「100」が入力されているとき、次式は「101」ではなく、「100」を返します。 =sum(a1:b1) このように、セル参照の参照先に、論理値あるいは文字列が入力されていても、それは合計されずに無視されます。 =true<3 =0+true<3 ※「0+」の代わりに、先頭に「1*」や「--」を付けたり、true の直後に「-0」、「/1」、「^1」を付けても、同じ結果になります。 どこかのセルに、上の2式を入力してみてください。「0+」を付けないときは「FALSE」を返します。「0+」を付けると、「TRUE」を返します。これは、「true<3」とだけ書いたのでは論理式として成り立っていないため、「TRUEにはなり得ないのでFALSE」ということを意味しています。「0+」を付ければ「1<3」という論理式になるので、「TRUE」です。 =sum(true<3,1,false,0,-3,,,) =sum(0+true<3,1,false,0,-3,,,) という2式においても同様で、「true<3」は「FALSE」、「0+true<3」は「TRUE」として扱われるので、全体の数式も異なる値を返します。そうなる過程は、リボンの「数式>数式の検証」などで確認することができます。

emaxemax
質問者

お礼

とても勉強になりました。 ありがとうございます。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.11

こんにちは。#6、7、8、cjです。 #7お礼欄へのレスです。 > =AND(SUM(--ISERR(FIND({"A","B","C"},A1)))<3,ISERR(FIND("CD",A1))) ですが、--は何ででしょう? > これがなくとも検査値が空白以外は同じ答えを返すようですがなぜかわかりませんでした。 =AND(SUM(1*ISERR(FIND({"A","B","C"},A1)))<3,ISERR(FIND("CD",A1))) この方が解りやすいでしょうか。 論理値の配列(セル範囲ではなく値の配列)をそのままSUM関数に渡しても正しい結果は得られません。 そこで、TRUE は 1、FALSE は 0、一旦数値の配列に直してから渡す必要があります。 その手段として"1*"や"--"を付けることで数値化しているものです。 以前、"1*"と"--"を比較して、どちらが優れているかという議論に参加したことがあります。 その時、沢山の数式をベンチテストしたデータを根拠に、私としては"--"の方が優るという結論を出したので 私は"--"派(?)なのです。 でも、"1*"の方が概念として理解されやすいので、使う時もありますけど。 配列数式を回答として書ける方なら、たぶんどちらもご存じだと思われますので、 どちらを使うかは好みでいいと思いますけれど。 /// "A","B","C","CD"、どれも含まい文字列に対しては、 本来FALSEを返すべきところ、 "--"がないとTRUEを返してしまいます。 例えば"EEEE"という値の場合、FALSEが正解なのに、、、。 まあ、でも、考えてみれば、SUM関数をわざわざ使うまでも無かったってオチなんですけどね。 「迷ったらSUMで書ける数式優先。失敗が少ないから。」という心掛けは 外れること、少ないとは思うのですけれど。 ところで、 色々昔の経緯を思い出したのですが、、、回答の方も頑張ってくださいね。 回答で鍛えられるものって大きくて、ありがたいものです。 今回も、とても勉強になりました。

emaxemax
質問者

お礼

よくわかりました。 ありがとうございます。

回答No.10

No.9です。度々すみません。No.9の数式は、「>0」を削除しても構いません。そのほうが若干、式が短かったですね。 =or(countif(a1,"*"&{"A","B","C"}&"*"))*(countif(a1,"*CD*")=0)=1 なお、「ISNUMBER(FIND)」の場合、「A」などの文字列について、大文字と小文字を区別する必要があります。「COUNTIF」の場合は、区別がありません(区別できません)。 また、「NOT(ISNUMBER(FIND))」という部分は、「ISERROR(FIND)」と書き換えても構いません。 =AND(or(ISNUMBER(FIND("A",A1)),ISNUMBER(FIND("B",A1)),ISNUMBER(FIND("C",A1))),iserror(FIND("CD",A1)))

emaxemax
質問者

お礼

> 「COUNTIF」の場合は、区別がありません 使い分けできますね、ありがとうございます。

回答No.9

=or(countif(a1,"*"&{"A","B","C"}&"*")>0)*(countif(a1,"*CD*")=0)=1 いろいろなご回答が出ているとおり、様々な流儀で書けます。あいまい検索にしておきましたが、完全一致に限定したい場合は「*」を削除してください。 No.5さんのご意見(何れか/全て)に一票。修正は次みたいな感じで。 =AND(or(ISNUMBER(FIND("A",A1)),ISNUMBER(FIND("B",A1)),ISNUMBER(FIND("C",A1))),NOT(ISNUMBER(FIND("CD",A1))))

emaxemax
質問者

お礼

ありがとうございます。 勉強になります。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.8

くどいかな?でもやっぱあげます。 =ISERR(FIND("CD",A1))-AND(ISERR(FIND({"A","B","C"},A1)))=1 =ISERR(FIND("CD",A1))*OR(COUNTIF(A1,"*"&{"A","B","C"}&"*"))=1 ("=1"を取れば[1 | 0]) 結構軽く+わかりやすくなったみたいです。 keithinさんのご回答は私も勉強になりました。

emaxemax
質問者

お礼

ありがとうございます。 くどいなんてとんでもない。 いろんな方法がありますねえ。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.7

すみません。ちょっと余計な括弧消し忘れてました。 ついでに、COUNTIF版も上げます。 (COUNTIFの方が若干、計算が重いと思いますけれど) 論理値 =AND(SUM(COUNTIF(A1,"*"&{"A","B","C"}&"*")),ISERR(FIND("CD",A1))) =AND(SUM(--ISERR(FIND({"A","B","C"},A1)))<3,ISERR(FIND("CD",A1))) [1 | 0]値 =(SUM(--ISERR(FIND({"A","B","C"},A1)))<3)*ISERR(FIND("CD",A1)) =(SUM(COUNTIF(A1,"*"&{"A","B","C"}&"*"))>0)*ISERR(FIND("CD",A1))

emaxemax
質問者

お礼

cj_moverさん、以前は大変お世話になりました。 いろいろなやり方がありますね。 ありがとうございます。 =AND(SUM(--ISERR(FIND({"A","B","C"},A1)))<3,ISERR(FIND("CD",A1))) ですが、--は何ででしょう? これがなくとも検査値が空白以外は同じ答えを返すようですがなぜかわかりませんでした。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

こんにちは。お久しぶりです。 #あぁ、、、でも、せっかく書いていたので、、、 > A、B、Cの何れかを含み ってことは、OR()ですよね> 論理値 =AND((SUM(--ISERR(FIND({"A","B","C"},A1)))<3),ISERR(FIND("CD",A1))) [1 | 0]値 =(SUM(--ISERR(FIND({"A","B","C"},A1)))<3)*ISERR(FIND("CD",A1)) とか、ですかね。 もう少し軽くなりそうな気もしますが、まあ。

emaxemax
質問者

お礼

> ってことは、OR()ですよね はい、ご指摘の通りです。 すみませんでした。

noname#204879
noname#204879
回答No.5

貴方が「素直に」書いた式の意味は、 「A1セルに、文字列、A、B、Cの何れかを含み、かつCDを含まない」 ではなく、 「A1セルに、文字列、A、B、Cの全てを含み、かつCDを含まない」 になっていませんか?

emaxemax
質問者

お礼

おっしゃるとおりでした。 ありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! CDがなく、A・B・Cのいずれかがある場合は「TRUE」 それ以外の場合は「FALSE」としてみました。 =IF(NOT(ISNUMBER(FIND("CD",A1))),IF(OR(ISNUMBER(FIND({"A","B","C"},A1))),TRUE,FALSE),FALSE) あまり短くなっていませんが こんなんではどうでしょうか?m(_ _)m

emaxemax
質問者

お礼

ありがとうございます。 勉強になりました。

関連するQ&A

  • excelで文字列を検索する関数を教えてください。

    いつもお世話になります。 エクセルの関数で、シートAのセルA1に入っている文字列をシートBのC列から探し出し、同じ文字列があればTrueをなければFalseを返す関数を教えてください。 わからないながらも色々調べてみたのですが、検索にはVLOOKUPがよく使われているようですが、シートBのC列は、データの並べ替えができないので、VLOOKUPは、使えないのです。 よろしくお願いします。

  • Excelの文字列検索関数について

    Excel2007で、あるセルに入っている英単語が、別のセル範囲(複数セル)に入っている英文の中にあるかどうか、を調べたいのですが、関数を使って実現できるでしょうか? たとえば、 A1に"This is a pen." A2に"That is a desk" という英文があり、 B1に"bat", B2に"pen"を入れたとします。 この場合、A1~A2に"bat"は存在しないのでC1には"FALSE"が、 A1~A2に"pen"は存在するのでC2には"TRUE"が自動的に入るようにしたいのです。 (TRUE - FALSE でなくても、数字などでもかまいません) FIND関数は単一セルの中の文字列しか検索できないし、 MATCH関数はセル内容が同一でないと結果が出ないのでそのままでは使えません。 何かいい方法はないでしょうか。

  • エクセルで"=AND(ISNUMBER(B2),ISNUMBER(C3),ISNUMBER(D4))"の簡略化?

    エクセル2000です。ワークシート関数での質問です。 特定の複数のセルのすべてに数値が入力されているかどうかの判定は、たとえば以下のような関数で調べられますね? =AND(ISNUMBER(B2),ISNUMBER(C3),ISNUMBER(D4)) このように少ないセルならこれでもいいのですが、多くなってくるといちいち、セルの数だけISNUMBER()を書いていくのが大変になります。 '=ISNUMBER(B2,C3,D4)←これでは当然エラーになりますが、こんな感じで簡単に判定するワークシート関数はないのでしょうか?

  • 文字列AかBを含むセル数をSUMPRODUCT関数で求める場合

    文字列AかBを含むセル数をSUMPRODUCT関数で求める場合 エクセル2000です。 A1:A10のセル範囲だとして =SUMPRODUCT(ISNUMBER(FIND({"A","B"},A1:A10))*1) とすると、同一セルにA、Bの両方があった場合、重複してカウントされてしまいます。 重複を除外するために、 =SUMPRODUCT(ISNUMBER(FIND({"A","B"},A1:A10))*1)-SUMPRODUCT(ISNUMBER(FIND("A",A1:A10))*ISNUMBER(FIND("B",A1:A10))) と、重複してカウントされた数から両方が存在するセルの数を減じて求めましたが、以下のようなより簡素な式でも求められことがわかりました。 =SUMPRODUCT((ISNUMBER(FIND("A",A1:A10))+ISNUMBER(FIND("B",A1:A10))>=1)*1) この式でなぜAB両方があるセルが重複カウントされないのかどうもわかりません。 ご教示いただければ幸いです。 なお、SUMPRODUCTではなく =SUM(COUNTIF(A1:A10,{"*A*","*B*"}))-SUM(COUNTIF(A1:A10,{"*A*B*","*B*A*"})) でもできることは存じておりますが、今回はSUMPRODUCTの疑問として質問いたしました。

  • ブック全体の文字列検索について

    Excelでセルに任意の文字列をペーストします。そのセルは別のブックにリンクしているのでペーストする度にリンク先のセルでは文字列が更新されます。リンク先のブックにはワークシートが10あっていづれかのシートのA列にその文字列がある事になっています。更新された文字列を検索する作業を繰り返すのでマクロで組み込もうと思ったのですがFIND関数にしても、VBでCell.Find(What:=....と書くにも参照する文字列を直接指定してやらないと動きません。参照する文字列が相対的に変化するので「特定のセルの中に入力された文字列」を参照してブック内を検索したいということなのですが、実現するにはどうしたらようでしょうか?と質問して moji = "B1" Set c = Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then c.Select というコードをしめしていただきました。このままだと検索対象がRangeオブジェクトになっているのでActivesheet上でしか検索がかからないのでCellsにすればブック内のすべてのシートに検索がかけられるかな?と思っていたのですがエラーがでます。ブック内を検索範囲に入れるためにはどうしたらよいでしょうか?

  • Excel 複数セル内の文字列を検索する関数

    シート1にはA列に会社名、B列に業種が入っています。シート2のC列にシート1のA列の会社名を含む文字列が入っています。ここで、C列にA列の会社名が含まれていた場合、シート2のD列に会社名に対応する業種を入力したいと考えています。データ数は100-200行ほどです。 関数で表現したいと考えているのですが、簡潔に表現する方法が思いつきません。ご協力お願いします。

  • エクセルの関数で文字列検索

    エクセルの関数ですが、指定したある特定のセルの中に「任意」または「フリー」という文字列が無かった場合のみ「TRUE」を返してほしいのです。 やってみましたがいまいち自信がもてないので質問しました。 =IF(AND(LEFT(OFFSET(D48,B49,0),2)<>"任意",LEFT(OFFSET(D48,B49,0),3)<>"フリー"),TRUE) と =AND(ISERROR(FIND("フリー",OFFSET(D48,B49,0))),ISERROR(FIND("任意",OFFSET(D48,B49,0)))) はまったく同じ結果となりますか? 異なる結果が返る場合はありませんか? また、両方とも同じ式の繰り返しを使っていますが、もっと簡単に記述できませんでしょうか?

  • エクセルで検索し別シートに抽出したい。2007

    http://okwave.jp/qa/q6798171.html                                       上記のベストアンサーの方法で試してみましたが上手く行かなかったので、ご教授お願いします。                                                          Sheet1のAからAMにそれぞれ各項目があり、Sheet2はURLベストアンサーの画像と同様になっています。Sheet2の検索項目はO列とP列ですが、後々検索したい項目が増えた時に追加しやすい方法だと助かります。O列は仮名+数字(あ1234)P列は漢字です。                                                              Sheet1のAM2へは下記のようにしました。  =IF(COUNTA(Sheet2!$A$2:$B$2)=0,"",IF(Sheet2!$B$2="",IF(ISNUMBER(FIND(Sheet2!$A$2,B2)),ROW(),""),IF(Sheet2!$A$2="",IF(ISNUMBER(FIND(Sheet2!$O$2,P2)),ROW(),""),IF(AND(ISNUMBER(FIND(Sheet2!$A$2,B2)),ISNUMBER(FIND(Sheet2!$O$2,P2))),ROW(),"")))) Sheet2のA5には下記のようにしました。 =IF(COUNT(Sheet1!$AM:$AM)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(Sheet1!$AM:$AM,ROW(A1)))) お手数ですがご教授よろしくお願いします。

  • エクセル関数で検索能力がある関数を教えてください。

    「シート1」と「シート2」があります。 「シート1」には   1      2 A 通信費  課税仕入 B 借入金  対象外 C 支払利息 非課税仕入 のような表があります。 「シート2」には   1     2 A 通信費 B 交際費 となっていたとします。 この場合、「シート2」のセルA2に、 VLOOKUP関数で「シート1」を参照し、「課税仕入」を表示させることはできるのですが、 「シート2」のセルB2にセルA2の関数をコピーした場合、 「シート2」のセルB1にセルに表示されている「交際費」は「シート1」の表には登録していないため、セルB2にはエラー値が表示されてしまいます。 「シート1」の表に「交際費」を登録すればいいのですが、 自己都合上、「シート2」のセルB2に、 「シート2」セルB1の項目が「シート1」の「1列目」にあれば、「2列目」の項目を表示する。 「シート1」の「1列目」に該当する項目が無ければ、「シート2」のセルB2には「対象外」と表示するようにしたいのです。 言い換えますと、「シート2」の通信費は「シート1」にあるのでVLOOKUP関数で課税仕入を導くことが出来ます。 しかし、「シート2」の交際費は「シート1」に無いため、VLOOKUP関数をしようできません。 「シート1」に無い項目の場合には、「シート2」に「対象外」と表示されるような関数の式が知りたいです。 わかりにくい文章になってしまいましたが、よろしくお願いします。

  • 文字列検索の参照文字列の指定について

    Excelでセルに任意の文字列をペーストします。そのセルは別のブックにリンクしているのでペーストする度にリンク先のセルでは文字列が更新されます。リンク先のブックにはワークシートが10あっていづれかのシートのA列にその文字列がある事になっています。更新された文字列を検索する作業を繰り返すのでマクロで組み込もうと思ったのですがFIND関数にしても、VBでCell.Find(What:=....と書くにも参照する文字列を直接指定してやらないと動きません。参照する文字列が相対的に変化するので「特定のセルの中に入力された文字列」を参照してブック内を検索したいということなのですが、実現するにはどうしたらようでしょうか?

専門家に質問してみよう