0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBAでExcelブック内のシート名を一括取得して一覧化する方法

0
Posted at

はじめに

複数のシートを含むExcelブックを整理するとき、最初に確認したいのが、そのブックにどのようなシートが含まれているかです。

シート数が少なければ画面上で確認できますが、数が増えると、目視だけでは全体を把握しにくくなります。

そこで今回は、指定したExcelファイルを選択し、そのブックに含まれるワークシート名を一覧として取得するVBAマクロを作成します。

このマクロを使うと、対象ブックを直接編集せずに、別のマクロ有効ブックへシート名の一覧を出力できます。

目的

今回の目的は、指定したExcelファイルについて、次の情報を一覧化することです。

  • シート番号
  • シート名

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

実行環境・前提条件

この記事では、次の環境を前提とします。

  • Windows版Microsoft Excel
  • VBAを実行できるデスクトップ版Excel
  • マクロ有効ブック形式(.xlsm
  • 対象ファイルはExcel形式(.xls.xlsx.xlsm.xlsb

Web版Excelでは、VBAマクロは実行できません。

このマクロでできること

このマクロを実行すると、次の処理が行われます。

  1. ファイル選択ダイアログを表示する
  2. シート名を取得したいExcelファイルを選択する
  3. マクロを保存しているブック内にシート名一覧シートを作成する
  4. 選択したファイルに含まれるワークシート名を取得する
  5. シート番号とシート名を一覧表示する
  6. 対象ファイルを保存せずに閉じる

対象ファイルは読み取り専用で開くため、元のExcelファイルは変更されません。

出力イメージ

出力結果は、次のような形式になります。

シート番号 シート名
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ファイルを開き、名前を付けて保存を選択します。

ファイル形式は、次を指定してください。

Excel マクロ有効ブック(*.xlsm)

2. VBAエディターを開く

ExcelでAlt + F11を押します。

VBAエディターが開いたら、上部メニューから次を選択します。

挿入
→ 標準モジュール

3. コードを貼り付ける

表示されたコード画面へ、この記事のVBAコードをすべて貼り付けます。

貼り付け後、Ctrl + Sで保存します。

4. マクロを実行する

Excelへ戻り、Alt + F8を押します。

マクロ一覧から、次を選択します。

ExtractSheetNamesFromSelectedFile

実行を押すと、ファイル選択ダイアログが表示されます。

コードの主なポイント

GetOpenFilenameで対象ファイルを選択する

次の処理で、ファイル選択ダイアログを表示しています。

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

Application.GetOpenFilenameは、ファイルを直接開くのではなく、選択されたファイルのパスを返します。

キャンセルされた場合は、Boolean型のFalseが返ります。

そのため、変数targetPathStringではなく、Variantとして宣言しています。

Dim targetPath As Variant

対象ブックを読み取り専用で開く

対象ファイルは、次の処理で開いています。

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

ReadOnly:=Trueを指定することで、対象ファイルを読み取り専用で開きます。

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

Worksheetsを使ってワークシート名を取得する

シート名は、次の処理で取得しています。

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

ここでは、SheetsではなくWorksheetsを使用しています。

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

今回の目的はワークシート名の取得であるため、Worksheetsを使用しています。

既存の一覧シートを削除する

すでにシート名一覧シートが存在する場合は、削除してから新しい一覧を作成します。

Application.DisplayAlerts = False

On Error Resume Next
ThisWorkbook.Worksheets("シート名一覧").Delete
On Error GoTo ErrorHandler

Application.DisplayAlerts = True

Application.DisplayAlerts = Falseを指定することで、シート削除時の確認メッセージを表示しないようにしています。

エラー発生時の処理

対象ファイルを開いた後にエラーが発生すると、ファイルが開いたまま残ることがあります。

そのため、エラー処理内で、対象ブックが開いている場合は保存せずに閉じます。

If Not wbTarget Is Nothing Then
    wbTarget.Close SaveChanges:=False
End If

確認結果

マクロを実行し、対象ファイルを選択すると、マクロを保存しているブック内にシート名一覧シートが作成されます。

次のように表示されれば成功です。

  • A列にシート番号が表示されている
  • B列にシート名が表示されている
  • 1行目が太字になっている
  • A列とB列の幅が自動調整されている
  • 対象ファイルが保存されずに閉じている

情報整理との関係

シート名の一覧化は、小さな処理ですが、Excel内の情報構造を把握するための基本的な作業です。

複数シートを含むブックでは、最初にシート構成を確認しておくことで、次の作業へ進みやすくなります。

Excelブックを選択
↓
シート構成を一覧化
↓
対象となるシートを確認
↓
統合・分類・比較の方法を検討
↓
再利用しやすいデータへ整理

情報を再利用しやすい形へ整理するためには、すぐに統合や加工を始めるのではなく、最初に対象となる情報の範囲と構造を把握することが重要です。

注意点・つまずいた点

マクロを保存するブックと対象ブックは別です

このマクロでは、シート名の一覧をThisWorkbookへ出力しています。

ThisWorkbookは、マクロコードを保存しているExcelブックを意味します。

選択した対象ファイルへ一覧を追加する処理ではありません。

既存のシート名一覧シートは削除されます

マクロを再実行すると、マクロを保存しているブック内のシート名一覧シートは削除され、新しく作り直されます。

同じシートに手作業で追記した内容がある場合、その内容も削除されるため注意してください。

非表示シートも取得されます

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

非表示シートを除外したい場合は、追加の条件分岐が必要です。

保護されたブックでは実行できない場合があります

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

おわりに

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

シート名の一覧化は単純な作業ですが、複数シートを含むExcelブックの全体像を把握するうえで役立ちます。

情報を統合したり、比較したり、再利用可能な形へ整理したりする前に、まず対象となる情報の構造を確認することが重要です。

今後も、Excel、VBA、Pythonなどを使いながら、調査結果や業務上の情報を再利用しやすい形へ整理する方法を記録していきます。

きのとリサーチ
https://kinoto-research.jp/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?