1.ファイルの存在を確認する
Dir(pathname)
ブックを開くときはOpenメソッドを使います。開きたいブックの名前を引数に指定すると、当たり前ですが、そのブックが存在いていないとエラーになります。ブックを開くなどファイルを扱うマクロでは、まずファイルの存在を確認することが重要です。ファイルの存在を確認するには、Dir関数を使います。Dir関数の引数にしたファイルが存在すると、Dir関数は「パスを含まないファイル名」を返します。もし存在しない場合は、Dir関数が(“空欄”)を返します。
1 2 3 4 5 6 7 |
Sub sample1() Const TargetFile As String = "C:¥Work¥Book1.xlsx" If Dir(TargetFile) = "" Then MsgBox "存在しません" Else MsgBox " 存在します" End Sub |
2.フルパスからファイル名を抜き出す
Dir(pathname)
ファイルの場所を特定するには、どのふフォルダに存在しているのかというパスを指定します。例えば、C:¥Work¥Book1.xlsxのようになります。この場合、パスがC:¥Workでファイル名が、Book1.xlsxです。プログラミングでファイルを扱う時、ファルの場所を明確にするために、一般的にはパスをフゥンだファイル名で指定することが多くなります。しかし、ときには純粋なファイル名だけが欲しい場合もあります。そんなとき、フルパスの中から¥の位置を探して・・・などと苦労する必要はありません。Dir関数は引数にしてしたファイルが存在するとき、ファイル名だけを返す。
1 2 3 4 5 6 |
Sub sample2() Const TargetFile As String = "C:¥Work¥Book1.xlsx" Dim buf As String buf = Dir(TargetFile) MsgBox TargetFile & "" & vbCrLf & buf End Sub |
3.フルパスからパスを抜き出す
Dir(pathname) Replace(expression, find, replace)
Dir関数がファイル名を返すという特徴を利用すると、フルパスからパス部分を抜き出すのも簡単です。例えばC:Work\Book1.xlsxというファイルは、パスがC:Workでファイル名がBook1.xlsxです。つまり、パスはフルパスからファイル名を除いた部分です。したがってC:\Work\Book1.xlsxを消せば、パスがわかります。任意の文字列を消すには、Replace関数を使います。
1 2 3 4 5 6 |
Sub sample3() Const TargetFile As String = "C:\Work\Book1.xlsx" Dim buf As String buf = Dir(TargetFile) MsgBox TargetFile & "のパス名は" & vbCrLf & Replace(TargetFile, buf, "") End Sub |
4.ファイルをコピーする
FileCopy source destination
VBAには、ファイルやフォルダを操作する命令も用意されています。任意のファイルをコピーするには、FileCopyステートメントを使います。FileCopyステートメントは、引数に「コピー元」と「コピー先」のファイル名をフルパスで指定します。もしコピー先のファイル名にパスを含めないと、それはカレントフォルダのファイルとして認識されます。
1 2 3 4 |
Sub sample4() Const TargetFile As String = "C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsx" FileCopy TargetFile, "C:\Users\Keishiro Tsuchiyama\Downloads\Sub\Sample.xlsx" End Sub |
5.ファイルの名前を変更する
Name oldpathname As newpathname
ファイルの名前を変更するには、Nameステートメントを使います。Nameステートメントの引数には、「元のファイル名」と「新しいファイル名」を指定しますが、両者をカンマで区切るのではなく「元のファイル名 As 新しいファイル名」とAsを使うので注意してください。
1 2 3 |
Sub sample5() Name "C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsx" As "C:\Users\Keishiro Tsuchiyama\Downloads\text.xlsx" End Sub |
6.ファイルのサイズを取得する
FileLen(pathname)
ファイルのサイズはFileLen関数で取得できます。単位はバイト(Byte)です。3桁カンマを付けて表示したいときは、Format関数で加工してください。なお、現在開いているファイルに対してFileLen関数を実行すると、開く前のファイルサイズが返ります。
1 2 3 4 |
Sub sample6() Const TargetFile As String = "C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsm" MsgBox Format(FileLen(TargetFile), "#,###") & " Byte" End Sub |
7.ファイルのタイムスタンプを取得する
FileDateTime(pahname)
ファイルが更新されたタイムスタンプ(最後に修正した日)を取得するには、FileDateTime関数を使います。FileDateTime関数は、ファイルが更新された日付と時刻を返します。
1 2 3 4 |
Sub sample7() Const TargetFile As String = "C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsm" MsgBox FileDateTime(TargetFile) End Sub |
日付だけ、あるいは時刻だけを取得したいときは、FileDateTime関数の返り値をFormat関数などで加工してください。
8.ファイルを削除する
kill pathname
VBAにはふぁいるを削除する命令も用意されています。それはKillステートメントです。Kill捨てt-とメントを実行すると、引数で指定したファイルが、確認なしに削除されます。なお、Killステートメントは、ファイルをゴミ箱に移動するのではなく、ディスクから削除する命令です。Killステートメントを実行した後でゴミ箱から復活させることはできないので注意してください。
1 2 3 4 5 6 |
Sub sample8() Const TargetFile As String = "C:\work\sub\Text.xlsx" If Dir(TargetFile) <> "" Then Kill TargetFile End If End Sub |
Killステートメントは引数で指定したファイルが存在しないとエラーになります。削除する前には、念のためファイルの存在を確認しておきましょう。
9.ファイルの削除ダイアログボックスでファイルを削除する
object.Dialogs(xlDialogFileDelete).Show
Killステートメントで削除するファイル名は、あらかじめコードの中に記述しておかなければなりません。そうではなく、ユーザーが指定したファイルを削除するのであればファイルの削除ダイアログボックスを表示する方法もあります。Excelではほとんど見かけませんが、実はファイルの削除ダイアログボックスも内部に用意されています。そうしたExelオブジェクトのDialogsプロパティを使って、Dialogsコレクションを呼び出します。ファイルの削除ダイアログボックスを呼び出すための定数は、xlDialogFileDeleteです。
1 2 3 |
Sub sample9() Application.Dialogs(xlDialogFileDelete).Show End Sub |
10.ファイルの属性を調べる
GeAttr(pathname)
ファイルには読み取り専用や隠しファイルなどの属性があります。こうした属性はWindowsが管理しているのですが、VBAから属性を調べることができます。それがGetAttr関数です。GetAttr関数はファイルの属性を数値で返します。
属性を表す数値には定数が割り当てられているので、サンプルのようにAnd演算子を使って比較できます。
1 2 3 4 5 6 7 8 |
Sub sample10() Const TargetFile As String = "C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsm" If GetAttr(TargetFile) And vbReadOnly Then MsgBox "読み取り専用です" Else MsgBox "読み取り専用ではありません" End If End Sub |
11.ファイルの属性を設定する
SetAttr pathname, vbNormal
VBAには、ファイルの属性を調べるGetAttr関数だけでなく、ファイルの属性を設定するSetAttrステートメントも用意されています。CD-ROMやDVDなどからハードディスクにコピーしたファイルは自動的に読み取り専用の属性が設定される場合があります。そうした読み取り専用のファイルをExcelで開き、上書き保存を使用とするとエラーになります。そんなときは、事前にファイルの属性を調べて、設定しなおしておくと便利です。
12.フォルダを作成する
MkDir path
VBAでフォルダを作成するときは、MkDirステートメントを使います。MkDirはMake Directoryの略称です。サンプルでは、C:\Workフォルダに2010というサブフォルダ存在しなかった時、2010フォルダを作成します。フォルダの存在確認にはDir関数を使っています。
1 2 3 4 5 |
Sub sample112() If Dir("C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsm", vbDirectory) = "" Then MkDir "C:\Work\2010" End If End Sub |
13.フォルダを削除する
RmDir path
VBAではフォルダを削除することもできます。そのための命令がRmDirステートメントです。RmDirはRemove Directoryの略称です。存在しないフォルダを削除しようとするとエラーになるので、削除する前にDir関数で存在を確認しています。
1 2 3 4 5 |
Sub sample13() If Dir("C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsm", vbDirectory) = "" Then RmDir "C:\Work\2010" End If End Sub |
14.フォルダの名前を変更する
Name oldpath As newpath
ファイルの名前を変更するのは、Nameステートメントでした。同じNameステートメントを使って、フォルダの名前を設定することもできます。
1 2 3 |
Sub sample14() Name "C:\Users\Keishiro Tsuchiyama\Downloads\請求書_完成 (1).xlsm" As "C:\Work\2010" End Sub |
15.フォルダを移動する
Name oldpath As newpath
VBAには、ファイルをコピーするFileCopyステートメントはありますが、ファイルを移動するFileMoveステートメントのような命令はありません。ではファイルを移動するときはどうするかというと、Nameステートメントを使って、ファイルが存在しているパスを変更します。
1 2 3 |
Sub sample15() Name "C:\Work\2010" As "C:\Work\Sub\2010" End Sub |
16.フォルダ内のファイル一覧を取得する1
Dir関数は、引数に指定したファイルの存在を調べる関数です。ファイルが存在するときは、そのファイル名を返します。またDir関数の引数には、*.xls?のようなワイルドカードを指定することができます。ワイルドカードを指定した場合、最初に見つかったファイルの名前が返ります。さらにDir関数には便利な特徴があります。引数を省略して実行すると直前に指定した引数が指定されたものとみなされ、さらに一度見つかったファイルは除外するという特徴もあります。つまり最初にDir関数で*.xls?を探し、その後で引数を省略したDir()を実行すれば、次々とフォルダ内のファイルを探しだすことができるのです。全てのファイルを返すと、Dir関数は空欄””を返します。
17.テキストファイルの行数を調べる
例えばCSVファイルをワークシートに読み込むとき、読み込む前にデータの行数を知りたいときがあります。言うまでもありませんが、ワークシートの行数より大きなデータは読み込めないからです。CSV形式などのテキストファイルは、FileSystemObjectを使うと行数が簡単に分かります。FileSystemObjectのOpenTextFileメソッドでテキストファイルを追記モードでひらくと、書き込みポイントがファイルの最終行にセットされます。実際に書き込まなくてもその行位置がファイルの行数だと分かります。
18.ファイルの種類を調べる
Windowsのファイルシステムは拡張子によって種類が分かれています。例えば、拡張子bmpはビットマップ形式の画像ファイル、拡張子xlsxはExcelのデータファイルでExcel2007形式のマクロなしブックです。そうしたファイルの種類を簡単に調べるには、FileSystemObjectが便利です。FileSystemObjectのFileオブジェクトにはTypeプロパティがあります。Typeプロパティは、その名の通りファイルのタイプを表すプロパティですが、うれしいことにファイルの形式を文字列で教えてくれます。
19.フォルダ内のファイル一覧を取得する2
あるフォルダに存在するファイルの一覧を取得するには、いろいろな方法があります。ここでは、FileSystemObjectを使ってみましょう。FileSystemObjectでフォルダを特定するには、GetFolderメソッドを使います。特定したフォルダに存在するファイル群はFilesコレクションで表せます。サンプルでは、ファイルの形式がExcelに関連しているものだけをワークシートに代入しています。
20.サブフォルダの一覧を取得する
FileSystemObjectを使うと、サブフォルダの一覧を取得するのも簡単です。FileSystemObjectのFolderオブジェクトには、SubFoldersプロパティがあります。SubFoldersプロパティはそのフォルダに存在するサブフォルダのコレクションです。ForEachステートメントを使って取り出せば、サブフォルダの一覧が手軽に取得できます。
21.テキストファイルに書き込む
テキストファイルに文字列を書き込むには、対象のファイルをOutPutモードで開き、Printステートメントで書き込みます。Printステートメントは、末尾に開業を追加して書き込みます。OutPutモードはファイルを上書きします。既存のデータは消えて、書き込んだデータだけが保存されます。
22.テキストファイルに追記する
テキストファイルに文字列を追記するには、対象のファイルをAppendモードで開き、Printステートメントで書き込みます。Printステートメントは、末尾に改行を追加して書き込みます。Appendモードで開いたファイルはPrintステートメントで書き込むデータが、ファイルの末尾に書き込まれます。
23.テキストファイルを読み込む1
テキストファイルを読み込むには、まず対象のファイルをInput(読み込み)モードで開きます。テキストファイルから1行ずつ読み込むには、Line Inputステートメントを使います。Line Inputステートメントは1行分(改行までのデータ)を読み込んで、指定した変数に格納します。Range(“A1”)= Line Input #1のように、読み込んだデータを直接代入することはできません。ファイルの終端まで読み込んだかどうかは、EOF関数で判定します。EOF関数は、ファイルの読み取りポイントが終端に達するとTrueを返します。サンプルは、テキストファイルを読みこんでワークシートに展開する、とてもポピュラーな方法です。
24.テキストファイルを読み込む2
テキストファイルの全データを一気に読むこともできます。対象のファイルをVinaryモードで開きます。Binaryモードは、バイナリデータを操作するためのモードです。全データを格納するための変数(ここではbuf)をこれから読み込む全データの大きさにしておきます。ここでは、FileLen関数でファイルサイズを取得し、その数だけのスペースをSpace関数で代入しています。Getステートメントは指定した変数のサイズに見合う大きさのデータをファイルから一気に取得します。サンプルは、取得したテキストファイルのデータをセルA1に代入しています。テキストファイルに複数行の文字列が保存されていた場合、改行で区切られてそれぞれのセルに代入されるのではなく、全てのデータがセル内改行されてセルA1に代入されます。
25.テキストファイルを読み込む3
Binaryモードで開いたファイルから、Getステートメントで全データを読み込んだ場合、それをセルに代入すると一つのセルに全てのデータが代入されてしまいます。そうではなく、改行で区切られた各行を、ワークシート上の行ごとに代入したい場合は、取得したテキストデータをSplit関数で改行コードごとに分割します。Split関数は分割した結果を配列形式で返します。配列の大きさはUBound関数で取得します。
26.CSVデータをワークシートに読み込む1
CSV形式のデータは、Excelにブックとして読み込むのではなく、テキストファイルとして操作します。サンプルはCSVデータを読み込む最もオーソドックスな方法です。CSVファイルをInput(読み込み)モードで開き、Line Inputステートメントで1行ずつ読み込みます。読み込んだ1行分のデータをSplit関数を使って、カンマで区切ります。DO LoopステートメントとEOF関数でファイルの終端まで全てのデータを読み込み、それぞれのデータをセルに代入します。
27.CSVデータをワークシートに読み込む2
CSV形式のファイルは、ブックとして開くのではなく、テキストファイルとして開いて、データを読み込みます。テキストファイルとして開けば、Excelのお節介な機能によって、勝手に日付の表示形式が設定されたり、数値の前の0が除去されるのを防ぐことが可能です。サンプルではA列の名前からスペースを取り除き、B列の日付に表示形式を設定し、C列の数値から0が除去されないよう文字列の表示形式を設定しています。
28.カレントフォルダを調べる
カレントフォルダとは、Excelが現在注目しているフォルダです。例えばファイルを開くダイアログボックスなどを開いたときに表示されるフォルダがカレントフォルダです。カレントフォルダはCurDir関数で調べられる。
1 2 3 |
Sub sample28() MsgBox "カレントドライブ:" & Left(CurDir, 1) & vbCrLf & "カレントフォルダ:" & CurDir End Sub |
29.カレントフォルダを移動する
ChDrive drive ChDir path
Excelでブックを開いたり、ブックに名前を付けて保存したりすると、カレントフォルダは自動的に変更されます。そうした操作をしないで、カレントフォルダを変更するには、ChDirステートメントやChDriveステートメントを使います。
1 2 3 4 5 |
Sub sample29() ChDrive "E" ChDir "E:\Work" MsgBox "カレントドライブ:" & Left(CurDir, 1) & vbCrLf & "カレントフォルダ:" & CurDir End Sub |
30.ネットワークドライブに移動する
カレントドライブを変更するChDriveステートメントは、ドライブ文字を割り当てていないネットワークドライブに移動することはできません。そんなときは、WindowsScriptingHost(WSH)を利用します。
1 2 3 4 5 6 |
Sub sample30() With CreateObject("WScript.Shell") .CurrentDirectory = "\\PC-2\D\Work" End With MsgBox CurDir End Sub |
31.拡張子を取得する1
ファイルの拡張子を取得するにはどうしたらいいでしょう。単純にファイル名の右3文字と判断してはいけません。Office2007からは、ブックや文書の拡張子がxlsx docxなど4文字に変わりましたし、ホームページで使うファイルにもhtml jpegなどがあります。拡張子は、.から後ろですから、.の位置を調べて、その右を抜き出してみましょう。その際、ファイル名のひだりから調べてはいけません。ABC.DEF.xlsxのようにファイル名に.が含まれることもある。
32.拡張子を取得する2
FileSystemObjectオブジェクトには、拡張子を返す命令があります。FileSystemObjectオブジェクトのGetExtensionNameメソッドです。引数には、拡張子を取得するファイルのフルパスを指定します。実際に存在しないファイルでも拡張子を取得できます。
33.特殊フォルダを取得する
ブックをデスクトップやマイドキュメントフォルダに保存したいときはどうしたらいいでしょう。デスクトップフォルダのパスはC:\Users\<ログインユーザー名>\Desktop\となるので、PCの環境やログインしているユーザー名によってフォルダの位置は異なります。そんあときは、Windows Scripiting Host(WSH)を使います。WSHのSpexialFoldersプロパティでは、つぎのようなフォルダを取得できます。
34.隠し属性ファイルを削除する
VBAにはファイルを削除するKillステートメントがありますが、Killステートメントは隠し属性が設定されているファイルを削除できません。隠し属性のファイルを削除するときは、FileSystemObject(FSO)を使います。DeleteFileメソッドは、Killステートメントと同じようにファイルを削除しますが、隠し属性のファイルも削除できます。
35.ゴミ箱へ削除する
VBAのkillステートメントもFileSystemObjectのDeleteFileメソッドもどちらも削除されたファイルは、ゴミ箱に移動しないで、完全に削除されます。そうではなく、ゴミ箱に削除(移動)したいのであれば、Windows APIを使います。
コメントを残す