【PR】を含みます。

プログラミング

【VBA】FileDialogでExcelを選んでシート名一覧を取得する方法

VBA FileDialogでExcelを選んでシート名一覧を取得する方法

Excel VBAで「ユーザーにファイルを選ばせて、その中身を読み取って処理する」という場面は意外と多いです。

たとえば、受領したExcelファイルのシート構成を確認したり、ファイルの内容をもとに集計したりするときに役立ちます。

この記事では、VBAのFileDialogを使って1つのExcelファイルを選択し、選んだブックからシート名一覧(枚数・表示状態など)を取得する方法を、初心者向けにわかりやすく解説します。

この記事でわかること

この記事では、次の流れをひとつずつ確認しながら実装します。

  • FileDialogでファイル選択ダイアログを表示する
  • 選択したExcelファイルのフルパスを取得する
  • 取得したパスのブックを読み取り専用(ReadOnly)で開く
  • 開いたブックからシート名一覧枚数を取得して、一覧として出力する
  • 最後に必ずブックを閉じる(ファイルロックの防止)

VBAで「ファイル選択→シート情報取得」が必要になる場面

ユーザーに「処理したいExcelファイル」を選んでもらえるようにしておくと、毎回パスを変更したりファイルを探し直したりする手間がなくなり、作業がスムーズになります。

さらに、選んだファイルのシート名一覧(シート構成)を取得できるようにしておくと、受領ファイルのチェックや一覧化にもすぐ使えて便利です。

たとえば、次のような場面で役立ちます。

  • 取引先から届いたExcelの必要シート(例:見積/請求/明細)が揃っているかを納品前にチェックしたい
  • 毎月届く複数ファイルのシート構成の差分(増減・名称変更)を検知したい
  • 「Sheet1」「sheet1」などの表記ゆれがあり、統一されているか確認したい
  • マクロや集計処理の前に、対象ブックが想定のシート名で存在するかを事前検証したい
  • ユーザーが選んだExcelに対して、処理対象を指定シートだけに絞りたい(例:明細シートのみ集計)
  • 部署ごとにフォーマットが違うファイルを受け取り、どのフォーマットか(シート構成)で判定して処理を分岐したい
  • 処理ログとして「このファイルのシート一覧」を監査・証跡として残したい(例:改修前後の比較)
  • 大量ファイルを処理する前に、不要なシート(テンプレ・メモ等)が混ざっていないかをチェックしたい

事前準備

今回のサンプルは、.xlsx / .xlsm / .xlsのExcelファイルを対象にしています。

最初にここだけ覚えておくと、エラーやトラブルを減らすことができます。

ポイントは次の2つです。

POINT
  • 開くときは読み取り専用(ReadOnly)にする(誤更新を防ぐ)
  • 処理が終わったら必ずCloseで閉じる(ファイルロックを防ぐ)

「選択したファイルが編集されてしまった」「ファイルが開きっぱなしになった」などの事故を防ぐために、この記事のコードもこの方針で作っています。

【実装コード】FileDialogでファイル選択してシート名一覧を取得

コピペして動かせるように、ファイル選択 → ブックを開く → シート情報を出力 → 閉じる までを一通り入れています。

出力先のシート名はSheet1になっているので、必要に応じて変更してください。

Copyをクリックするとコピーできます。

VBA
Copy
Sub PickFileAndGetSheetInfo()
    Dim fd As FileDialog
    Dim filePath As String
    
    ' ファイル選択ダイアログを作成
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
    With fd
        .Title = "シート情報を取得したいExcelファイルを選択してください"
        .AllowMultiSelect = False
        
        ' フィルタ(Excelファイルだけ表示)
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xlsx;*.xlsm;*.xls"
        .Filters.Add "All Files", "*.*"
        
        ' ダイアログ表示:キャンセルなら終了
        If .Show <> -1 Then Exit Sub
        
        ' 選択されたファイルのパス
        filePath = .SelectedItems(1)
    End With
    
    ' 選択ファイルのシート情報を出力
    OutputSheetList filePath, ThisWorkbook.Worksheets("Sheet1")
    
End Sub
Private Sub OutputSheetList(ByVal filePath As String, ByVal outWs As Worksheet)
    Dim srcWb As Workbook
    Dim ws As Worksheet
    Dim i As Long
    Dim prevScreenUpdating As Boolean
    Dim prevDisplayAlerts As Boolean
    On Error GoTo CleanUp
    ' 現在の設定を退避
    prevScreenUpdating = Application.ScreenUpdating
    prevDisplayAlerts = Application.DisplayAlerts
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    ' 選択したブックを「読み取り専用」で開く
    Set srcWb = Workbooks.Open(Filename:=filePath, ReadOnly:=True, Notify:=False)
    ' 出力先をクリア
    outWs.Cells.Clear
    ' 見出し
    outWs.Range("A1").Value = "No"
    outWs.Range("B1").Value = "SheetName"
    outWs.Range("C1").Value = "Visible"
    outWs.Range("D1").Value = "UsedRange"
    i = 2
    For Each ws In srcWb.Worksheets
        outWs.Cells(i, 1).Value = i - 1
        outWs.Cells(i, 2).Value = ws.Name
        outWs.Cells(i, 3).Value = SheetVisibilityText(ws.Visible)
        outWs.Cells(i, 4).Value = ws.UsedRange.Address(False, False)
        i = i + 1
    Next ws
    ' シート枚数(例としてG1に表示)
    outWs.Range("G1").Value = "SheetCount"
    outWs.Range("H1").Value = srcWb.Worksheets.Count
CleanUp:
    ' 開いたブックは必ず閉じる(保存しない)
    If Not srcWb Is Nothing Then
        srcWb.Close SaveChanges:=False
    End If
    ' 設定を元に戻す(固定でTrueにしない)
    Application.DisplayAlerts = prevDisplayAlerts
    Application.ScreenUpdating = prevScreenUpdating
    ' エラーがあれば表示
    If Err.Number <> 0 Then
        MsgBox "エラー: " & Err.Description, vbExclamation
    End If
End Sub
Private Function SheetVisibilityText(ByVal visibleValue As XlSheetVisibility) As String
    Select Case visibleValue
        Case xlSheetVisible
            SheetVisibilityText = "Visible"
        Case xlSheetHidden
            SheetVisibilityText = "Hidden"
        Case xlSheetVeryHidden
            SheetVisibilityText = "VeryHidden"
        Case Else
            SheetVisibilityText = CStr(visibleValue)
    End Select
End Function

コード解説(ポイントだけ)

FileDialogを表示してファイルパスを取得する

FileDialogは、Excelでよく見かける「ファイルを選択する画面」をVBAから表示できる機能です。

今回は「ファイルを選ぶ」用途なので、msoFileDialogFilePickerを使います。

  • .Title:ダイアログ上部の説明文を設定できます
  • .Filters:表示する拡張子を絞れます(Excelファイルだけにする、など)
  • .Show:ダイアログを表示します。キャンセルされた場合もここで判断できます
  • .SelectedItems(1):ユーザーが選んだファイルのフルパスを取得できます

キャンセルされたときに処理が続くとエラーになりやすいので、.Showの結果を見て早めにExit Subで抜けるのが定番です。

選択したブックを安全に開く(ReadOnly推奨)

ファイルパスを取得後、Workbooks.Openで対象ファイルを開きます。

このとき、誤って上書きしないようにReadOnly:=True(読み取り専用)で開くのがおすすめです。

処理が終わったら必ずClose SaveChanges:=Falseで閉じます。

「開いたまま閉じない」状態が続くと、ファイルがロックされて他の作業に影響が出ることがあります。

また、途中でエラーが出ても閉じ忘れないように、On Error GoTo CleanUpを使って最後に必ずCloseされる流れにしておくと安全です。

Worksheetsをループしてシート情報を取得する

ブックを開けたら、For Each ws In srcWb.Worksheetsでシートを順番に見ていきます。

シートの基本情報は、次のプロパティで取得できます。

  • ws.Name:シート名
  • ws.Visible:表示状態(表示/非表示/非常に非表示)
  • ws.UsedRange:そのシートで「使用済み」と判定されている範囲(例:A1:D20)。空に見えても過去の編集で広がることがあります。

UsedRangeは便利ですが、以前入力して消したセルなどの影響で、見た目が空でも範囲が広く判定されることがあります。

そのため、データの最終行・最終列を正確に取りたい場合は、特定の列(例:A列)を基準にEnd(xlUp)を使うほうが確実です。

データの最終行・最終列を取得する方法は以下の記事で紹介しています。

あわせて読む
【VBA】 最終行・最終列を取得する方法

【VBA】最終行・最終列を取得する方法

VBAでエクセルシートの最終行と最終列を取得する方法を紹介します。 実務でよく使用するため、コピペで使用できるようにまとめました。 もくじ【実装コード】最終行を取得ws.Cells(ws.Rows.C ...

今回のサンプルでは、取得した情報を出力用シートに「一覧」として書き出す形にしています。

Debug.Printでも確認できますが、一覧にしておくと後から見返しやすく、報告にも使いやすいです。

よくあるトラブルと対処法

ファイルを閉じ忘れてロックする

VBAで別ブックを開く処理では、閉じ忘れが一番多いです。

対策として、最後に必ずCloseする処理(CleanUp)を用意し、途中でエラーが出ても必ず閉じる構成にします。

UsedRangeが想定より大きい

UsedRangeは、見た目が空でも「以前触ったセル」などの影響で広がることがあります。

「データの最終行を取りたい」場合は、目的に応じてEnd(xlUp)などを使うほうが確実です。

データの最終行・最終列を取得する方法は以下の記事で紹介しています。

あわせて読む
【VBA】 最終行・最終列を取得する方法

【VBA】最終行・最終列を取得する方法

VBAでエクセルシートの最終行と最終列を取得する方法を紹介します。 実務でよく使用するため、コピペで使用できるようにまとめました。 もくじ【実装コード】最終行を取得ws.Cells(ws.Rows.C ...

パスワード付き/リンク更新で止まる

ファイルによっては、パスワード保護や外部リンク更新の確認で止まることがあります。

必要に応じて、Workbooks.Openの引数(UpdateLinksなど)を調整する、という方向で対応します。

よくある質問(FAQ)

Q. FileDialogが使えないことはありますか?

A. 通常のExcel(Windows環境)なら問題なく使えます。

もしエラーになる場合は、Excelのバージョンや環境差(Mac/制限環境など)の可能性があるので、別案としてGetOpenFilenameを使う方法も検討できます。

Q. キャンセルしたときはどうなりますか?

A. .Showの戻り値で判定できるので、キャンセルならExit Subで安全に終了できます。

Q. シート名だけ取得することは可能ですか?

A. ループ内でws.Nameだけを出力すればOKです。

出力列を減らしてシンプルにできます。

Q. マクロ付き(xlsm)ファイルを開いても大丈夫ですか?

A. 読み取り専用で開き、保存しない前提なら安全です。

ただし環境によっては警告が出る場合があります。

まとめ

今回は、VBAのFileDialogでファイル選択ダイアログを表示し、選んだExcelファイルからシート情報(シート名一覧・枚数・表示状態など)を取得する方法を紹介しました。

ポイントは「読み取り専用で開く」「必ずCloseする」の2つです。

この流れを一度覚えてしまえば、複数ファイルの集計や受領ファイルのチェックなど、いろいろな自動化に応用できます。

-プログラミング
-,