FileSystemObjectオブジェクトを使うと、さまざまなファイル操作が可能になります。FileSystemObjectオブジェクトに関しては「FileSystemObjectオブジェクト」をご覧ください。
また、VBAにはファイルを操作するいくつかのコマンドが標準で用意されていますので、ちょっとした操作ならCreateObjectを使うまでもなく、それら標準のコマンドで済むケースもあります。ここでは、VBAコマンドを使った、次の操作について解説します。
ファイルをコピーするには、FileCopyステートメントを実行します。FileCopyステートメントの構文は次の通りです。
FileCopy source, destination
引数sourceにはコピー元のファイル名を指定します。引数destinationにはコピー先のファイル名を指定します。次のサンプルは、"C:\Work\Sample.txt"を"D:\Tmp"フォルダに"Test.txt"という名前でコピーします。
Sub Sample() FileCopy "C:\Work\Sample.txt", "D:\Tmp\Test.txt" End Sub
コピー先を表す引数destinationには、同じ名前でコピーする場合でもファイル名を指定します。「FileCopy "C:\Work\Sample.txt", "D:\Tmp\"」はエラーになります。
また、コピー元ファイル名に、存在しないパスや、存在しないファイル名を指定するとエラーになります。コピー先フォルダに、引数destinationで指定したのと同じ名前のファイルが存在するときは上書きされます。
VBAに、ファイルを移動するコマンドはありませんが、次のNameステートメントを使うと結果的に移動と同じことになります。
ファイルの名前を設定するには、Nameステートメントを実行します。Nameステートメントの構文は次の通りです。
Name oldpathname As newpathname
引数oldpathnameには、名前を変更する元のファイル名を指定します。引数newpathnameには、新しい名前を指定します。「Name oldpathname , newpathname」ではなく「Name oldpathname As newpathname」のように、元の名前と新しい名前の間に「As」を使うので留意してください。次のサンプルは、"C:\Work\Sample.txt"の名前を"C:\Work\Test.txt"に設定します。
Sub Sample() Name "C:\Work\Sample.txt" As "C:\Work\Test.txt" End Sub
新しい名前を表す引数newpathnameにはパスも指定します。次のサンプルは、"C:\Work\"フォルダの"Sample.txt"を"Test.txt"にリネームするのではなく、"C:\Work\Sample.txt"を現在のカレントフォルダに"Test.txt"という名前で移動します。
Sub Sample() Name "C:\Work\Sample.txt" As "Test.txt" End Sub
Nameステートメントは、ファイルの名前を設定するコマンドです。ひとつのフォルダに同じ名前のファイルは存在できませんので、Nameステートメントを使ってファイルを移動するときも、移動先フォルダに同名ファイルが存在するとエラーになります。
ファイルを削除するには、Killステートメントを実行します。Killステートメントの構文は次の通りです。
Kill pathname
引数pathnameには削除するファイル名を指定します。次のサンプルは、"D:\Tmp\Test.txt"が存在した場合に削除します。
Sub Sample() Kill "D:\Tmp\Test.txt" End Sub
引数pathnameに存在しないパスやファイル名を指定するとエラーになります。なお、削除するファイル名には*または?のワイルドカードを使用できます。Excelや他のアプリケーションで開いているファイルに対してKillステートメントを実行するとエラーになりますので注意してください。また、Killステートメントで削除したファイルは、ごみ箱に保存されません。
ファイルをごみ箱に移動するやり方は、下記のページをご覧ください。
削除するファイルをユーザーに選択してもらうときは、ダイアログボックスを表示すると便利ですが、Application.GetOpenFilenameを使うとタイトルバーに「ファイルを開く」と表示されてしまいます。実はExcelには、選択したファイルを削除するためのダイアログボックスも用意されています。
Sub Sample() Application.Dialogs(xlDialogFileDelete).Show End Sub
カレントドライブやカレントフォルダ(昔はカレントディレクトリと呼びました)は、MS-DOSの時代には知っていて当然の知識でした。OSやアプリケーションには「現在注目している」または「現在作業対象の」ドライブやフォルダという考え方があります。パスを特定せずに「Sample.xls」のようにファイル名を指定すると、このファイルはカレントフォルダに存在するものとして見なされます。小学校の学級をイメージしてください。教室で先生が「田中クン」と呼べば、普通は発言者(先生)が今いる教室内の「田中クン」を指します。隣のクラスの「田中クン」を話題にしたいのなら「3組の田中クン」とパスを指定しなければなりません。あるいは別の学校の生徒である「田中クン」なら「○○小学校6年1組の田中クン」とドライブ(学校)まで特定しなければ通じません。このとき、発言者である先生のいる学校が「カレント学校」であり、立っている教室が「カレント学級」ということです。
カレントドライブとカレントフォルダを調べるには、CurDir関数を使います。CurDir関数の構文は次の通りです。
CurDir [drive]
引数driveは省略できます。CurDir関数は、引数driveで指定したドライブのカレントフォルダを返します。引数driveを省略すると、カレントドライブのカレントフォルダを返します。関数名がCurDirと"ディレクトリ"になっているのは、MS-DOS時代に使っていた呼称のなごりでしょう。なお、カレントドライブを調べるコマンドはありません。引数driveを省略した場合のカレントフォルダには先頭にドライブ名がつきます。それがカレントドライブです。次のコードは、カレントドライブとカレントフォルダを表示します。
Sub Sample() MsgBox "カレントドライブ:" & Left(CurDir, 1) & vbCrLf & _ "カレントフォルダ:" & CurDir End Sub
カレントドライブやカレントフォルダを変更するためのコマンドは、ChDriveステートメントとChDirステートメントが用意されています。ChDriveはカレントドライブを変更し、ChDirはカレントフォルダを変更します。それぞれの構文は次の通りです。
ChDrive drive ChDir path
それぞれ変更したいドライブやパスを指定するのですが、カレントフォルダだけを変更してもカレントドライブは変更されない点に留意してください。
Sub Sample() MsgBox "カレントドライブ:" & Left(CurDir, 1) & vbCrLf & _ "カレントフォルダ:" & CurDir & vbCrLf & _ "Eドライブのカレントフォルダ:" & CurDir("E") ChDir "E:\Tmp" ''Eドライブのカレントフォルダを変更する MsgBox "カレントドライブ:" & Left(CurDir, 1) & vbCrLf & _ "カレントフォルダ:" & CurDir & vbCrLf & _ "Eドライブのカレントフォルダ:" & CurDir("E") End Sub
「ChDir "E:\Tmp"」を実行する前と後で「CurDir」の結果は"C:\Work"と同じです。これは、カレントドライブの方がカレントフォルダより上位だからです。まずどのドライブが注目されているか。それがカレントドライブであり、次にそのドライブでどのフォルダが注目されているか。それがカレントフォルダです。
なお、ChDriveステートメントは、\\マシン名\ドライブ名\フォルダ名 のように、ドライブ文字を割り当てていないネットワークドライブにカレントドライブを移動することはできません。その場合はAPIかWSHを使います。詳しくは、下記のページをご覧ください。
番外編テクニック「ネットワークドライブにChDriveする」
新しいフォルダを作成するにはMkDir関数を使います。既存のフォルダを削除するのがRmDir関数です。"Mk"はMake(作る)の略で、"Rm"はRemove(取り外す)の略です。
MkDir path RmDir path
引数pathには、それぞれ作成したいフォルダや削除したいフォルダのパスを指定します。すでに存在するフォルダと同じ名前のフォルダを作成しようとするとエラーになります。
Sub Sample() MkDir "C:\Work\Sub" MsgBox "フォルダを作成しました" RmDir "C:\Work\Sub" MsgBox "フォルダを削除しました" End Sub
MkDir関数やRmDir関数の引数に「Sub」のようなフォルダ名だけを指定した場合、カレントフォルダが操作の対象になります。カレントフォルダが"E:\Tmp\"だったとき「MkDir "Sub"」で"E:\Tmp\Sub"が作成されます。
RmDir関数でフォルダを削除するとき、その削除対象のフォルダにファイルが存在するとエラーになります。保存されているファイルごとフォルダを削除することはできません。もちろん、存在しないフォルダを削除しようとしてもエラーになります。
ファイルが存在しているときのエラー
存在しないフォルダを削除しようとしたときのエラー
なお、FileSystemObjectを使うと、中のファイルごとフォルダを削除できます。詳しくは、下記のページをご覧ください。
FileSystemObjectオブジェクト - DeleteFolderメソッド
では、これらのコマンドを使ったファイル操作のサンプルを紹介します。ここでは次の操作を行います。
ファイルやフォルダのフルパスを指定する方法と、カレントフォルダを移動しながら操作する方法の2種類をお見せします。
Sub Sample1() ''フルパスを指定する方法 FileCopy "C:\Book1.xls", "C:\Work\Sub\Book1.xls" ''1 MkDir "C:\Work\資料" ''2 Name "C:\Work\Sub\Book1.xls" As "C:\Work\資料\2007年度.xls" ''3 RmDir "C:\Work\Sub" ''4 End Sub Sub Sample2() ''カレントフォルダを指定する方法 ChDrive "C" ''カレントドライブをCにする ChDir "C:\Work" ''カレントフォルダをC:\Workにする FileCopy "C:\Book1.xls", "Sub\Book1.xls" ''1 MkDir "資料" ''2 Name "Sub\Book1.xls" As "資料\2007年度.xls" ''3 RmDir "Sub" ''4 End Sub