【EXCEL VBA】ユーザーフォームを利用した①ファイルを開いて、②指定したシートを自分自身にコピーさせる処理の自動化のサンプル

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

Excel VBAでユーザーフォーム(UserForm)を利用して、①ダイアログからファイルを選択して開き、②リストボックスに表示されたシート名一覧から指定したシートを選んで、③自分自身のワークブックへコピーする処理の自動化サンプルコードと手順を解説します。

この記事でできること

ボタン一つ、またはマクロの実行によってファイル選択ダイアログが立ち上がり、選択したExcelファイルのワークシート名を自動でユーザーフォームのリストボックスに一覧表示します。リストから任意のシート名をクリックして選択すると、その内容が自分自身のブックに「コピー先シート」という名前で取り込まれます。

想定環境・前提条件

  • Microsoft Excel 2010以降(Microsoft 365 / Excel 2021等対応)
  • VBE(Visual Basic Editor)の基本操作ができること
  • マクロ有効ブック(.xlsm)形式で保存すること

実装手順

  1. Excelを開き、Alt + F11 キーを押してVBE画面を開きます。
  2. メニューの「挿入」から「ユーザーフォーム」を選択し、UserForm1 を作成します。
  3. ツールボックスからユーザーフォーム上に ListBox(リストボックス)を1つ配置します(名前は ListBox1 のままで動作します)。
  4. UserForm1 のコードウインドウを開き、後述のユーザーフォーム用コードを貼り付けます。
  5. メニューの「挿入」から「標準モジュール」を追加し、後述の標準モジュール用コードを貼り付けます。

サンプルコード

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

使い方と実行手順

  1. 標準モジュール内の test1 マクロを実行します(またはフォーム上のボタン等に割り当てます)。
  2. ファイル選択ダイアログが表示されるので、コピー元となるExcelファイル(.xlsx / .xls / .xlsm)を選択します。
  3. ユーザーフォームが起動し、選択したファイルに含まれるワークシート名がリストボックスに一覧表示されます。
  4. 取り込みたいシート名をクリックすると、自動的にそのシートの全セルデータが実行中のブックの「コピー先シート」へ複製されます。

注意事項・トラブルシューティング

  • ファイル選択のキャンセル: ダイアログで「キャンセル」を押した場合、プログラム側で自動的にフォームがアンロードされるよう安全処理を追加しています。
  • 同名シートの上書き: 実行中のブックにすでに「コピー先シート」が存在する場合、確認なしで上書き削除されるため注意してください。
  • マクロの保存: コードを追加した後は、必ずマクロ有効ブック(.xlsm)形式で保存してください。

この記事の更新履歴

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

2026年9月12日

  • 変更blockquoteタグによるコード表示を適切なコードブロック(HTML/pre/code形式)へ変更しました。
  • 追加ユーザーフォームの準備手順、前提条件、標準モジュールからの呼び出し方法を解説する説明文を追加しました。
  • 変更VBAコード内の未完成だったエラーハンドリング部分を整理し、ファイルキャンセル時の処理を正しく修正しました。

文書情報

記事タイトル
【EXCEL VBA】ユーザーフォームを利用した①ファイルを開いて、②指定したシートを自分自身にコピーさせる処理の自動化のサンプル
作成日
更新日
Source URL
https://papanda925.com/?p=484

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

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