• ベストアンサー

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

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

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

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

こんばんは! 具体的な範囲が判らないので、やり方だけ・・・ ↓の画像でA1~D10セル内データでG1セルに入力したデータの 「行番号」と「列番号」を表示するようにしてみました。 尚、範囲内に重複データはない!という前提です。 画像ではG2セルに =SUMPRODUCT((A1:D10=G1)*ROW(A1:A10)) G3セルに =SUMPRODUCT((A1:D10=G1)*COLUMN(A1:D1)) という数式を入れています。 ※ 該当データがない場合は「0」が表示されます。m(_ _)m

over_the_galaxy
質問者

お礼

ありがとうございます。 出来ました。機能としては十分です。しかし、これはどういう理屈で計算出来ているのでしょうか?sumproductは調べましたが分かりませんでした。 ・A1:D10=G1は論理式の扱いなのか?どういう動作? ・ROW(A1:A10)は10個のセルの行番号を示すの? ・両者が掛け算されており、配列としては1個だと思いますが、sumproductの引数として1個の配列を使うのはナニ? すみませんが、教えて下さい。

その他の回答 (6)

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.7

回答No.6の補足として別の角度から検討してみました。 貼付画像はExcel 2013で行ったものですがExcel 2003にも組み込まれた関数で処理しています。 行番号 H4=MOD(MIN(IF((A2:E11=H2),ROW(A2:A11)+COLUMN(A2:E2)*1000,"")),1000) 列番号 H5=INT(MIN(IF((A2:E11=H2),ROW(A2:A11)+COLUMN(A2:E2)*1000,""))/1000) この2つの式は入れ子のIF関数で配列値を返す必要があるため数式バーへ入力後Ctrl+Shift+Enterで確定してください。 左上から右下へ検索して最初に見つかったセルが結果として返されます。 I4とI5の計算式はMIN関数をMAX関数に置き換えたもので、左上から右下へ検索して最後に見つかったセルが結果として返されます。 検証(別解)はSUMPRODUCT関数を使うことで式の確定時に通常のEnterキーのみで確定する扱いにしてみました。 行番号 L4=SUMPRODUCT(LARGE((INDEX(A2:E11,,SUMPRODUCT(LARGE((A2:E11=L2)*COLUMN(A2:E2),COUNTIF(A2:E11,L2))))=L2)*ROW(A2:A11),COUNTIF(INDEX(A2:E11,,SUMPRODUCT(LARGE((A2:E11=L2)*COLUMN(A2:E2),COUNTIF(A2:E11,L2)))),L2))) L5=SUMPRODUCT(LARGE((A2:E11=L2)*COLUMN(A2:E2),COUNTIF(A2:E11,L2))) この数式は論理が複雑なのでお勧めできません。

over_the_galaxy
質問者

お礼

詳細な回答をありがとうございます。 見た感じ「これは無理」と思ってしまいました。Match関数で攻めてみます。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.6

>平たく言うと何番目に見つかったか。 MATCH関数は指定範囲(1列または1行)の中から検索値の位置を検出します。 何番目かは指定できませんので検索値と同じ値のセルが複数のときは最初に見つかった位置になります。 >これにaddressをかけてなぜセル位置が分かるのでしょうか? MATCH関数は複数列または複数行を対象にできませんので検出範囲は限定されています。 今回の質問で「指定範囲内で文字列を検索し」とのことですが複数行×複数行の場合は別の方法を使います。 また、「見つかったセルの行番号、列番号」は「A1」や「R1C1」のようにセルのアドレスとして検出したかったのではないのでしょうか? 条件が曖昧だったので勝手解釈の検証結果を提示しました。 尚、ADDRESS関数は行番号と列番号を指定することでセルの位置が返されます。 今回の検証では列は固定で行番号をMATCH関数で検出した結果を提示しました。 MATCH("第3項",B1:B14,0) → 4 ADDRESS(4,2) → $B$4 引数の2番目はB列(第2列)を意味します。 ADDRESS(4,2,4) → B4 引数の3番目は省略すると上記のようになり、$を除いた形式にするときは4を指定します。 複数列×複数行からの位置検出ではSUMPRODUCT関数を使えますが検索値と同じ値が複数のとき無指定で優先的に選択することができませんので条件の提示が必要です。

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

No.2です。 数式の意味が知りたいというコトですので・・・ 画像の場合で説明しますと。 大前提としてデータ範囲内には重複データはない!というのは前回書いた通りです。 (万一同じデータが複数ある場合はとんでもない数値になります) 行方向の >=SUMPRODUCT((A1:D10=G1)*ROW(A1:A10)) の意味 必ず範囲指定した行数と ROW(A1:A10) の行数は一致させる必要があります。 A1~D10セル内にG1と一致するデータがある場合(画像では範囲指定内の5行目)ですので、 5行目だけが「TRUE」=1 となり 他の行はすべて「FALSE」=0となります。 配列数式のSUMPRODUCT関数で、ROW(A1:A10) をかけていますので、 TRUEの5行目=1 × 行番号(A5)の結果が表示されます。 列に関しても同じ意味です。 ※ 注意点 ※ 万一 仮にデータ範囲がA1セルからではなく、C3セルから始まる範囲が前回のような表がある場合は =SUMPRODUCT((C4:F13=G1)*ROW(A1:A10)) のように範囲指定した行数と同じ数だけ1行目(A列でなくても構いません)から同じ行数分だけ掛け算します。 この程度でよろしいでしょうかね?m(_ _)m

over_the_galaxy
質問者

お礼

ありがとうございます。 これは今までに経験のない使い方です。 A1:D10=G1 まずこれは論理式で結果は配列となりFalse,F,F,F,True,F,F,F,F,F ROW(A1:A10) これは行番号の配列1,2,3,4,5,6,7,8,9,10 両者を掛け算すべく*を使った時点でTrueとFalseはそれぞれ1と0に変わり、結果は配列となり、0,0,0,0,5(行番号),0,0,0,0,0 sumproductなので0+0+0+0+5+0+0+0+0+0=5が戻り値になる。 なかなか奥が深い使い方ですね。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

関数で行番号や列番号を取得することもできますが、そのデータをどのように使用するかによって、最も効率的な数式が異なります。 このようなご質問では、操作の目的やシートのレイアウトを含めて、ご希望の操作をもう少し具体的に例示されたほうが、より的確な回答が寄せられると思います。

over_the_galaxy
質問者

お礼

ありがとうございます。

回答No.3

置換ではなく、検索を指定すればOKです。

over_the_galaxy
質問者

お礼

ありがごうございます。 エクセルの機能ではなくサードパーティのアドインか何かのようですね。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.1

>マクロでなく関数で出来るでしょうか? ADDRESS関数を使うとセルの列記号と行番号を取得できます。 貼付画像はExcel 2013で検証した結果です。 MATCH関数を使って目的の値で行番号を取得し、ADDRESS関数に渡してセルの位置を取得しました。 =ADDRESS(MATCH("第3項",B1:B14,0),2,4)

over_the_galaxy
質問者

お礼

ありがとうございます。 machを調べましたが、指定範囲にある検索文字列を探し「相対的な順番を返す」関数だったと思います。平たく言うと何番目に見つかったか。これにaddressをかけてなぜセル位置が分かるのでしょうか?

関連するQ&A

  • A1:D10のような複数範囲でセル位置を検索したい

    エクセルで1列や1行であれば指定の文字を探す関数は知っていますが A1:D10のような複数の列、行の範囲の中から指定の文字が入っている セルの位置を調べる関数はないでしょうか? これか出来たら他の作業が出来るのですがずっと作業が止まったままです。 お願いします!

  • 【VBA】該当する文字列がある列を削除したい。

    指定した文字列を検索して、そのセルのある列削除したいです。 例えば2行目に、表の項目として「社名、フリガナ、住所、電話番号、備考、・・・」 と、あるときに、フリガナと電話番号の列を削除させたいのです。 シートによって項目の位置が若干変わる為、列番号を指定して削除するようなことは出来ません。 項目の名前が変わることはありません。 vbaでどのようにすればよいのでしょうか。 また、2行目の範囲で文字列を検索して、該当する文字列があるセルの位置情報を 取得したい場合はどうすれば良いでしょうか? 宜しくお願いします。

  • エクセル 文字列検索と検索した文字列が含まれるセルへのジャンプ

    エクセル教えてください。 VBAは使ったことがありません。 現在Q&Aを作っています。 かなりボリュームが増えてしまったので、 文字列検索ができるようにしたいと思っています。 そこで、あるセルに調べたい文字列を入力し、 検索ボタンを押すと、その文字列が含まれるセルにジャンプする。 こんな機能は、エクセルでできませんでしょうか? マクロを組んだりすればよいのでしょうか? 教えてくださいー。

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

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

  • 複数セルから文字列を検索して・・・

    どう検索していいのかわからなかったので質問します。 複数のセルから特定の文字列を検索して、該当したセルに対応するB列の数字の合計を関数によって出したいです。 例えば画像を例にすると、A列で"()"という文字列が入っているセルがいくつかあります。 これらのセルに対応するB列の数字の合計を出したいです。 "()"は必ず文字列の末尾にくることとします。 回答よろしくお願いします。

  • EXCELの検索で検索文字列以外が混ざった場合?

    EXCELで、検索文字列のあるセルの行番号を表示させたいのですが、 検索したいセルには検索したい文字列以外にも不特定な文字列が混ざっている場合、どういう式を作ればよいのですか?

  • Excelで、文字列を含むセルの検索をしたい

    Excelで、文字列を含むセルの検索をしたいと思います。 列Aには、探したい文字列(市町村名)が800行入っています。 (1行目)○○市 (2行目)△△町 (3行目)□□□村 ・・・以下続く・・・ 列Bには、検索対象となる文字列(住所)が7000行入っています。 (1行目)XX県XX市XX-XX-XX (2行目)XX県○○市XXXXXX-XXX-X (3行目)XX府XXX郡□□□村XXX ・・・以下続く・・・ このとき、 「列Aにある文字列(市町村名)を含む列B(住所)のセル」を検索したいのです。 (上記の例の場合は2行目・3行目がヒット。) シートや列は追加してかまいません。 件数が多いため、どのように探すと効率的か見当がつきません。どなたかよい知恵をお貸しください。よろしくお願いします!

  • VBAマクロ・・同一セルの検索と検索したセルの操作

    VBAマクロ・・同一セルの検索と検索したセルの操作  VBAのほぼ初心者です。  決められたセル(たとえばE100)に入力された文字列と同一の文字列を その列内の上(E1~E99)で検索する。 そして、検索できれば(たとえばE30)そのセルがある行(行30)を削除する。 なお、複数検索されれば、検索されたすべてのセルに対応する行を削除する。  というようなことをVBAのマクロで作成したいです。 FindメソッドとDo..Loop Whileを使って試行錯誤してみたのですが、うまくいきません。。  いい方法があれば、是非教えていただきたいです。  どうぞよろしくお願いいたします。

  • [ExcelVBA]検索文字で検索し文字入力する

    いつもお世話になっております。 以前に投稿をさせていただきましたgitmykと申します。 http://okwave.jp/qa/q7563274.html 前回はご回答くださり誠にありがとうございます。 この場で感謝申し上げます。 内容を精査させていただきましたので、再度投稿させていただきます。 問題(1) Sheet2のA列に[範囲指定文字]、B列に[検索文字]、C列に[入力文字]が複数入っている。 Sheet1を[範囲指定文字]で検索しCurrentRegionで範囲指定する。 範囲指定した全てのセルに対し、[検索文字]の上から順に検索していく。 該当セルがあれば、右4セルoffsetし、対応する[入力文字]を入力する。 ([検索文字]と[入力文字]は1対1で対応している) 問題(2) Sheet2のA列に[範囲指定文字]、B列に[検索文字1]、C列に[検索文字2]、D列に[入力文字]が複数入っている。 Sheet1を[範囲指定文字]で検索しCurrentRegionで範囲指定する。 範囲指定した全てのセルに対し、[検索文字1]の上から順に検索していく。 該当セルがあれば、右2セル上1セルoffsetしたセルを対応する[検索文字2]で検索し、双方が一致した場合のみ[検索文字1]で検索した該当セルから、右に4セルoffsetしたセルに、対応する[入力文字]を入力する。 ([検索文字1]と[検索文字2]、[入力文字]は対応している) 問題(3) Sheet1を[範囲指定文字]で検索し下に1セルoffsetした位置をCurrentRegionで範囲指定した場合。 上記内容をExcelVBAでどのように記載すればよいか、ご教授くださいませんでしょうか。 VBA学習中です。 何卒宜しくお願いいたします。

  • 検索した文字のセルを基準に範囲指定コピーのマクロ

    表題のマクロを教えてください。 検索範囲 シート1のA1:K100 検索する文字 ” 成績 ” コピーする範囲 見つかったセルの下の行から5行~10列まで全部。 貼り付ける場所 シート2のB1 宜しくお願いします。

専門家に質問してみよう