【Excel VBA】セル単位の目次作成用の情報収集マクロ

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

台帳の目次シート(セル項目とその通しページ数をまとめたもの)をメンテナンス用に作成したExcel VBAマクロです。

改ページを含んだシートで、各シート内のB列・C列に必要な項目(大項目、中項目)が点在している場合でも、自動的に通しページを取得して情報収集できます。

Option Explicit

'検索範囲
Const 大項目検索範囲 As String = "B1:B1000"
Const 中項目検索範囲 As String = "C1:C1000"

Type 項目情報
    項目名 As String
    ページ As Integer
    通しページ As Integer
    項目の場所 As String
End Type

Const 項目総数 As Integer = 5
Type シート情報
    シート名 As String
    ページ数 As Integer
    大項目(項目総数) As 項目情報
    中項目(項目総数) As 項目情報
End Type

Const シート総数 As Integer = 5
Type 目次情報
    総ページ数 As Integer
    シート数 As Integer
    シート(シート総数) As シート情報
End Type

Dim 目次 As 目次情報
Dim 初期化値 As 目次情報

Sub デバッグ表示(ByRef 目次 As 目次情報)
    Dim msg As String
    Dim i As Integer, j As Integer
    
    msg = "総ページ数=" & 目次.総ページ数 & " シート数=" & 目次.シート数 & vbCrLf
    
    For i = 0 To 目次.シート数 - 1
        msg = msg & " シート名=" & 目次.シート(i).シート名
        msg = msg & " ページ数=" & 目次.シート(i).ページ数
        
        msg = msg & "----大項目-----" & vbCrLf
        For j = 0 To 項目総数
            msg = msg & "  項目名=" & 目次.シート(i).大項目(j).項目名
            msg = msg & " 項目の場所=" & 目次.シート(i).大項目(j).項目の場所
            msg = msg & " ページ=" & 目次.シート(i).大項目(j).ページ
            msg = msg & " 通しページ=" & 目次.シート(i).大項目(j).通しページ & vbCrLf
        Next j
        
        msg = msg & "----中項目-----" & vbCrLf
        For j = 0 To 項目総数
            msg = msg & "  項目名=" & 目次.シート(i).中項目(j).項目名
            msg = msg & " 項目の場所=" & 目次.シート(i).中項目(j).項目の場所
            msg = msg & " ページ=" & 目次.シート(i).中項目(j).ページ
            msg = msg & " 通しページ=" & 目次.シート(i).中項目(j).通しページ & vbCrLf
        Next j
    Next i
    
    Debug.Print msg
    テキスト出力 msg
End Sub

Sub テキスト出力(ByVal strREC As String)
    Const cnsTitle = "テキストファイル出力処理"
    Const cnsFilter = "テキストファイル (*.txt;*.dat),*.txt;*.dat"
    Dim xlAPP As Application
    Dim intFF As Integer
    Dim strFileName As String
    Dim vntFileName As Variant
    
    Set xlAPP = Application
    vntFileName = xlAPP.GetSaveAsFilename(InitialFileName:="result.txt", _
                                         FileFilter:=cnsFilter, _
                                         Title:=cnsTitle)
    If VarType(vntFileName) = vbBoolean Then Exit Sub
    strFileName = vntFileName

    intFF = FreeFile
    Open strFileName For Output As #intFF
    Print #intFF, strREC
    Close #intFF
    MsgBox "ファイル出力が完了しました。", vbInformation, cnsTitle
End Sub

Sub 目次情報取得()
    On Error GoTo EXCEPTION
    
    Dim TrgWbk As Workbook
    Dim ws As Worksheet
    Dim i As Integer
    
    目次 = 初期化値
    i = 0
    Set TrgWbk = ActiveWorkbook
    
    目次.シート数 = TrgWbk.Worksheets.Count
    For Each ws In TrgWbk.Worksheets
        ws.Activate
        ActiveWindow.View = xlPageBreakPreview
        
        Call 目次情報取得2(目次.シート(i), ws)
        目次.総ページ数 = 目次.総ページ数 + ws.PageSetup.Pages.Count
        
        i = i + 1
    Next ws

    Call デバッグ表示(目次)
    Exit Sub

EXCEPTION:
    Call MsgBox(Err.Number & " " & Err.Source & " " & Err.Description)
End Sub

Sub 目次情報取得2(ByRef シート As シート情報, ByVal ws As Worksheet)
    On Error GoTo EXCEPTION
    
    Dim i As Integer
    Dim c As Range
    
    シート.シート名 = ws.Name
    シート.ページ数 = ws.PageSetup.Pages.Count
    i = 0
    For Each c In ws.Range(大項目検索範囲)
        If c.Value <> "" Then
            If i < 項目総数 Then
                シート.大項目(i).項目名 = c.Value
                シート.大項目(i).項目の場所 = c.Address
                シート.大項目(i).ページ = getPageNumber(ws, c)
                シート.大項目(i).通しページ = 目次.総ページ数 + シート.大項目(i).ページ
                i = i + 1
            End If
        End If
    Next c
    
    i = 0
    For Each c In ws.Range(中項目検索範囲)
        If c.Value <> "" Then
            If i < 項目総数 Then
                シート.中項目(i).項目名 = c.Value
                シート.中項目(i).項目の場所 = c.Address
                シート.中項目(i).ページ = getPageNumber(ws, c)
                シート.中項目(i).通しページ = 目次.総ページ数 + シート.中項目(i).ページ
                i = i + 1
            End If
        End If
    Next c
    
    Exit Sub
EXCEPTION:
    Err.Raise Err.Number, "目次情報取得2->" & Err.Source, Err.Description
End Sub

Public Function getPageNumber(ByVal ws As Worksheet, ByVal TargetCell As Range) As Long
    On Error GoTo EXCEPTION
    Dim HPB As HPageBreak
    Dim m As Long

    For Each HPB In ws.HPageBreaks
        If HPB.Location.Row > TargetCell.Row Then Exit For
        m = m + 1
    Next
    getPageNumber = m + 1
    
    Exit Function
EXCEPTION:
    Err.Raise Err.Number, "getPageNumber->" & Err.Source, Err.Description
End Function

この記事の更新履歴

この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。

2026年9月11日

  • 変更VBAコード内で実行時エラーの原因となっていたErr.Raiseの不適切な引数指定を修正しました。
  • 変更段落タグ内に平文で書かれていたVBAコードを、可読性の高いコードブロック形式に修正しました。

文書情報

記事タイトル
【Excel VBA】セル単位の目次作成用の情報収集マクロ
作成日
更新日
Source URL
https://papanda925.com/?p=426

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました