VBA入門
ファイル操作Ⅰ(その他)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-10-21

第80回.ファイル操作Ⅰ(その他)


VBAではファイル操作するためのステートメントと関数が多数用意されています。
マクロVBAでファイル操作する場合は、これらの用意されたステートメントや関数を使い処理を実現します。



ファイル操作で使う、ステートメントと関数

ChDriveステートメント
ChDirステートメント
CurDir関数
MkDirステートメント
RmDirステートメント
Killステートメント
FileCopyステートメント
Nameステートメント
GetAttr関数
SetAttrステートメント



ステートメント・関数

構文 説明
ChDrive ChDrive drive 現在のドライブを変更します。
ChDir ChDir path 現在のフォルダを変更します。
CurDir CurDir [(drive)] 現在のパスを返します。
Driveを省略した場合は、現在のドライブのパスを返します。
MkDir MkDir path 新しいフォルダを作成します。
RmDir RmDir path 既存のフォルダを削除するステートメントです。
Kill Kill pathname

ディスクからファイルを削除します。
複数のファイルを指定するためのワイルドカード文字を使用できます。
読み取り専用属性ファイルは削除できません。

FileCopy FileCopy source, destination ファイルをコピーします。
Name Name oldpathname As newpathname ファイルまたはフォルダの名前を変更します。
必要に応じて他のフォルダにファイルを移動します。
SetAttr SetAttr pathname, attributes ファイルの属性を設定します。
GetAttr関数 GetAttr(pathname) ファイルまたはフォルダの属性を表す整数を返します。

GetAttrのみ関数となっていますが、特に関数とステートメントの違いを意識する必要はありません。
戻り値が必要なものは関数として実装されているという事です。
GetAttrは取得した属性を返すための戻り値が必要な為、関数として実装されています。

ステートメントと関数の違いについて
ステートメント/関数という記述については、「Office VBA リファレンス」に記載されているものに倣いました。
しかし実際には、これらは「VBA.FileSystem」のメンバーであるメソッドになります。
(IfステートメントやForステートメントとは根本的に違う種類のものになります。)

したがって、先頭に「Call」を付けて記述することができます。
Call VBA.FileCopy("d:\test.txt", "d:\test2.txt")
※[VBA.]は省略可能

全てメソッドですが、戻り値のあるメソッドを関数と記載しているだけの違いになります。

GetAttrとSetAttrの、属性を表す定数
定数 内容
vbNormal 0 標準ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル。
Macintosh では使用できません。
vbVolume 8 ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
Macintosh では使用できません。
vbDirectory 16 フォルダ
vbAlias 32 エイリアス ファイル。
Macintosh でのみ使用できます。

この値はビット演算に対応するように作成されています。
任意の複数の値を足し算した値は、他の組み合わせと同一になることはありません。
この場合の足し算は論理演算のOrと同等です。
論理積(And)論理和(Or)と真(True)偽(False)の判定|VBA技術解説
And演算子、Or演算子は、2つの数式内のビット単位の比較を行います、そして、IfステートメントのThenは、Trueの時と言うより、False以外の時に実行されます。何を言っているのか分かりずらいと思いますので、順に解説します。Trueとは何か、Falseとは何か True、Falseを数値で表すと、


ファイル操作の使用例

ChDrive "D"
"D" を現在のドライブにします。

ChDir "D:\WINDOWS\SYSTEM"
"D:" の現在のフォルダを変更します。
現在のドライブは変更されません。

MkDir "C:\MYDIR"
フォルダ"MYDIR"を作成します。
既にフォルダが存在する場合はエラーとなります。
RmDir "C:\MYDIR"
フォルダ"MYDIR"を削除します。
フォルダ内にファイルが残っている場合はエラーとなります。

Kill "C:\MYDIR\TestFile"
ファイル"TestFile"を削除します。
ファイルが存在しない場合はエラーとなります。
読み取り専用属性ファイルは削除できません。

FileCopy "SourceFile", "DestinationFile"
"SourceFile"と"DestinationFile"は、ファイルのフルパスを指定します。
ファイル"SourceFile"を"DestinationFile"としてコピーします。
"DestinationFile"が既に存在する場合は上書きされます。

Name "OldName" As "NewName"
"OldName"と"NewName"は、ファイルのフルパスを指定します。
ファイル"OldName"の名前を"NewName"に変更します。
"NewName"が既に存在する場合はエラーとなります。

変数 = GetAttr("C:\MYDIR\TestFile")
ファイル属性の正数値が入ります。
GetAttrは関数なので戻り値が存在します。

SetAttr "C:\MYDIR\TestFile", vbHidden + vbReadOnly
ファイル"TestFile"に隠しファイル属性、および読み取り専用属性を設定します。

これらは、単体で使用する事はほとんどないでしょう。
前回の、Dir関数と合わせて、各種ファイル操作を実現します。
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。引数に指定したファイルが存在するとそのファイル名を返し、存在しないと空欄を返します。


ファイル操作の実践例

フォルダごとバックアップを作成します。
バックアップフォルダは、
元のフォルダ名_bk
ただし、以下のVBAではサブフォルダは考慮していません。



Sub sample()
  Dim strPath As String
  Dim strFileName As String
  
  'フォルダの選択
  With Application.FileDialog(msoFileDialogFolderPicker)
    .InitialFileName = "D:\user"
    .AllowMultiSelect = False
    .Title = "フォルダの選択"
    If .Show = True Then
      strPath = .SelectedItems(1)
    Else
      Exit Sub
    End If
  End With
  
  'バックアップフォルダの削除
  If Dir(strPath & "_bk", vbDirectory) <> "" Then
    strFileName = Dir(strPath & "_bk\")
    'フォルダ内のファイルを全削除
    On Error Resume Next 'ファイルが存在しない場合の対応
    Kill strPath & "_bk\*"
    On Error GoTo 0
    '個別に削除する場合は以下
    'Do While strFileName <> ""
    '  Kill strPath & "_bk\" & strFileName
    '  strFileName = Dir()
    'Loop
    RmDir strPath & "_bk\"
  End If
  
  'バックアップフォルダの作成
  MkDir strPath & "_bk"

  'バックアップの作成
  strFileName = Dir(strPath & "\")
  Do While strFileName <> ""
    FileCopy strPath & "\" & strFileName, strPath & "_bk\" & strFileName
    strFileName = Dir()
  Loop
End Sub

ファイル操作関連のステートメントと関数を太字にしています。
VBAコード内にコメントを入れていますが、
処理手順としては以下の順となっています。

・フォルダの選択
・バックアップフォルダの削除
・バックアップフォルダの作成
・バックアップの作成


ファイル操作について

VBAでファイル操作をする場合は、ファイル操作のステートメントや関数を知らなければ処理が出来ません。
しかし、これらを全て完璧にマスターする必要はありません。

どういうものがあるかだけを覚えておいて、必要な時に調べながら使えれば問題ありません。




同じテーマ「マクロVBA入門」の記事

第77回.組み込みダイアログ(Dialogs,xlDialogPrint)
第78回.総合練習問題8
第79回.ファイル操作Ⅰ(Dir)
第80回.ファイル操作Ⅰ(その他)
第81回.総合練習問題9
第82回.RangeのResizeプロパティ
第83回.RangeのOffsetプロパティ
第84回.RangeのAddressプロパティ
第85回.結合セルの扱い
第86回.総合練習問題10
第88回.並べ替え(Sort)


新着記事NEW ・・・新着記事一覧を見る

ピッボットテーブルって便利だよね|還暦のVBA(2021-10-18)
還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.並べ替え(Sort)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ