Excel VBAでユーザーフォーム(UserForm)を利用して、①ダイアログからファイルを選択して開き、②リストボックスに表示されたシート名一覧から指定したシートを選んで、③自分自身のワークブックへコピーする処理の自動化サンプルコードと手順を解説します。
この記事でできること
ボタン一つ、またはマクロの実行によってファイル選択ダイアログが立ち上がり、選択したExcelファイルのワークシート名を自動でユーザーフォームのリストボックスに一覧表示します。リストから任意のシート名をクリックして選択すると、その内容が自分自身のブックに「コピー先シート」という名前で取り込まれます。
想定環境・前提条件
- Microsoft Excel 2010以降(Microsoft 365 / Excel 2021等対応)
- VBE(Visual Basic Editor)の基本操作ができること
- マクロ有効ブック(.xlsm)形式で保存すること
実装手順
- Excelを開き、
Alt + F11キーを押してVBE画面を開きます。 - メニューの「挿入」から「ユーザーフォーム」を選択し、
UserForm1を作成します。 - ツールボックスからユーザーフォーム上に
ListBox(リストボックス)を1つ配置します(名前はListBox1のままで動作します)。 UserForm1のコードウインドウを開き、後述のユーザーフォーム用コードを貼り付けます。- メニューの「挿入」から「標準モジュール」を追加し、後述の標準モジュール用コードを貼り付けます。
サンプルコード
1. ユーザーフォーム側(UserForm1)
Private m_OpenFileName As String
Private m_OpenWorkBook As Workbook
Private m_OpenWorksheet As Worksheet
Private Const COPY_SHEET As String = "コピー先シート"
' ①ファイルを開いて、②指定したシートを自分自身にコピーさせる処理
Private Sub ListBox1_Click()
Dim TmpWrokSheet As Worksheet
Dim ws As Worksheet
If ListBox1.ListIndex = -1 Then Exit Sub
On Error GoTo EXCEPTION
Application.DisplayAlerts = False
' 選択されたファイルを再度開いて対象シートを取得
Set m_OpenWorkBook = Workbooks.Open(m_OpenFileName)
Set m_OpenWorksheet = m_OpenWorkBook.Worksheets(ListBox1.Text)
' 自分自身のブックに同名シートがあれば削除して新規追加
For Each ws In ThisWorkbook.Worksheets
If ws.Name = COPY_SHEET Then ws.Delete
Next ws
Set TmpWrokSheet = ThisWorkbook.Worksheets.Add
TmpWrokSheet.Name = COPY_SHEET
' セル内容をコピー
m_OpenWorksheet.Cells.Copy TmpWrokSheet.Cells
GoTo FINALLY
EXCEPTION:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
FINALLY:
If Not m_OpenWorkBook Is Nothing Then
m_OpenWorkBook.Close SaveChanges:=False
Set m_OpenWorkBook = Nothing
End If
Application.DisplayAlerts = True
Me.Hide
End Sub
' フォーム初期化時にファイルを開き、シート名一覧を取得する
Private Sub UserForm_Initialize()
Dim ws As Worksheet
On Error GoTo EXCEPTION
m_OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If m_OpenFileName = "False" Then
Unload Me
Exit Sub
End If
Set m_OpenWorkBook = Workbooks.Open(m_OpenFileName)
ListBox1.Clear
For Each ws In m_OpenWorkBook.Worksheets
ListBox1.AddItem ws.Name
Next ws
GoTo FINALLY
EXCEPTION:
MsgBox "ファイルの読み込みに失敗しました。", vbCritical
If Not m_OpenWorkBook Is Nothing Then
m_OpenWorkBook.Close SaveChanges:=False
Set m_OpenWorkBook = Nothing
End If
Unload Me
FINALLY:
' 初期化時は読み取り専用で開いたブックを一旦閉じておく
If Not m_OpenWorkBook Is Nothing Then
m_OpenWorkBook.Close SaveChanges:=False
Set m_OpenWorkBook = Nothing
End If
End Sub
2. 標準モジュール側
Sub test1()
UserForm1.Show
End Sub
使い方と実行手順
- 標準モジュール内の
test1マクロを実行します(またはフォーム上のボタン等に割り当てます)。 - ファイル選択ダイアログが表示されるので、コピー元となるExcelファイル(.xlsx / .xls / .xlsm)を選択します。
- ユーザーフォームが起動し、選択したファイルに含まれるワークシート名がリストボックスに一覧表示されます。
- 取り込みたいシート名をクリックすると、自動的にそのシートの全セルデータが実行中のブックの「コピー先シート」へ複製されます。
注意事項・トラブルシューティング
- ファイル選択のキャンセル: ダイアログで「キャンセル」を押した場合、プログラム側で自動的にフォームがアンロードされるよう安全処理を追加しています。
- 同名シートの上書き: 実行中のブックにすでに「コピー先シート」が存在する場合、確認なしで上書き削除されるため注意してください。
- マクロの保存: コードを追加した後は、必ずマクロ有効ブック(.xlsm)形式で保存してください。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月12日
- 変更blockquoteタグによるコード表示を適切なコードブロック(HTML/pre/code形式)へ変更しました。
- 追加ユーザーフォームの準備手順、前提条件、標準モジュールからの呼び出し方法を解説する説明文を追加しました。
- 変更VBAコード内の未完成だったエラーハンドリング部分を整理し、ファイルキャンセル時の処理を正しく修正しました。
