こんにちは、小栁です。
今回は、ExcelVBAを使って外部ファイルを操作する方法を紹介します。
ここでいう「外部ファイルを操作する」
というのは、
Aというファイルから間接的にBというファイルに対して変更を加えたり、Bというファイルの機能を実行したりすることを意味します。
VBAを使えば操作したいファイルを直接触らなくてもやりたいことができるようになります。
当記事に掲載しているサンプルコードはマクロを実行するxlsmファイルの標準モジュール(module1)に記述してください。
このような画面です。
新規ファイルを作成する
用意するファイル
└test.xlsm
「test.xlsm」のマクロを使って新たに「target.xlsx」というファイルを作成します。
test.xlsm
1 2 3 4 5 6 7 8 9 10 11 12 |
Dim FileName As String Dim FilePath As String Dim newBook As Workbook '新しいファイルの名前 FileName = "target.xlsx" '新しいファイルのフルパス FilePath = ThisWorkbook.Path & "\" & FileName '新しいファイルを作成する Set newBook = Workbooks.Add '新しいファイルを保存する newBook.SaveAs FilePath |
プログラム実行後のファイル
(新しく「target.xlsx」ファイルが追加されます)
├test.xlsm
└target.xlsx
外部ファイルを削除する
用意するファイル
├test.xlsm
└target.xlsx
「test.xlsm」のマクロを使って「target.xlsx」ファイルを削除します。
test.xlsm
1 2 3 4 5 6 7 8 9 |
Dim FileName As String Dim FilePath As String '削除するファイルの名前 FileName = "target.xlsx" '削除するファイルのフルパス FilePath = ThisWorkbook.Path & "\" & FileName 'ファイルを削除する Kill FilePath |
プログラム実行後のファイル
(「target.xlsx」ファイルが削除されます)
└test.xlsm
外部ファイルのファイル名を変更する
用意するファイル
├test.xlsm
└target.xlsx
「test.xlsm」のマクロを使って「target.xlsx」のファイル名を「changed.xlsx」に変更します。
test.xlsm
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim OldName As String, NewName As String Dim OldFilePath As String, NewFilePath As String '元のファイルの名前 OldName = "target.xlsx" '新しいファイルの名前 NewName = "changed.xlsx" '元のファイルのパス OldFilePath = ThisWorkbook.Path & "\" & OldName '新しいファイルのパス NewFilePath = ThisWorkbook.Path & "\" & NewName 'ファイル名を変更 Name OldFilePath As NewFilePath |
プログラム実行後のファイル
(「target.xlsx」ファイルの名前が「changed.xlsx」ファイルに変更されます)
├test.xlsm
└changed.xlsx
外部ファイルの拡張子を変更する
.xls→.xlsx
※「.xls」という拡張子は2003年以前のExcelのファイル形式です。
用意するファイル
├test.xlsm
└target.xls
※下のサンプルコードを使う場合、このとおりのファイル構成でないとエラーになります。
「test.xlsm」のマクロを使って「target.xls」の拡張子を「target.xlsx」に変更します。
test.xlsm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Dim OldName As String Dim FilePath As String 'ファイルの名前 OldName = "target.xls" no_xls = Replace(OldName, ".xls", "") 'ファイルを開く Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & OldName) '拡張子を変更する際のアラートを無効にする Application.DisplayAlerts = False 'xlsファイルをxlsxとして保存 wb.SaveAs FileName:=ThisWorkbook.Path & "\" & no_xls & ".xlsx", FileFormat:=xlOpenXMLWorkbook Application.DisplayAlerts = True wb.Close 'xlsファイルを削除 Kill ThisWorkbook.Path & "\" & OldName |
プログラム実行後のファイル
(「target.xls」ファイルの拡張子が「.xlsx」に変更されます)
├test.xlsm
└target.xlsx
外部のExcelファイルを開く
用意するファイル
├test.xlsm
└target.xlsx
「test.xlsm」のマクロから「target.xlsx」を開きます。
test.xlsm
1 2 3 4 5 6 7 8 9 |
Dim FileName As String Dim FilePath As String 'ファイルの名前 FileName = "target.xlsx" 'ファイルのフルパス FilePath = ThisWorkbook.Path & "\" & FileName 'ファイルを開く Workbooks.Open FilePath |
外部のExcelファイルのマクロを実行する
用意するファイル
├test.xlsm
└target.xlsm
「test.xlsm」のマクロから「target.xlsm」の「target_macro」プロシージャを実行します。
test.xlsm
1 2 3 4 5 6 7 8 9 10 11 12 |
Dim FileName As String Dim MacroName As String Dim FilePath As String 'ファイルの名前 FileName = "target.xlsm" '実行するマクロの名前 MacroName = "target_macro" 'ファイルのフルパス FilePath = ThisWorkbook.Path & "\" & FileName '指定のファイルのマクロを実行する Application.Run("'" & FilePath & "'!" & MacroName) |
target.xlsm
1 2 3 |
Sub target_macro() MsgBox "Hello" End Sub |
このようにメッセージボックスが表示されたら成功です。
最後に
今回紹介した方法を応用すれば、フォルダ内にある大量のファイルの名前を一度に変更したり、複数のファイルにあるマクロをメインのファイルからまとめて実行したりすることができます。ぜひいろいろな処理を試してみてください。
Excel/ExcelVBAでのお困りごとなどありましたらお気軽にご相談ください。