• ベストアンサー

Excel関数を使って、対象文字が検索文字列でn番目に出現した位置を知りたい

どうもお世話になります。 Excel関数を使って以下の検索を行いたいのですが、可能でしょうか。 例)以下のような表があったとします。  A B C D E F G 1 0 0 1 1 0 0 0 2 1 1 0 1 0 0 0 ⇒○(例えば1)行目を検索し、□(例えば0)が△(例えば3)回目に出てくる位置を返す。 【答え】E1 表の中の文字列は、数字でなく色々な文字(ABとか)を使ってもいいです。 OracleのInstr関数のような使い方と言えばよいでしょうか。 できればマクロは使いたくありません。 Lookup、match、index関数など色々試しましたがダメでした。 ご教授のほどよろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。Wendy02 です。 H1 を規定セルとするなら、このようになります。 =ADDRESS([行数],MATCH([何番目],INDEX(COUNTIF(OFFSET($H$1,[行数]-1,,,COLUMN($A$1:$G$1)),[検索値]),,),0),4) このような仕組みになっています。今の段階では、一行の検索しか出来ません。 COLUMN($A$1:$G$1)の部分は、ダミーで数値だけを取り出すために行われていますので、基本的には変更しません。 >例えばB5からH5のような範囲です。 範囲というのは、どのように数えていったらよいのか、今は、考えておりません。 したがって、[行数]は、1行目、2行目というように入れていきます。 序数というのは、[何番目]ということです。 OFFSET は、元の式は、$A$1 を規定セルとして、規定行、規定列を0としますので、1を入れると、2行目になってしまいます。したがって、[行数-1] となっています。 COUNTIFで、左から、[検索値] を1つずつ数えていくと、数が加算されていきます。その加算された最初の数を、MATCH関数で取り出し、それは、何列目か、という考え方をしています。 これで、お分かりになられましたでしょうか?

mochiokun
質問者

お礼

本当にご丁寧に教えて頂きまして有難うございました。 教えて頂いた内容で実現できました! COLUMN($A$1:$G$1)の部分を検索開始位置に合わせて変えてしまうとダメなんですね。 恐らくVBAでやればもっと便利な関数やアルゴリズムを使って簡単にできると思いますが、今回はあえて関数のみで複雑な処理をしてみようと思い質問させて頂きました。 当初は、割とありがちなケースと思い、もっと簡単にできると思いきや、結果的にとても苦労してしまいました。アドバイス頂きました方にはこの場を持って御礼申し上げます。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#3です。補足ありがとうございました。 B1:G1で、0が3回目に現れる列は 例データB1:G1 0 0 1 0 5 6 =MIN(IF(COUNTIF(OFFSET($B$1,0,0,1,COLUMN(B1:G1)-1),0)=3,COLUMN(B1:G1),"")) と入れて、SHIFT+CTRL+ENTERを3つ押す(配列数式) 結果 5(E列) B1を起点に範囲を1列づつB1->C1->D1・・と広げて、それぞれの列で、COUNTIFで0が3になる列をもとめ、そのうちの最左列を採る、 ということを式にしています。

mochiokun
質問者

お礼

ご回答有難うございました。 頂いた内容を試しました。他の方の回答にも書きましたが、実は基準値($A$1)が可変でして、恐らく私のやり方がまずいと思いますが、実現できませんでした。ただ、回答にある配列数式というものを初めて知ることができました。これはこれでいろいろと応用できそうなテクニック(常識なんだと思いますが)ですね。ホント奥深いです。 どうも有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。#2 の回答者です。 #N/Aということは、たぶん、 I1:1 (行数) I2: 3 (序数) I3:0 (検索値)文字列も可 の意味が分からなかったからだと思います。 サンプルどおりの範囲で、以下を貼り付けてください。 =ADDRESS(1,MATCH(3,INDEX(COUNTIF(OFFSET($A$1,I1-1,,,COLUMN($A$1:$G$1)),0),,),0),4) なお、 OFFSET($A$1,I1-1,,, の$A$1 は、範囲の左端上の位置。 COLUMN($A$1:$G$1) は、位置が変っても、その部分は、A1からの位置関係の長さになります。

mochiokun
質問者

お礼

Wendy02様 どうも有難うございます。 おっしゃるとおり、自分が示したサンプルデータで試したところ、 思うような検索ができました!検索できた瞬間感動しました。有難うございます。 ただ・・・すみません、実際には検索開始位置が$A$1ではないのです。 例えばB5からH5のような範囲です。 教えて頂いた公式を元に基準位置を直したりしましたが、ダメでした。 関数の内容も精一杯追ってみたのですが。。 MATCH関数の検査値に序数(I2)を指定しているところが理解できなく、このあたりで詰まっているのかなという気がします。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>対象文字が検索文字列でn番目に出現した位 文字桁番目数ならFind、Searchなどで解決する。 Instrと似ている。 >⇒○(例えば1)行目を検索し、□(例えば0)が△(例えば3)回目に出てくる位置を返す。 の意味がわからない。 第1行目で0が出てくるセルの列番号は、単純にMATCH関数で できるのでは。A列に出てきているのでA1か1列ではないの? >【答え】E1  とは?質問例では、A列ではないの? >数字でなく色々な文字(ABとか)を使ってもいいです 「いいです」ではなくーー>「場合もあります。」でしょう。 >OracleのInstr関数のような使い方と言えばよいでしょうか オラクルの使用者<<エクセルの使用者だと思うので、例が適当でないと思う。普通は特殊例をあげて一般例を想起に使わない。 http://oracle.se-free.com/dml/05_instr.html などに夜と、VBのInstrと同じで、文字列の中での話しのようですね。 本質問は「行目を検索し」といっているから、セルの位置(列番号)を発見して返す質問ではないの。 この点は非常に回答を左右します。 ーー 「部分一致で文字列を含む最初のセルの列番号を探せ」ということなのですか? ーー 例データ 列データの例 a as ghfg dfg ase dfgr =MIN(IF(ISERROR(FIND("fg",A1:A6)),"",ROW(A1:A6))) と入れて、SHIFT+CTRL+ENTER(配列数式) 結果 3 行データにするとうまくいかない。この点は考えて見ます。

mochiokun
質問者

お礼

ご回答有難うございました。 確かに仰るとおり、位置を知りたいと言ってるのに、文字列検索とかInstr関数とか話をして質問内容が非常に意味不明でした。。申し訳ありません。 要は、対象範囲の中で、指定した値が左から数えて指定した回数登場してきたところの位置を知りたいのです。 ここで、例えば対象範囲の文字列(0とか1)を、文字列連結し、 Instr関数のように、前から数えて何番目かという値を取得することができれば、INDEX関数を使ってセルの位置を確認できるのではないかという考えを持っていました。この思いがあったので対象範囲なのか文字列なのかわからない質問をしてしまっていました。 ちなみに >数字でなく色々な文字(ABとか)を使ってもいいです 「いいです」ではなくーー>「場合もあります。」でしょう。 の部分ですが、対照表の各セルに、IF関数を使って「~だったら0、~だったら1」という指定をしている為、極端な話0か1だろうが、AかBだろうが、指定しているのは自分なのでどっちでも可、なのです。説明不足でした。。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 あまり、マクロとワークシート関数の区分けというのは、ユーザーのスキルの問題であって、ある程度のスキルのある人から教われば、関数の解決方法も、VBA ユーザー定義関数も違い自体はありません。 ワークシート関数では、 条件を外にして検索することを想定すれば、 I1:1 (行数) I2: 3 (序数) I3:0 (検索値)文字列も可 =ADDRESS(I1,MATCH(I2,INDEX(COUNTIF(OFFSET($A$1,I1-1,,,COLUMN($A$1:$G$1)),I3),,),0),4) 答え: E1 なお、なければ、エラーが返ります。

mochiokun
質問者

お礼

ご回答有難うございます。 教えて頂いた内容を確認しましたが、#N/Aエラーが出てしまいます。 検索文字を0にしてるからかもしれません。 自分の力不足のようです。。 もう少し調査し、できるようであれば補足にて回答差し上げます。 取り急ぎお礼申し上げます。 ちなみに対照表の値ですが、0か1しか値はありませんので、 対象文字がないためにエラーが出ることはありません。 (この場合の0か1自体も、自分で指定している文字列ですので、 0か1の値に限った話ではありません)

全文を見る
すると、全ての回答が全文表示されます。
noname#176215
noname#176215
回答No.1

=SMALL(IF(INDEX(A:G,○,0)=□,COLUMN(A:G)),△) Ctrl + Shift + Enterで確定 エラー対策してません。実務に使うのなら マクロか作業列で対処すべき でしょう。

mochiokun
質問者

お礼

ご回答有難うございました。 SMALL関数は使ったことがなかったのですが、 範囲の中で、大小のある値について、小さい順にみて△番目の値を 返すということですね。 事前に範囲の部分を大小ある値にしておく必要があるということだと思いますが、 その部分が分かりませんでした。。スミマセン。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列検索で・・・

    Instr関数で文字列の存在チェックを行っています。 この場合、変数indexに1が入った場合 Instr("aaa1_a.sql","index") <----- この場合問題はないのですが、 Instr("aaa12_a.sql","index") <-----となる場合も値がとれてしまうので どうしたものかと困っています。 うまく検索させる方法はないでしょうか? ちなみに検索する文字列には aaa数字.sql aaa数字_a.sql aaa数字_b.sql というパターンがあります。 どなたかよきアドバイスをいただけませんでしょうか? よろしくお願い致します。

  • 文字列検索で

    よろしくお願いします。 文字列検索instr関数で、特定文字(スペース)でない文字を検索したいのですが、どのようにしたらいいですか? instr関数では、できないのでしょうか? たとえば、 文字列" osietegoo "  →  3 文字列"    situmon"  →  7 スペースでない文字が出現する位置を知りたいです。 instr(文字列,"o")ではなく、" "ではない、、、としたいのですが、できますか?

  • 文字列検索しセルの位置が知りたい

    指定範囲内で文字列を検索し、見つかったセルの行番号、列番号を知りたいのです。 マクロでなく関数で出来るでしょうか?

  • 文字列検索

    文字列検索 テキストファイルの検索を行いたいです. 下記のようなサンプルファイルでfooを検索し, 含まれるならマッチした個数,含まれないならnilを返す関数を作りたいです. mecabを用いて形態素解析を1行ずつしようかと思ったんですが, 大量のファイルを処理する予定なので,オーバヘッドが気になります. 関数でgrepがあるみたいですが,マッチした行しか返されません. 標準関数で1行ずつよみこんで,1行のなかでマッチした回数を返す関数はありますか? --sample.txt-- foo foo bar bar foo hoge,hoge,hoge,hoge hage-hage-hage-foo -- end --

    • ベストアンサー
    • Ruby
  • 表のばらばらの文字列を1列にまとめたい 関数

    添付の左の表を右の表にしたいです。 (1)左の表には数式が入っていて、この他にもう一つある表のデータに該当すると1列ごとにSMとかNPとか表示されるようになっています。 (2)この左の表は実際には136列あるので、結果を印刷すると一枚に収まりきらないのです。なので、右の表のように、1列に表示したいのです。 (3)1行のうち、2個以上文字列が入ることもありますが、その可能性は低いので、とりあえず1行に1個ずつ出現すると考えてもらっていいです。(2個以上文字列が出現する場合も分かれば教えてください。) (4)関数でできませんか? またはマクロでもいいです。

  • VBA/FIND関数を使っての先頭文字列の検索方法

    エクセルVBAにてFIND関数を使って、 文字列検索⇒コピー&ペーストのマクロを作成しているのですが、 どうしても、先頭文字列から検索をする方法がわかりません。 たとえば、 あいうえお いうえおあ おあいうえ えおあいう という文字列から「あいう*」を検索したい場合、 1行目だけを抽出したいのですが、 1,3,4行目が抽出されてしまいます。 find関数では先頭文字からの検索はできないのでしょうか? もし、不可能な場合、先頭文字からの検索を行うにはどのように行えばよいでしょうか? アドバイス、よろしくお願いいたします。

  • 表のばらばらの文字列をまとめるマクロ 関数

    以前、同じ内容の質問を聞いたのですが、少し条件を変えて質問です。 (1)左の表には数式が入っていて、この他にもう一つある表のデータに該当すると1列ごとにSMとかNPとか表示されるようになっています。 (2)この左の表は実際には136列あるので、結果を印刷すると一枚に収まりきらないのです。なので、右の表のように、最短の列に表示したいのです。 (3)この例ではたまたま1行に1個ずつしか文字列が入ってないので右の表は1列ですが、1行に付き2個以上文字列が入ることもあります。5個以上はほとんどないです。 (4)関数でできませんか? またはマクロでもいいです。 以前、回答でいただいた関数は =IFERROR(HLOOKUP("*?",$A1:$D1,1,FALSE),"") 又は =IF(COUNTIF($A1:$D1,"*?"),HLOOKUP("*?",$A1:$D1,1,FALSE),"") でしたが、これだと1行につき1個文字列があるときのみ可能です。 1行に付き2個以上文字列がある場合に、例えば空欄を削除して左に詰めるような感じでマクロでできないでしょうか?

  • エクセルのLOOKUP関数について

    LOOKUP関数とVLOOKUP関数はどう違うのでしょうか?わかりやすく教えて下さい。(使用例など)  文字だけの表(2行)から検索したんですが、VLOOKUP関数は検索できたんですが、LOOKUP関数だと間違った検索になってしまうんです‥。

  • Excel2010 SUM関数の参照列を指定

    いつもお世話になっております。 文字で説明しにくく、分かりにくい表現になっておりすみません。。 Excel2010 で年度(4月~3月)の集計表があり、最右列へSUM関数が入っています。 様々な項目が行方向に複数行あり、全て最右列へはSUM関数が入っています。 この各月の数字は日々変化していき、今月中は今月中の数字だけが変化していくとは限らず、 1年間のうちどの月の数値が日々変化するかは分かりません。 毎月、前月までの合計を出しておきたい為、SUM関数が入っている列は、毎月月初に 参照列が4月~前月までになるように修正をしています。 毎月置換で数式内のアルファベットを変更したりしていますが、複数Sheetに渡り表が続いていたり、 M列の時はSUM関数の"M"が"SUN"になってしまったり。。うまくいなかいことがあります。 この為、参照列のアルファベットを同じファイル内のどこかのセルで指定して参照させることはできないかと思っています。 例えば、こんな感じの参照表を作成し、、 A  B   A列 B列 1行 4月 E 2行 5月 F 3行  6月 G 4行  7月 H 5行  8月 I 6行 9月 J 7行 10月 M 8行 11月 N 20行 S20へSUM関数 9月選択→10月選択に変更すると、SUM関数内の<=SUM(E20:J20)>→<=SUM(E20:M20)> に変更できるような。 SUM関数が入っているセルは全て「J」→「M」に一括で変更できるようにしたいです。 分かりにくくすみません。質問あれば補足します。

  • Excel関数で”○”印を検索

    連続したセル(列、行)に”○”印があるセルの数を検索したい。 具体的に言いますと! Excelの表で、行事に参加する人は”○”、不参加は”×”印で表された表があります。 この表の中に、”○”が幾つあるかを検索する、関数は何がよいか教えてください。

専門家に質問してみよう