いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Excel)シート名を関数で取得する

 Excelで、シートの名前を関数を使って取得する方法についてです。

  • CELL関数を使って得られる文字列をもとに、シートの名前を取得することができます。

手順

簡便な方法

 画像ではB3セルに次のような式を入力することで、そのシートの名前を取得しています。

f:id:accs2014:20201103123845p:plain:w700

 B3セル

=REPLACE(CELL("filename",B3),1,FIND("]",CELL("filename",B3)),"")

 「CELL("filename",B3)」によりファイル(ブック)が存在するパス・ファイル名・シート名までを記した文字列が得られます(詳しくは2つ下の画像を参照)。
 この文字列はファイル名が角カッコで挟まれた形式になっています。つまりシート名の直前が「]」となっていますので、REPLACE関数とFIND関数を使って1文字目から「]」の位置までを空文字列に置き換えています。結果的にシート名だけが残るというわけです。

 
 次の画像も同じ内容ですが、LET関数を使って式を若干短縮しています。

f:id:accs2014:20201103123849p:plain:w650

 B3セル

=LET(x,CELL("filename",B3),REPLACE(x,1,FIND("]",x),""))

 「CELL("filename",B3)」の部分に「x」という名前を与え、記述を1度だけで済ませています。

 
 参考までに、CELL関数により得られている文字列は次のようなものです。拡張子を含むファイル名が角カッコで囲まれているため、「]」の後がシート名であるという目印になっていることがわかります。

f:id:accs2014:20201103123857p:plain:w650

CELL関数の第2引数(対象範囲)を省略できない理由

 CELL関数で第2引数(対象範囲。つまりセル参照)を省略した場合、式が入力されているセルに関する結果を返します。
 よって上記の式でも参照を省略してよいように思われますが、省略すると他の箇所にあるCELL関数が再計算されたときにその結果が(参照を省略したCELL関数の結果に)反映されてしまいます。
 画像のブックではシート2とシート3に同じ内容の式を置いており、第2引数を省略しています。しかしシート2に存在する同様の式が再計算された際にその結果がシート3の式の結果に反映されてしまい、適当でない結果となっています。

f:id:accs2014:20201103123853p:plain:w700

パスが角カッコを含む場合の対応

f:id:accs2014:20201103123902p:plain:right:w550

 上記の式で大抵の場合は問題ないのですが、パスに角カッコが含まれる場合には注意する必要があります。
 この例ではファイルを置いてあるフォルダの名前に角カッコが含まれています。

 
 このフォルダ内で上記の式を実行すると、フォルダ名の途中以降を取得してしまいうまくいきません。

f:id:accs2014:20201103123906p:plain:w700

 
 よって最後にある角カッコの位置を特定することが必要になります。
 これに対応した式の例としては次のようなものが挙げられます。

f:id:accs2014:20201103123910p:plain:w780

 B3セル

=LET(x,CELL("filename",B3),REPLACE(x,1,MAX(IFERROR(FIND("]",x,SEQUENCE(LEN(x))),"")),""))

 相当長くなるのではじめからLET関数を使用しています。
 キモとなるのは「MAX(IFERROR(FIND("]",x,SEQUENCE(LEN(x))),""))」の部分で、これにより「]」のうち最後のものの位置を取得しています。あとは上記の例と全く同じように、REPLACE関数を使って1文字目から最後の「]」までを空文字列に置き換えています。
 この「MAX~」の部分について、詳しくは次の記事でご確認ください。

www.officeisyours.com


 なお、ファイル名に角カッコが含まれる場合はCELL関数で取得した際に普通のカッコに変換されます。また、シート名に角カッコを付けることはできませんので取得の上では問題になりません。