【VBA基礎⑧】ファイル操作とAPI
VBAにはファイルを操作する命令があります。ファイルやフォルダを整理する作業は実務においてもたびたび行われます。しかし、VBAのファイル操作にはWindowsのシステムの知識が必要なため、初心者には理解が難しい部分もあります。今回はVBAを用いたファイル操作の基礎と一部WindowsAPIの機能についてなるべく分かりやすく紹介します。
この記事はVBAの基礎シリーズです。他の記事は以下のリンクからご覧いただけます!
目次
テキストファイルの操作
まずはVBAでテキストファイルを操作する方法を解説します。
テキストファイルを開く
テキストファイルを操作するには、まずファイルを「開く」操作が必要です。ここで、「開く」とはテキストファイルをExcel上に展開するのではなく、Windowsに対してファイルを操作する許可をとることを言います。
例えば、Excel上でブックを開く操作としてWorkbooksコレクションのOpenメソッドがありますが、Windowsに対して行うファイルを操作する命令はOpenステートメントを使用します。Openステートメントの書式は以下の通りです。
Open ファイルパス For 操作の種類 As #ファイル番号
「ファイルパス」は対象となるファイルのパスを指定します。
「操作の種類」は対象のファイルに対してどのような操作をするのかを指定します。操作の種類は以下の通りです。
操作の種類
Append
ファイルを追記する。
Binary
ファイルをバイナリデータとして扱う場合に指定する。
Input
テキストファイルのデータを読み込むときに指定する。
Output
ファイルを上書きする。
Random
固定長のデータを扱う場合に指定する。

Appendで読み込むと追記したデータは既存データの末尾に追記されますが、Outputの場合は既存データを新しいデータで上書きします。
「ファイル番号」には任意の数値を入力します。Openステートメントで開いたファイルは、このファイル番号で区別されます。同じ番号を指定するとエラーとなるので注意してください。
テキストファイルを閉じる
Openステートメントで開いたファイルは操作の終了時に閉じておく必要があります。テキストファイルを閉じるにはCloseステートメントを使用します。書式は以下の通りです。
Close #ファイル番号
ファイルを開いて閉じるコードは以下のように記載します。これを実行しても画面上にファイルが表示されることはありません。上述した通り、Windowsのプログラム内部でファイル操作しているからです。
Sub test1()
Open "C:\対象ファイルの場所\ファイル名.txt" For Input As #1
Close #1
End Sub
テキストファイルを読み込む
Openステートメントで開いたテキストファイルからテキストを読み込むには、Line Inputステートメントを使用します。書式は以下の通りです。
Line Input #ファイル番号 , 変数名
Line Inputステートメントではテキストファイルが1行ごとに読み込まれます。例えば以下のような文字列があったとします。
Good morning
Hello
Good night
Line Inputステートメントを実行すると、まず最初の1行目の「Good morning」が読み込まれます。さらにLine Inputステートメントを実行すると、次は2行目の「Hello」が読み込まれます。このように、次の読み込み位置を自動的に取得し、テキストを1行ごとに読み込みしていきます。
テキストの最終行までを取得するためには、EOF関数を使用します。EOF関数は読み込み位置がテキストの末尾に達すると、「True」を返します。テキストファイル内の全ての行を取得するには以下のように記載します。
Sub test2()
Dim str As String, i As Integer
Open "C:\対象ファイルの場所\ファイル名.txt" For Input As #1
i = 1
Do Until EOF(1)
Line Input #1, str
ActiveSheet.Cells(i, 1) = str
i = i + 1
Loop
Close #1
End Sub
Do LoopステートメントでEOF関数が「True」になるまでテキストを取得します。取得したテキストは以下のように順番にセルに入力されます。

ファイルのデータを一括で取得するには、Getステートメントを使用します。書式は以下の通りです。
Get #ファイル番号 , 読み込み位置 , 変数名
データを一括で取得する時は「読み込み位置」を省略します。また、Getステートメントでデータを読み込む場合は、対象のファイルサイズと変数のサイズ(バイト数)を一致させる必要があります。ファイルサイズを取得するには、FileLen関数をSpace関数の引数とすることで、ファイルサイズと同じだけのスペースを挿入します。以下にコード例を記載します。ファイル読み込みの際は「Binary」を指定します。
Sub test5()
Dim str As String
str = Space(FileLen("C:\対象ファイルの場所\ファイル名.txt"))
Open "C:\対象ファイルの場所\ファイル名.txt" For Binary As #1
Get #1, , str
Close #1
MsgBox str
End Sub

FileLen関数はファイルサイズを返す関数。Space関数は任意の数のスペースを挿入する関数です。
テキストファイルに書き込む
Openステートメントで開いたテキストファイルに書き込みをするには、Printステートメントを使用します。書式は以下の通りです。
Print #ファイル番号 , 書き込むデータ
テキストファイルに書き込む場合は、操作の種類は「Append」か「Output」で読み込みします。「Append」で読み込んで、書き込む場合は以下のように記述します。
Sub test3()
Dim str As String, i As Integer
Open "C:\対象ファイルの場所\ファイル名.txt" For Append As #1
Print #1, "Append"
Close #1
End Sub

「Output」で読み込んで書き込む場合は以下の通り。
Sub test4()
Dim str As String, i As Integer
Open "C:\対象ファイルの場所\ファイル名.txt" For Output As #1
Print #1, "Output"
Close #1
End Sub

ファイルの操作
続いて、ファイルの操作について紹介していきます。
ファイルのコピー
ファイルをコピーするにはFileCopyステートメントを使用します。書式は以下の通りです。
FileCopy 元ファイル , コピー先ファイル
コードは以下のように記述します。
Sub test6()
FileCopy "C:\コピー元ファイルの場所\ファイル名.拡張子", "C:\コピー先ファイルの場所\ファイル名.拡張子"
End Sub

コピー先のフォルダに同じ名前のファイルがあった場合、既存のファイルは新しいファイルに上書きされます。この時、確認のメッセージは表示されないので注意してください。
ファイルの移動
VBAにはファイルを移動するための命令はありません。代用としてNameステートメントを使用します。Nameステートメントはファイルの名前を変更する命令文ですが、この時にファイルの場所も変更することができるので、ファイルを移動したことと同様の結果が得られます。
Nameステートメントは以下のように記述します。
Name 変更前ファイル名 As 変更後ファイル名
コードは以下のように記述します。
Sub test7()
Name "C:\変更前ファイルの場所\ファイル名.拡張子", "C:\変更後ファイルの場所\ファイル名.拡張子"
End Sub
ファイルの削除
ファイルを削除するにはKillステートメントを使用します。書式は以下の通りです。
Kill ファイル名
コードは以下のように記述します。
Sub test7()
Kill "C:\ファイルの場所\ファイル名.拡張子"
End Sub

Killステートメントを使用すると、ごみ箱に移動されずに完全に削除されます。この時に確認のメッセージは表示されないので注意してください。また、ファイルをごみ箱に送るにはWindowsAPIを使用します。APIについては後ほど紹介します。
ファイルの確認
ファイルが存在しないのに、ファイル操作を行うとエラーが発生します。対象のファイルが存在するかどうか、予め確認するためにはDir関数を使用します。書式は以下の通りです。
Dir(ファイル名)
引数に指定したファイルが存在していれば、Dir関数はファイル名のみを返します。もし存在していなければ、空欄を返します。ファイルが存在するか確認し、存在しなければメッセージを表示するコードは以下のように記述します。
Sub test9()
If Dir( "C:\ファイルの場所\ファイル名.拡張子") = "" Then MsgBox "ファイルが見つかりません。"
End Sub
フォルダの操作
カレントフォルダ
カレントフォルダとはソフトウェアなどが現在操作対象としてるフォルダのことを言います。VBAのファイル操作において、ファイルパスを省略すると、カレントフォルダを指定したものとみなされます。
以下のコードは「テスト」という名前のテキストファイルを開きますが、パスを省略しているので、カレントフォルダの「テスト.txt」が指定されたものとして処理されます。この時、カレントフォルダに対象のファイルが存在しないとエラーが発生してしまいます。
Sub test10()
Open "テスト.txt" For Input As #1
End Sub
現在のカレントフォルダを調べるためにはCurDir関数を使用します。以下のコードを実行すると、カレントフォルダのパスが表示されます。
Sub test11()
MsgBox CurDir
End Sub

カレントフォルダを移動するためにはChDirステートメントを使用します。以下のコードはカレントフォルダをデスクトップに移動します。
Sub test12()
ChDir "C:\ファイルのパス\デスクトップ"
MsgBox CurDir
End Sub

フォルダの作成
新しいフォルダを作成するにはMkDirステートメントを使用します。書式は以下の通りです。
MkDir フォルダのパス
以下のコードは対象の場所に「テスト」フォルダを作成します。
Sub test13()
MkDir "C:\ファイルの場所\テスト"
End Sub
フォルダの削除
フォルダを削除するにはRmDirステートメントを使用します。書式は以下の通りです。
RmDir フォルダのパス
以下のコードは対象の場所の「テスト」フォルダを削除します。
Sub test14()
RmDir "C:\ファイルの場所\テスト"
End Sub
WindowsAPI
APIの概念
API(Application Programming Interface)はアプリケーションやWEBサイトがその機能を外部のユーザーが使用できるように公開している窓口のようなものです。なのでWindowsAPIとはWindowsが外部に公開している窓口で、VBAやその他の様々なプログラムからAPIを介して、Windowsが提供している機能を利用することができます。

APIの使い方
VBAでAPIを使用するためには、宣言セクションであらかじめ設定されている宣言を記述しなければなりません。APIの宣言を行うにはDeclareステートメントを使用します。
APIの宣言はあらかじめ決められているので、間違いを防ぐために信頼できるインターネット情報やAPIの検索ツールからコードをコピーして宣言することをおすすめします。一例としてMicrosoftの公式サイトに掲載されているAPIインデックスのページを記載します。
ファイルをごみ箱に移動する
VBAのファイルを削除するステートメントとしてKillステートメントがありますが、これを使用するとごみ箱に送られるのではなく、完全に削除されてしまいます。ごみ箱に移動させるためにはAPIを使用する必要があります。
ごみ箱に送る機能を使うには、宣言セクションで以下のように宣言します。
Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" (lpFileOp As SHFILEOPSTRUCT) As Long
APIのうち、外部に公開された機能や関数はライブラリと呼ばれます。今回は「shell32」というライブラリが公開している「SHFileOperation」という関数を使用します。
中身の解説は省略しますが、以下コードを実行すると「test.txt」というファイルをごみ箱に移動します。
Private Type SHFILEOPSTRUCT
hWnd As LongPtr
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As LongPtr
lpszProgressTitle As String
End Type
Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" (lpFileOp As SHFILEOPSTRUCT) As Long
' SHFileOperationの操作を指定する定数
Private Const FO_MOVE As Long = &H1
Private Const FO_COPY As Long = &H2
Private Const FO_DELETE As Long = &H3
Private Const FO_RENAME As Long = &H4
' フラグ定数
Private Const FOF_ALLOWUNDO As Integer = &H40
Private Const FOF_NOCONFIRMATION As Integer = &H10
Private Const FOF_NOERRORUI As Integer = &H400
Private Const FOF_SILENT As Integer = &H4
Sub trash()
Dim shFileOp As SHFILEOPSTRUCT
Dim FilePath As String
Dim Result As Long
' ゴミ箱に移動したいファイルのパス
FilePath = "C:\ファイルの場所\test.txt"
' ファイルの存在確認
If Dir(FilePath) = "" Then
MsgBox "指定されたファイルは存在しません: " & FilePath
Exit Sub
End If
' 構造体の設定
With shFileOp
.wFunc = FO_DELETE
.pFrom = FilePath & vbNullChar
.fFlags = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION Or FOF_SILENT
End With
' SHFileOperationを呼び出し
Result = SHFileOperation(shFileOp)
' 結果を確認
If Result = 0 Then
MsgBox "ファイルをゴミ箱に移動しました: " & FilePath
Else
MsgBox "エラーが発生しました。エラーコード: " & Result
End If
End Sub
まとめ
今回はVBAのファイル操作とAPIについて紹介しました。VBAの基礎シリーズはこの第8回をもってひとまず終了です。いままでのシリーズを1から読んでいけば、VBAの基礎については十分理解できるかと思うので、ぜひ他の記事も読んでみてください!
次回からはVBAの応用編やPythonなどその他の言語について解説しようと考えていますので、そちらも読んでいただければ嬉しいです。それではまた!