VBAと日々のこぼれ話

  1. VBA

【ExcelVBA】シートごとの見出しを使って目次を作りたい

このブログは、WordPressを使っていますが、最近、目次を作成してくれるプラグインを導入して非常に感動しています。

これをExcelVBAでも実現できないかと。

とはいっても、目次シートに各シート名を取得してハイパーリンクを設定するというコードはごろごろしていて面白くありません。

せっかく作るのであれば、シート内の大見出しへのハイパーリンクも目次に取り入れたい。

目次作成の処理

ポイントとなるのは「どうやって見出しを見出しと認識させるか」です。

セルのプロパティに見出しがあればいいのに楽だったなと思いますが、調べた限りそれはなかったので代替として「セルの名前の定義」を利用しました。

簡単に言うと、セルに見出しだとわかる名前を付けてそれを目印に目次を作ろうじゃないかということです。

【スポンサーリンク】



前提事項

少し制約が多いかなと思いますが、

シート内見出しの段階(レベル)は1つとする
シートの順番は処理したい順に左から並べておくこと
名前定義の範囲は、各シート内を範囲とすること
名前定義の定義名は、対象シート内全てを通して規則があること
名前定義の定義名は、「名前の管理」で確認した際にシート内で処理したい順に上から並んでいること

Excel準備

前提事項に基づいて、シートに名前定義をしていきます。

今回、見出し用の名前定義は「toc_*」(*はシート内連番)で統一しています。

少々面倒ですが、一度定義してしまえば何度も目次を作り直すようなブックであればそれなりに便利になります。

サンプルコード

【スポンサーリンク】



実行後

見出しの名前定義しているセルに数式を設定していても値はきちんと取得できます。

ポイント

ハイパーリンクのパラメータAddressは省略しない

同一ブック内のシートやセルへのハイパーリンクには、SubAddressにリンクしたい場所を設定します。

では、Addressは要らないのでは?という気持ちになりますが、Addressは必須項目ですので空白で設定してあげます。

ハイパーリンク作成前のシート選択

ハイパーリンク作成前(.Add)に、の目次シートを選択(.select)してあげるのは忘れないでください。

各シートのシート範囲内の名前定義を取得した段階で、アクティブシートはその名前定義を取得したシートになっています。

目次シートを選択しないと、シート内の見出しはそのまま各シートに作成されます。

【スポンサーリンク】



VBAの最近記事

  1. Excelシートの最終行を取得したい その1

  2. 【VBA】未だに苦手としていること

  3. 【VBA】モジュール先頭に記述する4種類のOption キーワード ステートメント

  4. 【VBA】同じ階層体系のフォルダを量産したい

  5. VBAの腕を知るための3つの短い質問を考える

関連記事

【スポンサーリンク】




PAGE TOP