シートが10枚、20枚と増えてくると、目的のシートを探すのに一苦労していませんか。
そんなときに困ることは、
・ブックの全体像が分からず、どこに何があるか説明できない
・外部に提出するときに、体裁が整っていないと恥ずかしい
ですね。
そこでおすすめなのが、ブックの先頭に「目次シート」を置くことです。
目次から各シートへ飛べて、各シートからは目次へ戻れる。この行き来ができるだけで、ブックの使い勝手は驚くほど変わります。
今回はそんなお悩みを解決する、
・各シートへのハイパーリンクを張る方法
・各シートから目次へ戻るリンクを張る方法
・特定のシートを目次から除外する方法
・うまくいかないときの対処法
についてまとめます!
完成イメージ
マクロを実行すると、ブックの先頭に「目次」シートが作られ、5つのシートへのリンクが並びます。
– 「▶ 開く」をクリックすると、そのシートへ移動
– 「内容」の列には、シートの役割をメモとして記載
– 非表示シートは自動で除外(作業用のシートを載せない)
さらに、各シートのB1セルには「← 目次へ戻る」リンクが入ります。
これで「目次 → 各シート → 目次」の行き来がワンクリックでできるようになります。
もくじ
目次シートがあると何が変わるのか
| 場面 | 目次がない場合 | 目次がある場合 |
|---|---|---|
| 目的のシートを探す | タブを1枚ずつ確認する | 目次から1クリックで移動 |
| ブックの全体像 | タブの名前だけで判断する | 一覧で把握できる |
| 外部への提出 | 受け取った人が迷う | 構成が伝わり体裁が整う |
| シートを行き来する | タブをクリックして戻る | 戻りリンクで一発 |
・リンクは Hyperlinks.Add と SubAddress の組み合わせで作ります
・外部ファイルではなく「ブック内の移動」なので、SubAddress にシート名を書きます
・非表示シートは除外するのが実務的です(作業用シートを見せない)
STEP1. サンプルのブックを用意する
まずは練習用に、次の6シートを作ってください(1枚は非表示にします)。
| シート名 | 内容(A1セルから入力) |
|---|---|
| 売上データ | 商品/数量/単価/金額(=B2*C2 の数式) |
| 在庫管理 | 商品/在庫/発注点 |
| 請求書 | 請求先/金額/締日 |
| 勤怠管理 | 氏名/出勤/退勤 |
| マスタ | コード/名称 |
| 作業用(非表示) | メモ(あとで非表示にします) |
売上データの表はこちらです(そのまま貼り付けられます)。
| 商品 | 数量 | 単価 | 金額 |
|---|---|---|---|
| ノートPC | 8 | 148000 | =B2*C2 |
| マウス | 25 | 3980 | =B3*C3 |
| モニター | 12 | 32800 | =B4*C4 |
| キーボード | 20 | 6800 | =B5*C5 |
「作業用(非表示)」シートは、シートタブを右クリック→「非表示」にしておきましょう。
STEP2. 目次シートを作成するマクロを貼る
Alt+F11 でVBE(Visual Basic Editor)を開き、「挿入」→「標準モジュール」で次のコードを貼り付けます。
Sub 目次シートを作成する()
Dim ws As Worksheet, toc As Worksheet
Dim r As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' ① 既存の目次シートを削除する(何度実行しても重複しない)
On Error Resume Next
Worksheets("目次").Delete
On Error GoTo 0
' ② 先頭に目次シートを挿入する
Set toc = Worksheets.Add(Before:=Worksheets(1))
toc.Name = "目次"
toc.Range("A1").Value = "目次"
toc.Range("A1").Font.Size = 18
toc.Range("A1").Font.Bold = True
toc.Range("A4:C4").Value = Array("シート名", "移動", "内容")
toc.Range("A4:C4").Font.Bold = True
' ③ シートを1枚ずつ目次に登録する
r = 5
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "目次" And ws.Visible = xlSheetVisible Then
toc.Cells(r, 1).Value = ws.Name
toc.Hyperlinks.Add Anchor:=toc.Cells(r, 2), Address:="", _
SubAddress:="'" & ws.Name & "'!A1", TextToDisplay:="▶ 開く"
' 各シートに目次へ戻るリンクを張る
ws.Range("B1").Value = "← 目次へ戻る"
ws.Hyperlinks.Add Anchor:=ws.Range("B1"), Address:="", _
SubAddress:="'目次'!A1", TextToDisplay:="← 目次へ戻る"
r = r + 1
End If
Next ws
toc.Range("A4:C" & (r - 1)).Borders.LineStyle = 1
toc.Columns("A:C").AutoFit
toc.Activate
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox (r - 5) & "件のシートを目次に登録しました"
End Sub
コードのポイント
| 行 | やっていること |
|---|---|
| Worksheets(“目次”).Delete | 前回作った目次を消す(再実行しても重複しない) |
| Worksheets.Add(Before:=Worksheets(1)) | 1枚目の前に挿入=ブックの先頭に目次が来る |
| ws.Visible = xlSheetVisible | 非表示シートを目次に載せない |
| SubAddress:=”‘シート名’!A1″ | ブック内のシートへ移動するリンク(外部ファイルではない) |
| SubAddress:=”‘目次’!A1″ | 各シートから目次へ戻るためのリンク |
STEP3. マクロを実行する
VBEで F5 を押すか、Excelに戻って「開発」タブ→「マクロ」から実行します。
「5件のシートを目次に登録しました」と表示されれば成功です。
実行結果を実際に確認したものがこちらです。
| 項目 | 実測値 |
|---|---|
| ブックのシート数 | 7 件(サンプル6+目次) |
| 目次に登録されたシート | 5 件(非表示の1枚は除外) |
| 目次シートのハイパーリンク | 5 件 |
| 各シートの戻りリンク | 5 件(すべて ‘目次’!A1 を参照) |
| リンク遷移の動作 | 目次 → 売上データ(実測で確認) |
STEP4. リンクで移動してみる
目次シートの「▶ 開く」をクリックすると、そのシートへ移動します。
移動先のシートでは、B1セルの「← 目次へ戻る」をクリックすれば、すぐに目次へ戻れます。
タブを探してクリックする手間がなくなるので、シートが多いブックほど効果を実感できますね。
・戻りリンクを置くセルは各シートで空いているセルにしましょう(今回はB1)
・見出しに使っているセルに置くと文字が消えてしまうので注意してください
STEP5. 特定のシートを目次から除外する
「マスタ」や「作業用」のように目次に載せたくないシートは、条件で除外できます。
Sub 除外シートを指定して目次を作成する()
Dim ws As Worksheet, toc As Worksheet
Dim r As Long
Dim 除外リスト As String
' 目次に載せないシート名をカンマ区切りで指定する
除外リスト = ",マスタ,作業用,"
Application.DisplayAlerts = False
On Error Resume Next
Worksheets("目次").Delete
On Error GoTo 0
Set toc = Worksheets.Add(Before:=Worksheets(1))
toc.Name = "目次"
toc.Range("A1").Value = "目次"
toc.Range("A1").Font.Bold = True
r = 3
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "目次" Then
If ws.Visible = xlSheetVisible Then
If InStr(除外リスト, "," & ws.Name & ",") = 0 Then
toc.Cells(r, 1).Value = ws.Name
toc.Hyperlinks.Add Anchor:=toc.Cells(r, 1), Address:="", _
SubAddress:="'" & ws.Name & "'!A1", TextToDisplay:=ws.Name
r = r + 1
End If
End If
End If
Next ws
toc.Columns("A").AutoFit
Application.DisplayAlerts = True
MsgBox (r - 3) & "件を目次に登録しました(除外指定を反映)"
End Sub
| 除外のしかた | 書き方 | 向いている場面 |
|---|---|---|
| シート名で除外 | 除外リストに「,マスタ,作業用,」と書く | 載せたくないシートが決まっている |
| 非表示で除外 | シートを非表示にする(自動で除外) | 一時的な作業用シート |
| 先頭の文字で除外 | 名前に「_」を付けたシートを除外する | 作業用シートをまとめて外したい |
| 色で除外 | タブの色が灰色のシートを除外する | ルールを色で決めている |
補足すると、非表示シートは何もしなくても自動で除外されます。
「見せたくないシートは非表示にする」という運用と組み合わせるのが一番カンタンですね。
うまくいかないときの対処法(トラブルシュート)
実際に試すと、うまく動かないこともあるかもしれません。
よくあるつまずきと対処法をまとめました。
| 症状 | 原因 | 対処 |
|---|---|---|
| リンクを押しても移動しない | SubAddress のシート名が正しくない | シート名を‘シート名’!A1 の形でシングルクォートで囲む |
| 実行時エラー 1004 が出る | 同じ名前のシートが既にある | 先に Worksheets(“目次”).Delete を入れる |
| 目次が2つできてしまう | 再実行時に古い目次が残っている | 削除処理(On Error Resume Next)を入れる |
| 戻りリンクで文字が消えた | 見出しのあるセルにリンクを置いた | 空いているセル(B1など)に置く |
| 非表示シートが載ってしまう | 可視判定が抜けている | ws.Visible = xlSheetVisible を条件に入れる |
| シート名を変えたらリンクが切れた | シート名を変えるとリンク先が変わる | シート名を変えたらマクロを再実行する |
| 記号入りのシート名でエラー | ! や [ を含む名前はリンクに使えない | シート名から記号を外す(全角の![]にする) |
よくある間違い
| 間違い | 起きること | 正しい書き方 |
|---|---|---|
| Worksheets.Add だけで目次を作る | 末尾に追加されて先頭に来ない | Before:=Worksheets(1) を付ける |
| SubAddress をダブルクォートだけで書く | シート名に記号があるとリンクが壊れる | ‘シート名’! とシングルクォートで囲む |
| Address にシート名を書く | 外部ファイル扱いになりエラーになる | ブック内は SubAddress に書く |
| 可視判定をしない | 非表示シートが目次に載る | xlSheetVisible で判定する |
| 目次シートを除外しない | 目次の中に「目次」の行ができる | ループ内で目次自身をスキップする |
| 毎回手で目次を作り直す | リンク切れが起きる | マクロを再実行するだけで貼り直し |
エク短流:シート名を取得してから目次を作る
「どんなシートがあるか分からない」ときは、先にシート名を一覧にすると安全です。
Sub シート名を一覧にする()
Dim ws As Worksheet, i As Long
i = 2
With ActiveSheet
.Range("A1").Value = "No"
.Range("B1").Value = "シート名"
.Range("C1").Value = "表示状態"
For Each ws In ThisWorkbook.Worksheets
.Cells(i, 1).Value = i - 1
.Cells(i, 2).Value = ws.Name
.Cells(i, 3).Value = IIf(ws.Visible = xlSheetVisible, "表示", "非表示")
i = i + 1
Next ws
.Range("A1:C" & (i - 1)).Borders.LineStyle = 1
.Columns("A:C").AutoFit
End With
MsgBox ThisWorkbook.Worksheets.Count & "枚のシートがあります"
End Sub
これでシートの一覧と表示状態が一度に分かります。
目次を作る前に一度実行しておけば、除外したいシートの当たりを付けられますね。
「作ったときだけ」ではなく何度でも貼り直せる形にしておくのが、形骸化させないコツですよ。
さいごに
今回は、Excelで目次シートを一瞬で作成する方法をまとめました。
2. 各シートへのリンクは Hyperlinks.Add + SubAddress で張る
3. 戻りリンクは各シートの空いているセルに張る(今回はB1)
4. 非表示シートは自動で除外される(可視判定を入れる)
5. 再実行しても壊れないよう、最初に古い目次を削除する
シートが増えてきたブックほど、目次があるだけで使いやすさが変わります。
外部に資料を提出するときの体裁も整いますので、まずは今回のサンプルで一度試してみてください。
最後までお読みいただきありがとうございました。









コメントを残す