今回は、よく使うファイル操作のコードをまとめました。コードをコピペしながら使ってみて下さい。
また、ファイル操作のエラー対策ですが、記事が長くなったので次にまとめます。
パスとファイル名の取得
まずは、ファイル操作で必ず使う「ファイルのパス」と「ファイル名」の取得方法について見ていきましょう。
パスについて
パスとは、ファイルが置いてある場所のことをいいます。
例えば以下のように、Cドライブの直下に「VBA」という名前のフォルダを作成し、そのフォルダ内に「test.xlsx」というファイルがあるとします。
*「.xlsx」等の拡張子が表示されていない場合は、表示するように設定しましょう。
この場合、”C:\VBA\test.xlsx” がパスになります。
ただし、ファイル名までを含む”C:\VBA\test.xlsx”をパスと呼ぶこともあれば、ファイル名を含まない”C:\VBA\”をパスと呼ぶこともあります。
この記事では、後者のファイル名を含まないものをパスと呼びます。
パスの取得
以下のコードで、マクロファイルのパスを文字列として取得できます。マクロファイルのパスを基準として、他のファイルのパスを書くことが多いです。
Dim filePath As String 'マクロファイルのパス
filePath = ThisWorkbook.Path
パス+ファイル名の取得
以下のコードで、マクロファイルの「パス+ファイル名」までを含む文字列を取得できます。
Dim fullName As String 'マクロファイルのパス+マクロのファイル名
fullName = ThisWorkbook.fullName
ファイル名の取得
マクロファイルに限らず、目的のファイルのパス+ファイル名を変数 fullNameに代入した時、以下のコードでファイル名のみを取得できます。
Dim fullName As String '取得するファイルのパス+ファイル名
fullName = "C:\VBA\test.xlsx"
Dim fileName As String 'fullName(ファイルのパス+ファイル名)からファイル名の取得
fileName = Mid(fullName, InStrRev(fullName, "\") + 1)
また、ファイルが存在する時に、Dirという関数を使ってファイル名が取得できます。ファイルが無い場合、空白(“”)が返ってきます。以下のコードでは、マクロファイルのファイル名を取得しています。
Dim fileName As String 'fullName(ファイルのパス+ファイル名)からファイル名の取得
fileName = Dir(ThisWorkbook.fullName)
ファイルを開く
「パス+ファイル名」を渡すと、ファイルを開くことができます。例えば、Cドライブ直下にあるVBAフォルダ内のtest.xlsxファイルを開く場合、以下のようになります。
Workbooks.Open "C:\VBA\test.xlsx" 'ファイルのパス+ファイル名を渡してファイルを開く
マクロファイルと同じパス上に test.xlsxというファイルがある場合、変数を使って以下のようにファイルを開くことができます。
Dim filePath As String 'マクロファイルのパス
filePath = ThisWorkbook.Path
Dim OpenFileName As String '開くファイル名
OpenFileName = "test.xlsx" '←任意のファイル名を記述
Workbooks.Open filePath & "/" & OpenFileName 'ファイルのパス+ファイル名を渡してファイルを開く
読み取り専用で開くこともできます。
Workbooks.Open fileName:=filePath & "/" & OpenFileName, ReadOnly:=True
Workbookss.openについては以下のリンク参照。
ファイルを保存する
ファイル名を記述し、ファイルを保存します。
Workbooks("test.xlsx").Save
新規ファイルを作成・名前を付けて保存
新規ファイルを作成する場合、「パス+ファイル名」を渡して「ファイル作成」→「名前をつけて保存」という過程を踏みます。また、同名のファイルが既に開かれているとエラーになります。
Workbooks.Add.SaveAs "C:\VBA\test.xlsx" '新規ブックを作成して名前を付けて保存
オブジェクト変数を使って以下のようにも書けます。
Dim NewBook As Workbook 'ワークシートのオブジェクト変数を宣言
Set NewBook = Workbooks.Add '新規ファイルを作成
NewBook.SaveAs "C:\VBA\test.xlsx" '名前を付けて保存
ファイルを閉じる・上書き保存して閉じる
ファイル名を記述し、ファイルを閉じます。
Workbooks("test.xlsx").Close 'ファイルを閉じる
ファイルを上書き保存して閉じます。
Workbooks("test.xlsx").Close SaveChanges:=True 'ファイルを保存して閉じる
オブジェクト変数を使って新規ファイルを作成→名前を付けて保存→ファイルを閉じます。
Dim NewBook As Workbook 'ワークシートのオブジェクト変数を宣言
Set NewBook = Workbooks.Add '新規ファイルを作成
NewBook.SaveAs "C:\VBA\test.xlsx" '名前を付けて保存
NewBook.Close '新規ファイルを閉じる
ファイルを削除
「パス+ファイル名」を渡すと、ファイルを削除できます。
Kill "C:\VBA\test.xlsx"
ユーザーにファイルを選択させて開く
Application.GetOpenFilenameメソッドを使うとユーザーにファイルを選択してもらい、そのファイルのパス+ファイル名が取得できます。キャンセルすると、文字列「False」を返します。
以下のようにファイルを開くコードと組み合わせることで、ユーザーにファイルを選択させて開くことができます。
Dim openFullName As String 'ユーザーが選ぶファイルのパス+ファイル名
openFullName = Application.GetOpenFilename("MicroSoft Excelブック, *.xlsx, マクロ, *.xlsm, CSV, *.csv,*.xls,ブック")
If openFullName = "False" Then '選択がキャンセルされた場合
MsgBox "キャンセルされました"
Else 'ファイルが選択された場合
Workbooks.Open openFullName 'ファイルを開く
End If
また、カッコ内の(“MicroSoft Excelブック, *.xlsx, マクロ, *.xlsm, CSV, *.csv”)を
(“MicroSoft Excelブック, *.xlsx, マクロ, *.xlsm, CSV, .csv,.xls,ブック”)と変更すると、ダイアログボックスに表示されるファイルの拡張子を増やすこともできます。
また、ダイアログボックスに表示されるフォルダのパスは変更できます。例えば、マクロファイルのパスに変更する際は以下のようになります。
Dim filePath As String 'ダイアログボックスに表示するパス
filePath = ThisWorkbook.Path
ChDir filePath
ChDirについては以下のリンクを参照。
ユーザーにファイルを選択させて削除
Application.GetOpenFilenameメソッドでファイルのパス+ファイル名が取得できるので、ファイルを開くだけではなく、以下のようにユーザーにファイルを選択させて削除することもできます。
Dim killFullName As String 'ユーザーが選ぶファイルのパス+ファイル名
killFullName = Application.GetOpenFilename("MicroSoft Excelブック, *.xlsx, マクロ, *.xlsm, CSV, *.csv,*.xls,ブック")
If killFullName = "False" Then '選択がキャンセルされた場合
MsgBox "キャンセルされました"
Else 'ファイルが選択された場合
Kill killFullName 'ファイルを開く
End If
ファイルのコピペ
開いているファイル(以下の例ではマクロファイル)をコピーし、ファイルのパス+ファイル名を記述すると、そのパスの先に任意の名前をつけて保存できます。
Workbooks("Book1.xlsm").SaveCopyAs ("C:\VBA\Book2.xlsm")
以下のコードでは、開いていないファイルをコピペします。ただし、ファイル元が開かれているとエラーになります。
FileCopy "C:\VBA\Book2.xlsm", "C:\VBA\Book3.xlsm"
「FileSystemObject」というオブジェクトを使うことで、既に開いてあるファイルをコピーできるようになります。おまじないと思って使ってみましょう。ちなみにsrcはsource、dstはdestinationを意味します。
Dim fso As Object 'FileSystemObjectというおまじない
Set fso = CreateObject("Scripting.FileSystemObject")
Dim srcFile As String 'コピー元のファイルのパス+ファイル名
srcFile = ThisWorkbook.Path & "\test.xlsx"
Dim dstFile As String 'コピー先のファイルのパス+ファイル名
dstFile = ThisWorkbook.Path & "\test2.xlsx"
fso.CopyFile srcFile, dstFile 'ファイルをコピペ
シートのコピペ
アクティブなシートの左から1番目シートをコピーし、左から2番目の位置に挿入します。
Beforeの他にAfterというパラメータもあります。詳しくは以下のリンクを参照。
Worksheets(1).Copy Before:=Worksheets(2)
シートをコピーし、開いている別ファイルにシートを貼り付けすることもできます。また、シート名も変更しています。
Dim fileName As String 'シートのコピー先のファイル名
fileName = "test.xlsx"
ThisWorkbook.Worksheets(1).Copy Before:=Workbooks(fileName).Sheets(1) 'マクロファイルのシート1をコピーしてfileNameのシート1の前の位置に挿入
Workbooks(fileName).Sheets(1).Name = "hoge" 'シート名をhogeに変更する
最後に
ファイル操作はよく使いますが、コードの書き方をよく忘れてしまいます。
全ての操作を覚える必要はないので、VBAで何ができるかを覚えておき、忘れたらまた調べるといった流れでコードを書いていきましょう。
