Excelの情報整理を始める前に、シート名を一覧化する

Excelに蓄積された情報を整理するとき、すぐに統合や加工を始めるとは限りません。

複数のシートを含むブックでは、まず、そのファイルにどのようなシートが含まれているかを把握する必要があります。

シート数が少なければ目視でも確認できますが、シートが増えると、全体構成を確認するだけでも時間がかかります。

そこで、指定したExcelファイルに含まれるワークシート名を、VBAで一覧化するマクロを作成しました。

情報整理の最初に、構造を確認する

Excelブック内の情報を再利用しやすい形へ整理する場合、最初に確認したいのは、データの内容だけではありません。

次のような構造も確認する必要があります。

  • いくつのシートが含まれているか
  • どのような名前で分類されているか
  • 統合対象になりそうなシートはどれか
  • 確認対象外のシートが含まれていないか
  • 同じような名称のシートが重複していないか

シート名は、Excelブック内の分類や構成を表していることがあります。

そのため、一覧化しておくだけでも、その後の整理方法を検討しやすくなります。

今回作成したマクロ

今回のマクロでは、ファイル選択ダイアログからExcelファイルを指定し、そのファイルに含まれるワークシート名を一覧として取得します。

一覧は、マクロを保存しているブック内のシート名一覧シートへ出力します。

出力される項目は、次の2つです。

項目 内容
シート番号 対象ブック内でのシートの順番
シート名 ワークシートの名称

出力イメージ

一覧は、次のような形式で作成されます。

シート番号 シート名
1 Summary
2 Data_01
3 Data_02
4 Checklist

実際の業務ファイルではなく、記事内では一般化したシート名を使用しています。

VBAコード

Option Explicit

Sub ExtractSheetNamesFromSelectedFile()

    Dim wbTarget As Workbook
    Dim wsOutput As Worksheet
    Dim wbSheet As Worksheet
    Dim targetPath As Variant
    Dim i As Long

    On Error GoTo ErrorHandler

    ' ファイル選択ダイアログを表示する
    targetPath = Application.GetOpenFilename( _
        FileFilter:="Excel Files (*.xls; *.xlsx; *.xlsm; *.xlsb), *.xls; *.xlsx; *.xlsm; *.xlsb", _
        Title:="シート名を取得するExcelファイルを選択してください" _
    )

    ' キャンセルされた場合は処理を終了する
    If targetPath = False Then
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ' 既存の「シート名一覧」シートがある場合は削除する
    On Error Resume Next
    ThisWorkbook.Worksheets("シート名一覧").Delete
    On Error GoTo ErrorHandler

    Application.DisplayAlerts = True

    ' 出力用シートを作成する
    Set wsOutput = ThisWorkbook.Worksheets.Add( _
        After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) _
    )

    wsOutput.Name = "シート名一覧"

    ' 見出しを設定する
    wsOutput.Cells(1, 1).Value = "シート番号"
    wsOutput.Cells(1, 2).Value = "シート名"

    ' 対象ファイルを読み取り専用で開く
    Set wbTarget = Workbooks.Open( _
        Filename:=CStr(targetPath), _
        ReadOnly:=True, _
        UpdateLinks:=False _
    )

    ' 対象ブックのワークシート名を一覧へ出力する
    i = 2

    For Each wbSheet In wbTarget.Worksheets
        wsOutput.Cells(i, 1).Value = i - 1
        wsOutput.Cells(i, 2).Value = wbSheet.Name
        i = i + 1
    Next wbSheet

    ' 対象ブックを保存せずに閉じる
    wbTarget.Close SaveChanges:=False
    Set wbTarget = Nothing

    ' 表示を整える
    With wsOutput
        .Rows(1).Font.Bold = True
        .Columns("A:B").AutoFit
        .Range("A1:B" & i - 1).Borders.LineStyle = xlContinuous
        .Activate
    End With

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    MsgBox "指定したファイルからシート名を取得しました。", vbInformation

    Exit Sub

ErrorHandler:

    ' 対象ブックが開いている場合は保存せずに閉じる
    If Not wbTarget Is Nothing Then
        wbTarget.Close SaveChanges:=False
    End If

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    MsgBox _
        "処理中にエラーが発生しました。" & vbCrLf & _
        "エラー番号: " & Err.Number & vbCrLf & _
        "内容: " & Err.Description, _
        vbExclamation

End Sub

マクロの動作

このマクロを実行すると、次の順序で処理されます。

  1. シート名を取得したいExcelファイルを選択する
  2. 対象ファイルを読み取り専用で開く
  3. 対象ファイルのワークシート名を取得する
  4. マクロを保存しているブックへ一覧を作成する
  5. 対象ファイルを保存せずに閉じる

元のExcelファイルへシートを追加したり、内容を書き換えたりする処理は行いません。

なぜ読み取り専用で開くのか

今回は、対象ファイルの内容を変更する必要がありません。

必要なのは、ワークシート名の取得だけです。

そのため、対象ファイルは次のように読み取り専用で開いています。

Set wbTarget = Workbooks.Open( _
    Filename:=CStr(targetPath), _
    ReadOnly:=True, _
    UpdateLinks:=False _
)

ReadOnly:=Trueを指定することで、対象ファイルを編集せずに開きます。

また、UpdateLinks:=Falseを指定し、外部リンクの更新を行わないようにしています。

SheetsではなくWorksheetsを使用する理由

Excel VBAでは、SheetsWorksheetsは似ていますが、対象範囲が異なります。

Sheetsには、通常のワークシート以外に、グラフシートなどが含まれる場合があります。

今回は、表形式の情報が入力されるワークシート名を取得することが目的です。

そのため、次のようにWorksheetsを使用しています。

For Each wbSheet In wbTarget.Worksheets

一覧化した後に考えられること

シート名を一覧化すると、次のような確認へ進みやすくなります。

  • 同じ形式のシートが複数あるか
  • シート名に一定の命名規則があるか
  • 古いシートや重複シートが含まれていないか
  • 統合対象となるシートはどれか
  • チェックリスト化やデータベース化が可能か

シート名の一覧そのものが最終成果ではありません。

一覧化は、Excel内の情報構造を把握し、その後の整理方法を考えるための準備です。

Excelブックを確認する
↓
シート構成を一覧化する
↓
対象となる情報の範囲を把握する
↓
統合・分類・比較の方法を決める
↓
再利用しやすい形へ整理する

情報を再利用しやすくするために

調査結果や業務上の情報は、保存されているだけでは、必ずしも再利用しやすい状態とはいえません。

Excel、表、チェックリスト、ナレッジベースなどへ展開する場合、最初に必要なのは、対象となる情報の構造を確認することです。

今回のシート名一覧化は、そのための小さな処理の一つです。

情報整理では、いきなり複雑な処理を始めるのではなく、次のように段階を分けることが重要です。

  1. 対象を確認する
  2. 構造を把握する
  3. 不要な情報を除外する
  4. 必要な単位へ整理する
  5. 再利用できる形式へ変換する

利用時の注意点

このマクロを使用する際は、次の点に注意してください。

シート名一覧シートは再作成される

マクロを再実行すると、マクロを保存しているブック内のシート名一覧シートは削除され、新しい一覧へ置き換えられます。

手作業で追記した内容がある場合、その内容も削除されます。

非表示シートも一覧に含まれる

Worksheetsには、表示中のシートだけでなく、非表示のワークシートも含まれます。

表示中のシートだけを取得したい場合は、別途条件を追加する必要があります。

ブック構造の保護に注意する

マクロを保存しているブックの構造が保護されている場合、シートの追加や削除ができず、エラーになることがあります。

実際の業務ファイルは公開しない

業務で使用しているExcelファイルには、顧客名、製品名、調査分類、案件名などが含まれている場合があります。

外部公開用の記事では、実際のシート名や画面は使用せず、一般化したサンプルを使用する方が安全です。

まとめ

今回は、指定したExcelファイルに含まれるワークシート名を、VBAで一覧化する方法を紹介しました。

シート名を一覧にするだけのシンプルなマクロですが、複数シートを含むExcelブックの構造を把握するために役立ちます。

調査結果や業務上の情報を再利用しやすい形へ整理するには、最初に対象範囲と情報構造を把握することが重要です。

小さな確認作業を自動化することで、その後の統合、分類、比較、チェックリスト化などへ進みやすくなります。