2020年6月15日月曜日

[VBA] 10. ファイル/ディレクトリの操作

ファイルとディレクトリの操作について。CSVファイルを読み込むサンプルについても記載している。



ファイルを開く
Open pathname For mode [ Access access ] [ lock ] As [ # ] filenumber [ Len = reclength ]

 pathname : ファイルパス
 mode : ファイルモード (Append、Binary, Input, Output, Random)
 access : ファイル操作制限 (Read, Write, Read Write)
 lock : 他のプロセスからの操作制限 (Shared, Lock Read, Lock Write, Lock Read Write)
 filenumber : ファイル番号 (1~511)
 reclength : レコード長

pathname で指定したファイルが存在しない場合、mode が Input 以外であれば新規ファイルが作成される。
filenumber は FreeFile 関数で使用可能な番号を取得できる。もしくは直接指定。


ファイルを閉じる
Close [ filenumberlist ]

 filenumberlist : ファイル番号

filenumberlist を省略した場合は、Open ステートメントで開いたすべてのアクティブなファイルが閉じられる。
複数ファイル指定したい場合は、close #1, #2 のように , で区切る。


ファイルに書き込む
ファイルへの書き込みは Print を使用する。

Print #filenumber, [ outputlist ]

outputlist は書き込みたい文字列。省略した場合は空行となる。
Dim filePath As String
Dim fileNum As Integer

'ファイルパス
filePath = ThisWorkbook.Path & "\" & "test.txt"

'ファイル番号を取得
fileNum = FreeFile

'ファイルを開く
Open filePath For Output As #fileNum

'ファイルに出力
Print #fileNum, "aaaa"   '1行目
Print #fileNum,          '2行目 (改行のみ)
Print #fileNum, "bbbb";  '3行目 (改行なし)
Print #fileNum, "cccc"   '3行目

'ファイルを閉じる
Close #fileNum
上記で作成した test.txt の中身は以下のようになる。
test.txt

aaaa bbbbcccc

ファイルを読み込む
開いたファイルを1行ずつ読み込むには Line Input を使用する。以下の例では Do While - Loop を使って行末 (EOF) を検出するまで繰り返す。

Line Input #filenumber, varname

Dim filePath As String, str As String
Dim fileNum As Integer

'ファイルパス
filePath = ThisWorkbook.Path & "\" & "test.txt"

'ファイル番号を取得
fileNum = FreeFile

'ファイルを開く
Open filePath For Input As #fileNum

'ファイルを読み込む
Do While Not EOF(fileNum)
    Line Input #fileNum, str
    Debug.Print str
Loop

'ファイルを閉じる
Close #fileNum

上記の ファイル書き込み → 読み込み をした実行結果
aaaa

bbbbcccc


ファイルのコピー
テキストファイルをコピーするサンプル。コピー先のファイルが既に存在する場合は上書きされる。
Dim srcFile As String, dstFile As String

srcFile = ThisWorkbook.path & "\" & "aaa.txt"  'コピー元ファイル
dstFile = ThisWorkbook.path & "\" & "bbb.txt"  'コピー先ファイル

FileCopy srcFile, dstFile


ファイルの削除
テキストファイルを削除するサンプル。
Dim filePath As String

'ファイルパス
filePath = ThisWorkbook.Path & "\" & "*.txt"

'ファイル削除
If Dir(filePath, vbNormal) <> "" Then
    Kill filePath
Else
    Debug.Print "テキストファイルはありません。"
End If


ディレクトリの追加
既に同じ名前のディレクトリがあった場合を考慮し、ディレクトリの存在確認を行うこと。
Dim dirPath As String, str As String

'ディレクトリパス
dirPath = ThisWorkbook.Path & "\dir_name"

'ディレクトリチェック & 作成
If Dir(dirPath, vbDirectory) = "" Then
    MkDir dirPath
Else
    Debug.Print "ディレクトリが存在します。"
End If


ディレクトリの削除
ディレクトリの中にファイルがあると削除できないようなので、先に Kill を使って削除しておく。
Dim dirPath As String

'ディレクトリパス
dirPath = ThisWorkbook.Path & "\dir_name"

'ディレクトリ削除
If Dir(dirPath, vbDirectory) <> "" Then
    Kill dirPath & "\" & "*"  'ディレクトリ内のファイルを空にする
    RmDir dirPath
End If

ディレクトリの下にサブディレクトリが存在したりする場合は、FileSystemObject を使用するのが簡単そう。
前準備として、メニューバーから ツール → 参照設定 を選択し、Microsoft Scripting Runtime にチェックを入れておく。
'FileSystemObject の作成
Dim fso As FileSystemObject
Set fso = New FileSystemObject

'ディレクトリパス
Dim dirPath As String
dirPath = ThisWorkbook.Path & "\dir_name"

'ディレクトリ削除
Call fso.DeleteFolder(dirPath, True)

'クリア
Set fso = Nothing


CSVファイルを読み込む
Workbooks.Open を使って CSV ファイルを開く方法が一般的なやり方だと思っていたが、調べてみると色々なやり方があるらしい。
私の場合は別の言語で CSV 化したファイルをエクセルで確認する (CSV ファイル自体の編集はしない) ことが多く、以下の方法で行っている。
Dim answer As Long          'MsgBox応答
Dim filePath As String      'ファイルパス
Dim newSheetName As String  '新規シート名

'メッセージボックスを表示 (キャンセル時は終了)
answer = MsgBox("CSV ファイルを選択してください。", vbOKCancel, "確認")
If (answer <> 1) Then
    Exit Sub
End If

'ダイアログボックスを表示 (キャンセル時は終了)
filePath = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv")
If (filePath = "False") Then
    Exit Sub
End If

'新規シート名 (CSV ファイル名) を取得
newSheetName = Dir(filePath)
newSheetName = Replace(newSheetName, ".csv", "")  '拡張子は削除

'新規シート名と同じ名前のシートが存在する場合は古いシートを一旦削除
For Each check_sheet In ThisWorkbook.Worksheets
    If (check_sheet.Name = newSheetName) Then
        Application.DisplayAlerts = False  '確認メッセージを出さないようにする
        Worksheets(newSheetName).Delete
        Application.DisplayAlerts = True
    End If
Next

'新規シート作成 (シートの位置は左端)
Worksheets.Add Before:=Sheets(1)
ActiveSheet.Name = newSheetName   'シート名指定

'CSV ファイルを開く -> 新規シートにコピー -> CSV ファイルを閉じる (保存はしない)
Workbooks.Open Filename:=filePath
ActiveSheet.Cells.Copy ThisWorkbook.Sheets(newSheetName).Cells
ActiveWorkbook.Close savechanges:=False



0 件のコメント:

コメントを投稿