いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)特定のセルの位置(番地)を取得する方法

 Excelで、ある値が入力されているセルの位置(ある範囲内での相対位置)やセル番地、さらに行番号や列番号を取得する方法について紹介します。対象セルを直接指定してセル番地等を取得する方法も併せて紹介します。

指定した値があるセル位置を取得する方法

範囲内でのセル位置(〇番目)を取得する方法

 次の画像では、左側の表のB3:B8の範囲(見出しを含まないことに注意)からD3セルの値(日本)を検索し、そのB3:B8の範囲内における位置(B3セルから数えて〇番目)を取得しています。「日本」はB5セル(B3セルから数えて3番目)にあるので、結果は「3」となっています。

 E3セル

=MATCH(D3,B3:B8,0)

 MATCH関数を使っています。第1引数に検索値、第2引数に検索範囲を指定することで、検索値が検索範囲中の何番目にあるかを返してくれます。
 第3引数を「0」と指定する(完全一致検索)のがポイントで、省略すると意図しない検索結果となる(ことがある)ので注意してください。



 次の画像のようにデータが横に並んでいるケースでも、検索値の位置を(左から数えた位置)を返してくれます。

 C7セル

=MATCH(B7,C2:H2,0)

 B7セルの値(日本)E2セル(C2セルから数えて3番目)にあるので、結果は「3」となっています。



 次の画像ではXMATCH関数を使って上記例と同じことをやっています。

 E3セル

=XMATCH(D3,B3:B8)

 XMATCH関数はMATCH関数の後継となる新しい関数です。機能的にはさほど変わりませんが、第3引数を省略しても完全一致検索をしてくれるので扱いやすくなっています。



 もちろん横に並んだデータからの取得も可能です。

 C7セル

=XMATCH(B7,C2:H2)

 


 次の画像は、データが縦横に並んだ表から値を検索して、縦位置と横位置(左上のセルからみて〇行目、○列目)を取得しています。
 式が一気に複雑になりますが参考まで。

 H3セル(縦位置)及びI3セル(横位置)

=XLOOKUP(G3,TOCOL(B3:E5),TOCOL(MAP(B3:E5,LAMBDA(a,ROWS(B3:a)))))
=XLOOKUP(G3,TOCOL(B3:E5),TOCOL(MAP(B3:E5,LAMBDA(a,COLUMNS(B3:a)))))

 XLOOKUPやTOCOLなど新しい関数を併用しています。H3セルの式の内容は次のようになります。

  1. 「TOCOL(B3:E5)」でデータを縦1列に並べる
  2. 「TOCOL(MAP(B3:E5,LAMBDA(a,ROWS(B3:a))))」で「『B3:E5の範囲』にaと名付け、B3セルからaの各セルまでの間に含まれる行数」を求めてを縦1列に並べる
  3. XLOOKUPを使い上記1.から検索値(日本)を検索し、対応する位置にある2.の値を取得する

 検索値が表中に複数存在する場合は、最も上の行の最も左の列にあるものの位置を取得します。



 特に難しいのが上記2.中の「MAP(B3:E5,LAMBDA(a,ROWS(B3:a)))」の部分ですが、そこだけ実行すると次のようになります。
 TOCOLを使ってこれを縦に並べてXLOOKUPの第2引数としています。

セル番地を取得する方法

 次の画像では、D3セルの検索値(日本)をB3:B8の範囲から検索し、その検索値が入っているセル番地を取得しています。

 E3セル

=CELL("address",INDEX(B3:B8,MATCH(D3,B3:B8,0)))

 「INDEX(B3:B8,MATCH(D3,B3:B8,0))」によりB3:B8の範囲から「日本」を検索してその位置にある値が得られます。つまり「日本」という文字列が返ってくるので、それだけだと全然意味のない式です。
 しかしCELL関数(対象セルの情報を返す関数)を使って「CELL("address",INDEX(~))」とすることで、そのセル番地が取得できます。普通に考えると「日本」という文字列がCELL関数による評価(処理)の対象になりそうなものですが、そうではなく値が入っているセルが評価されるのが興味深い点です。
 なお、上記例と同様に横方向の検索もできますが例は省略します(以下のXLOOKUPの例についても同様)。



 また、戻り値の「$」の記号(絶対参照)が必要ない場合はさらにSUBSTITUTE関数を使って削除します。これは以下の例でも同様です。

 E3セル

=SUBSTITUTE(CELL("address",INDEX(B3:B8,MATCH(D3,B3:B8,0))),"$","")

 


 「INDEX(~,MATCH(~))」の代わりにXLOOKUP関数を使うと式がより簡単になります。

 E3セル

=CELL("address",XLOOKUP(D3,B3:B8,B3:B8))

 XLOOKUP関数も値を検索して対応する値を返す関数ですが、CELL関数で囲むことで「その値(XLOOKUP関数の戻り値)が入っているセルの情報」を取得することができます。



 次もちょっと複雑ですが、データが縦横に並んだ表から値を検索して、その値があるセルの番地を取得しています。

 H3セル

=XLOOKUP(G3,TOCOL(B3:E5),TOCOL(MAP(B3:E5,LAMBDA(a,CELL("address",a)))))

 考え方としては上記のセル位置取得の例と同様で、①表のデータを縦1列に並べる、②表のセル番地を縦1列に並べる、③XLOOKUPによりG3セルの値を①から検索して対応する②の値を取得する、という内容です。
 検索値が表中に複数存在する場合は、最も上の行の最も左の列にあるもののセル番地を取得します。

行番号/列番号を取得する方法

 次の画像では、B3:B8の範囲からD3セルの値(日本)を検索し、その値が入っているセルの行番号を取得しています。
 「日本」という値はB5セルにありますので、結果は「5」となっています。

 E3セル

=ROW(INDEX(B3:B8,MATCH(D3,B3:B8,0)))

 「INDEX(B3:B8,MATCH(D3,B3:B8,0))」だけだとやはり「日本」という文字列が得ってくるだけですが、これをROW関数で囲むことでその値が入っているセルの行番号が取得できます。



 ところで、次のようにすればずっと簡単に同じ結果が得られます。

 E3セル

=MATCH(D3,B:B,0)

 MATCH関数の検索対象を列全体にしてしまえば、上から○番目という検索結果=列番号になる、というわけです。
 この例だけでなく、たとえば上記のセル番地取得のような例でも同様に列全体を検索対象とすることで式を短縮することができます。
 ただしこのようなやり方は、列全体を検索するつもりであれば全く問題ないのですが「表内を検索する」という場合は表の上方(B1やB2セル)や下方(B9セル以降)に検索値が存在しないこと確認しておく必要があります



 横方向に検索して列番号(A列なら1、B列なら2…)を取得することもできます。
 ただしROW関数の代わりにCOLUMN関数を使います。

 C7セル

=COLUMN(INDEX(C2:H2,MATCH(B7,C2:H2,0)))

 


 これもMATCH関数だけで簡単に同じ結果が得られます。

 C7セル

=MATCH(B7,2:2,0)

 ただし表の左右(A2,B2セルやI2セル以降)に検索値が存在すると(表内を検索するという)検索意図と異なる結果になるので、そのような値が存在しないことを確認しておく必要があります。



 次の画像ではXLOOKUP関数とROW関数を使って行番号を取得しています。
 式も比較的簡潔で、表外の値を考慮する必要がありません。

 E3セル

=ROW(XLOOKUP(D3,B3:B8,B3:B8))

 


 ROW関数をCOLUMN関数に代えると列番号が取得できます。

 C7セル

=COLUMN(XLOOKUP(B7,C2:H2,C2:H2))

 


 次は複数行複数列から検索するケースです。

 H3セル(行番号)及びI3セル(列番号)

=XLOOKUP(G3,TOCOL(B3:E5),TOCOL(MAP(B3:E5,LAMBDA(a,ROW(a)))))
=XLOOKUP(G3,TOCOL(B3:E5),TOCOL(MAP(B3:E5,LAMBDA(a,COLUMN(a)))))

 H3セルの式の内容については①表のデータを縦1列に並べる、②表内の各セルの行番号を縦1列に並べる、③XLOOKUP関数でG3セルの値を①の結果から検索し、対応する②の値を取得する、というものです。I3セルの式も列番号を取得しているだけでほぼ同じです。
 検索値が表中に複数存在する場合は、最も上の行の最も左の列にあるものの行/列番号を取得します。

対象セルを直接指定してセル位置を取得する方法

セル番地を取得する方法

 次の画像は、B3セルに「=CELL("address",D6)」と入力しているところです。
 これまでの例では何らかの値を検索することで対象となるセルを間接的に指定していましたが、ここでは引数として対象のセルD6を直接指定しているのがポイントです。

 


 確定すると「$D$6」と表示されました。
 なお「=CELL("address")」とするとその式が入力されているセルのセル番地が取得できます。

行番号/列番号を取得する方法

 次の画像ではB3セルに「=ROW(D6)」と入力することでD6セルの行番号「6」を取得しています。
 このようにROW関数を使って引数に対象セルを指定することで、そのセルの行番号が取得できます。
 なお「=ROW()」とするとその式が入力されているセルの行番号が取得できます。

 


 次の画像ではB3セルに「=COLUMN(D6)」と入力することでD6セルの列番号「4」を取得しています。
 このようにCOLUMN関数を使って引数に対象セルを指定することで、そのセルの列番号が取得できます。
 「=COLUMN()」とするとその式が入力されているセルの列番号が取得できます。

指定した行/列番号のセル番地を取得する方法

 次の画像では、B3,C3セルにそれぞれ行番号(シートの上から〇番目)と列番号(シートの左から〇番目)の数値が入力されています。
 そこでD3セルに数式を入力し、行番号と列番号に対応するセル番地の文字列を取得しています。

 D3セル

=ADDRESS(B3,C3)

 ADDRESS関数を使うことで行番号と列番号に対応するセル番地を取得できます。
 「$」を消したい場合はSUBSTITUTE関数を使ってもいいですがADDRESS関数の第3引数で「$」の有無を指定でき、この例では「=ADDRESS(B3,C3,4)」とすることで「D6」の文字列が得られます。