現在操作しているブックやワークシートの名称をセルに表示するにはどうしたらいいだろうか。もちろんマクロを使えば簡単だ。しかし、たったそれだけのことで難解なマクロに手を出すのは気が引ける。何とかワークシート関数だけでブック名やシート名を取得できないものだろうか。

 もちろん可能だ。ただしExcelには、ACTIVEWORKBOOK関数やACTIVESHEET関数といった関数はない。そこで、いくつかの関数を組み合わせて関門を突破することにしよう。キーとなるのはCELL関数だ。CELL関数は情報関数と呼ばれるジャンルに属しており、指定したセルの属性や表示形式などを返す関数だ。たとえば、=CELL("protect",A1)と入力したとき、A1セルが保護されていれば0を、保護されていなければ1を返す。このCELL関数に「"filename"」を指定すると、アクティブブックの名前とアクティブシート名を取得することができる。

図1 CELL関数を使うと、アクティブブックとアクティブシートを調べることができる
図1 CELL関数を使うと、アクティブブックとアクティブシートを調べることができる
[画像のクリックで拡大表示]

 ただし、CELL関数が返すのは「パス名+[ファイル名]+シート名」といった連続したデータ。ここから必要な情報だけを抜き出すことになる。最初のパス名は、先頭から「[」の直前になる。そこでFIND関数で「[」の位置を調べてLEFT関数で抜き出す。

図2 パスは、FIND関数で「[」の位置を調べ、「[」から左側を抜き出す
図2 パスは、FIND関数で「[」の位置を調べ、「[」から左側を抜き出す
[画像のクリックで拡大表示]

 ファイル名は「[」と「]」で囲まれているので、「[」の次から「]」の直前までを抜き出せばいい。これにはMID関数とFIND関数を使う。

 MID関数は、任意の文字列の「何文字目から」「何文字分」を抜き出す関数だ。たとえば「日経BP社」の「3文字目」から「2文字分」を抜き出すには「MID("日経BP社",3,2)」とする。結果は「BP」となる。このMID関数を使って、CELL関数の結果から「[」から「]」までを抜き出すには、次のように考えればいい。CELL関数はセルB2に入力されているとしよう。

MID(B2,[の位置+1,ブック名の文字数)
  ↓
MID(B2,[の位置+1,]の位置-[の位置-1)
  ↓
MID(B2,FIND("[",B2)+1,]の位置-FIND("[",B2)-1)
  ↓
MID(B2,FIND("[",B2)+1,FIND("[",B2)-FIND("[",B2)-1)

図3 「[」の位置と「]」の位置を調べれば、間にあるブック名を取得できる
図3 「[」の位置と「]」の位置を調べれば、間にあるブック名を取得できる
[画像のクリックで拡大表示]

 最後のシート名は]から後ろ全部なので、文字列の右側を抜き出すRIGHT関数と文字数を調べるLEN関数を使って調べることができるが、ここではMID関数の便利な裏技を活用しよう。MID関数は「何文字目から」「何文字分」を抜き出す関数だが、3つめの引数である「何文字分」に、元の文字列(ここではCELL関数の結果)より大きい数字を指定すると「後ろ全部」を抜き出すという特徴がある。今回はこれを使って、次のような数式でシート名を抜き出してみた。

図4 MID関数の第3引数に、元の文字列の長さより大きい数字を指定すると、後ろ全部を抜き出すことができる
図4 MID関数の第3引数に、元の文字列の長さより大きい数字を指定すると、後ろ全部を抜き出すことができる
[画像のクリックで拡大表示]

 なお、上記のMID関数で指定した「256」に深い意味はない。CELL関数の結果より大きい数字であれば、いくつを指定してもかまわない。