
この前シートを毎回更新するブックのハイパーリンクを関数でいちいち修正しなくても良いようにしたいなーと思ったときに、参照値として現在使用しているブック名が必要だったので、マクロを使わずに関数だけでブック名を取得できないか調べたら見事できました!
備忘録を兼ねてシェアしたいと思います(・∀・)
ブック名・シート名を抽出するにはCELL関数が有効!
CELL関数はさまざまな情報をワークシート上に表示することができます。
今回はCELL関数の"filename"というブックのフルパスを表示してくれる引数を活用します。
CELL関数の構成
CELL(検査の種類, [対象範囲])
検査の種類
必ず指定しなければならない引数です。
指定できるものは下記の通りです。(公式ヘルプを参照)
address | 対象範囲の左上隅にあるセルの参照を表す文字列。 |
---|---|
col | 対象範囲の左上隅にあるセルの列番号。 |
color | 負の数を色で表す書式がセルに設定されている場合は 1。それ以外の場合は 0 (ゼロ)。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
contents | 対象範囲の左上隅にあるセルの値 (数式ではない)。 |
filename | 対象範囲を含むファイルのフル パス名 (文字列)。対象範囲を含むワークシートが保存されていなかった場合は、空白文字列 ("")。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
format | セルの表示形式に対応する文字列定数。各種の表示形式に対応する文字列定数については、次の表を参照してください。セルが負数に対応する色で書式設定されている場合、文字列定数の末尾に "-" が付きます。正数またはすべての値をかっこで囲む書式がセルに設定されている場合、結果の文字列定数の末尾に "()" が付きます。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
parentheses | 正の値またはすべての値をかっこで囲む書式がセルに設定されている場合は 1。それ以外の場合は 0。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
prefix | セルの "文字位置" に対応する文字列定数。セルが左詰めの文字列を含むときは単一引用符 (')、右詰めの文字列を含むときは二重引用符 (")、中央揃えの文字列を含むときはキャレット (^)、両揃えの文字列を含むときは円記号 (\)、また、セルにそれ以外のデータが入力されているときは空白文字列 ("") になります。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
protect | セルがロックされていない場合は 0、ロックされている場合は 1。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
row | 対象範囲の左上隅にあるセルの行番号。 |
type | セルに含まれるデータのタイプに対応する文字列定数。セルが空白の場合は "b" (Blank の頭文字)、セルに文字列定数が入力されている場合は "l" (Label の頭文字)、その他の値が入力されている場合は "v" (Value の頭文字) になります。 |
width | 小数点以下を切り捨てた整数のセル幅。セル幅の単位は、既定のフォント サイズの 1 文字の幅と等しくなります。 注: この値は、Excel Online、Excel Mobile、および Excel Starter ではサポートされていません。 |
[対象範囲]
省略可能です。 情報が必要なセルを指定します。(A1など)
この引数を省略した場合、最後に変更されたセルについて、"検査の種類" 引数に指定した情報が返されます。
最後に変更されたセルが他シートや他ブックでも自動で情報が変わってしまうため、抽出したい情報を固定したい場合はきちんとこの引数となるセルを指定しておくのが無難ですね。
対象範囲がセル範囲の場合、その範囲の左上隅のセルに関する情報だけが返されます。
ブック名・シート名の抽出の流れ
大まかな流れとしては、以下の通りです。
- CELLS関数でフルパス取得
- フルパスに対してMID関数などの文字列操作関数でブック名・シート名をそれぞれ抽出
CELLS関数でフルパス取得
ワークシート上の任意のセルで"=CELL("と入力すると、引数である「検査の種類」が一覧で表示されます。
ここで、"filename"のところでTABキーで確定させます。
そうすると、上図のようにCELL関数を入力したセルにフルパスが表示されます。
文字列操作関数でフルパスからブック名・シート名を抽出
フルパスを確認すると、ブック名が"["と"]"で囲われていますので、この文字をキーに抽出ができそうです。
シート名も"]"直後からフルパスの最後の文字まで抽出できれば良さそうですね。
フルパスの文字列が長いため、関数が長くなってわかりにくいので段階的に抽出作業をしていきます。
LEN関数でフルパスの文字数をカウント
手始めにフルパスの文字数を計測します。
今回のフルパスは76文字でした。
LEN関数の復習がしたい方は下記記事をご参照ください。
LEN関数で指定したセルの文字数をカウントする方法 | Excelを制する者は人生を制す ~No Excel No Life~
FIND関数でフルパス中で"["が何文字目かカウント
続いてFIND関数でフルパスの文字列の中で"["が何文字目なのかカウントします。
今回は60文字目でした。
FIND関数の復習をしたい方は下記記事をご参照ください。
FIND関数で任意の文字列が対象データの何文字目にあるかカウントする方法 | Excelを制する者は人生を制す ~No Excel No Life~
FIND関数でフルパス中で"]"が何文字目かカウント
最後にFIND関数でフルパスの文字列の中で"]"が何文字目なのかカウントします。
今回は70文字目でした。
ここまでで下ごしらえは終了です。
MID関数でブック名を抽出
LEN関数・FIND関数で材料集めをしたので、これらをもとにMID関数の開始位置・文字数の引数に組み込んでいきます。
まず、「開始位置」ですが、これはフルパス中でブック名の1文字前にある"["があるため、先ほど求めたC5セルに1を加えた数字になります。よって、"C5+1"となります。
次に「文字数」ですが、ブック名の1文字後ろにある"]"の文字位置を示すC6セルからブック名の1文字前にある"["を示すC5セルを引きます。
ただし、このままだと"]"の1文字分も含まれたままのため、さらに1を引きます。
よって、この部分は"C6-C5-1"となります。
つなげると"=MID(B2,C5+1,C6-C5-1)"となります。これでブック名となる"test.xlsx"の文字列が返りました。
MID関数の復習をしたい方は下記記事をご参照ください。
MID関数で任意の文字列の中の任意の位置から指定した文字数分の文字列を抽出する方法 | Excelを制する者は人生を制す ~No Excel No Life~
RIGHT関数でシート名を抽出
先述のMID関数と似たような考え方ですね。
RIGHT関数の引数となる「文字数」の部分は、フルパスの文字数を示すC4セルからブック名の1文字後ろにある"]"の文字位置を示すC6セルを引きます。
よって、"C4-C6"となります。
つなげると"=RIGHT(B2,C4-C6)"となります。これでシート名となる"Sheet1"の文字列が返りました。
RIGHT関数の復習をしたい方は下記記事をご参照ください。
RIGHT関数で任意の文字列の右端から指定した文字数分の文字列を抽出する方法 | Excelを制する者は人生を制す ~No Excel No Life~
1つのセルの関数だけでブック名・シート名を抽出したいなら
上記ではわかりやすいように段階を踏んで複数セルに分割した上でフルパスからブック名・シート名の抽出作業を行いました。
しかし、特に複数セルに経由する必要がない、あるいはしたくない場合は1セルに複数の関数をネストしても抽出することが可能です。(かなり関数が長くなりますが)
ブック名の抽出
任意のセルに以下の関数を入力します。
"=MID(CELL("filename"),FIND("[",CELL("filename"))+1,FIND("]",CELL("filename"))-FIND("[",CELL("filename"))-1)"
要は上記のB2セル、C4~C6セルに入っていた関数をすべてMID関数内に入れ込んだだけですね。
シート名の抽出
任意のセルに以下の関数を入力します。
"=RIGHT(CELL("filename"),LEN(CELL("filename"))-FIND("]",CELL("filename")))"
こちらも上記のB2セル、C4・C6セルに入っていた関数をすべてRIGHT関数内に入れ込んだ形です。
まとめ
CELL関数はそこまで馴染みがある関数ではないですが、VBAでいうところのプロパティ的な働きをしてくれる関数なので、VBAのコードを打つまでもない処理ならCELL関数の活躍の場はけっこうあるなーと個人的に思いました(・∀・)
ちなみに冒頭で述べたシートを毎回更新するブックのハイパーリンクを関数でいちいち修正しなくても良いようにする方法については今後別記事でご紹介する予定です。
ご参考になれば幸いです。