MOS VBAエキスパート対策 | ファイルの操作 | MOS Excel VBAエキスパート対策です



最終更新日:2018-03-16

ファイルの操作


・テキストファイルの操作
・ファイルのコピーと移動
・フォルダの操作


【ここでのポイント】

テキストファイルの操作に関しては、定型文として、そのまま覚えるようにして下さい。
以下の説明を一通り読んだ後は、使用例のVBAコードを丸暗記する感じで覚えて下さい。

特にBinaryモードについては細部を気にしたらきりがありません、例文だけで十分です。

ファイルのコピーと移動、フォルダの操作
これらは、単純に構文を覚えれば試験は問題ないと思います。
あまり複合的な応用を問う問題は作られないだろうという事です。
せいぜい、Dir関数との組み合わせ位だと思います。


テキストファイルの操作

VBAでテキストファイル(CSV等)を扱う時は、
最初に、ファイルを開き、
次に、読込書込みを行い、
最後に、ファイルを閉じます。

ファイルを開くには、Openステートメントを使います、
ファイルを閉じるには、Closeステートメントを使います。

Openステートメント

ファイルを開いて、ファイルへ入出力できるようにします。

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 の範囲で任意のファイル番号を指定します。
FreeFile 関数を使用して次に使用可能なファイル番号を取得してください。

reclength

省略可能です。
32,767 バイト以下の数値を指定します。
ランダム アクセス ファイルの場合は、レコード長を表します。
シーケンシャル ファイルの場合は、バッファの容量を表します。


mode
Append : 追加モード
Binary : バイナリ モード
Input : 入力モード
Output : 出力モード
Random : ランダム アクセス モード

FreeFile関数
使用可能なファイル番号を整数型 (Integer) の値で返すファイル入出力関数です。

pathname に指定したファイルが存在しない場合、
ファイルを開くときにAppend、Binary、Output、Randomのいずれかのモードが指定されている場合、新規に作成されて開きます。

[lock][Len=reclength]、これらは試験には出題されないはずなので気にしなくて良いです。


Closeステートメント

Open ステートメントで開いたファイルへの入出力を終了します。

Close [filenumberlist]

引数 filenumberlist には、
任意のファイル番号を 1 つまたは複数指定します。
省略すると、Open ステートメントで開いたすべてのファイルが閉じられます。


Line Input # ステートメント

入力モード (Input) で開いたファイルから行全体を読み込み、文字列型 (String) の変数に代入します。

Line Input #filenumber, varname

filenumber 必ず指定します。
任意のファイル番号を指定します。
varname 必ず指定します。
バリアント型 (Variant) の変数または文字列型 (String) の変数の名前を指定します。

Line Input # ステートメントは、
ファイルからキャリッジ リターン (Chr(13)) または改行コード (Chr(13)) + Chr(10)) の直前までのすべての文字を読み込みます。

キャリッジ リターン (Chr(13)) は、VbCr
改行コード (Chr(13)) + Chr(10)) は、VbCrLf

キャリッジ リターンと改行コードは、変数に読み込まれる文字列に追加されるのではなく、読み飛ばされます。


Get ステートメント

ファイルからデータを読み込み、それを変数に格納します。

Binaryモードで開いたときに、データの読込位置を指定したり、全データを読み込む時に使います。

Get [#]filenumber, [recnumber], varname

指定項目 内容
filenumber 必ず指定します。
任意のファイル番号を指定します。
recnumber 省略可能です。
バリアント型 (内部処理形式 Long の Variant) の値を指定します。
読み込みを始めるレコード番号 (ランダム アクセス モード) や バイト位置 (バイナリ モード) を指定します。
varname 必ず指定します。
読み込んだデータを格納する変数名を指定します。

Get ステートメントを使用して読み込んだデータは Put ステートメントを使用して書き込みます。

varnameには、一般的にはString型変数を指定します。
読み込まれるデータは、この変数の長さ以下になります。
従って、Getステートメントの実行前に、
この変数を読み込むデータ長と同じ長さにしておく必要があります。

公式テキストに載っているので記載しましたが、実務で使う事はほとんどないと思います。
このような方法が必要な時は、FileSystemObjectを使うのが一般的です。
構文だけを覚えれば良いでしょう。


EOF 関数

開いたファイルの現在位置がファイルの末尾に達している場合、
ブール型 (Boolean) の値の真 (True) を含む整数型 (Integer) の値を返します。

EOF(filenumber)

引数 filenumber には、任意の有効なファイル番号を表す整数型 (Integer) の数値を指定します。

EOF関数は、ファイルから読み込みを行っているとき、
読み込み位置がファイルの末尾に達していないかどうかを確かめるために使用します。


使用例.

Sub sample()
  Dim i As Long
  Dim FileNumber
  Dim InputData
  FileNumber = FreeFile
  Open "C:\TEST.txt" For Input As #FileNumber
  i = 1
  Do While Not EOF(FileNumber)
    Line Input #FileNumber, InputData
    Cells(i, 1) = InputData
    i = i + 1
  Loop
  Close #FileNumber
End Sub

以下は、FreeFile関数を使わない書き方になります。

Sub sample()
  Dim i As Long
  Dim InputData
  Open "C:\TEST.txt" For Input As #1
  i = 1
  Do While Not EOF(1)
    Line Input #1, InputData
    Cells(i, 1) = InputData
    i = i + 1
  Loop
  Close #1
End Sub

上記では、テキストファイル"C:\TEST.txt"から、1行ずつデータを読み込み、
ワークシートのA列に出力しています。

Sub sample3()
  Dim sTmp As String
  Dim InputData
  sTmp = Space(FileLen("C:\TEST.txt"))
  Open "C:\TEST.txt" For Binary As #1
  Get #1, , sTmp
  Close #1
End Sub

上記では、テキストファイル"C:\TEST.txt"から、データを一括で取得し、
A1セルに出力しています。



Print # ステートメント

出力モード (Output または Append) で開いたファイルにデータを書き込むファイル入出力ステートメントです。

Print #filenumber, [outputlist]

filenumber 必ず指定します。
任意のファイル番号を指定します。
outputlist 省略可能です。
出力する式や数式または文字列式を指定します。
[{Spc(n) | Tab[(n)]}] [expression] [charpos]
Spc(n) 出力するデータに n 個のスペースを挿入します。
Tab(n) expression の出力位置を n 番目の桁位置に移動します。
Tab 関数の引数 n に何も指定しない場合は、出力位置は次の印字領域の先頭になります。
expression 出力する数式または文字列式を指定します。
charpos 次の文字の出力位置を指定します。
セミコロン (;) を指定すると、次の文字は最後の文字の直後から出力されます。
Tab(n) 関数で出力位置の桁番号を指定できます。
Tab 関数の引数 n に何も指定しないと、出力位置は次の印字領域の先頭になります。
引数 charpos を省略すると、次の文字は次の行の先頭から出力されます。

引数 outputlist を省略し、引数 filenumber の後ろに区切り記号だけを指定すると、ファイルに空白行を出力します。

ブール型 (Boolean) のデータは、True または False という文字列で出力されます。
日付型 (Date) のデータは、コントロール パネルで設定した短い形式で書き込まれます。

outputlistについては、単純に文字列または変数を指定するパターンだけ覚えれば良いです。


使用例.
Sub sample()
  Dim i As Long
  Dim FileNumber
  FileNumber = FreeFile
  Open "C:\TEST.txt" For Output As #FileNumber
  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    Print #FileNumber, Cells(i, 1)
  Next
  Close #FileNumber
End Sub

上記では、ワークシートのA列のデータを、
テキストファイル"C:\TEST.txt"に書き出しています。


ファイルのコピーと移動

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

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

ステートメント・関数

構文 説明
Kill Kill pathname

ディスクからファイルを削除します。
複数のファイルを指定するためのワイルドカード文字を使用できます。

FileCopy FileCopy source, destination ファイルをコピーします。
Name Name oldpathname As newpathname ファイルまたはフォルダの名前を変更します。
必要に応じて他のフォルダにファイルを移動します。


使用例.

Kill "TestFile"
ファイル"TestFile"を削除します。
ファイルが存在しない場合はエラーとなります。

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

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

Dir関数との組み合わせ
Sub sample()
  If Dir("c:\user\test.txt") <> "" Then
    FileCopy "c:\user\test.txt", "c:\user\test2.txt"
  End If
  If Dir("c:\user\test.txt") <> "" Then
    Kill "c:\user\test.txt"
  End If
  If Dir("c:\user\test.txt") = "" And _
    Dir("c:\user\test2.txt") <> "" Then
    Name "c:\user\test2.txt" As "c:\user\test.txt"
  End If
End Sub

FileCopyでは、コピー元ファイルの存在
Killでは、削除するフアイルの存在確認
Nameでは、移動元が存在し、異動先が存在しない事の確認


フォルダの操作

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

フォルダの操作

ステートメント・関数

構文 説明
ChDrive ChDrive drive 現在のドライブを変更します。
ChDir ChDir path 現在のフォルダを変更します。
MkDir MkDir path 新しいフォルダを作成します。
RmDir RmDir path 既存のフォルダを削除するステートメントです。


使用例.

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

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

MkDir "MYDIR"
フォルダ"MYDIR"を作成します。
既にフォルダが存在する場合はエラーとなります。

RmDir "MYDIR"
フォルダ"MYDIR"を削除します。
フォルダ内にファイルが残っている場合はエラーとなります。


実践例

フォルダごとバックアップを作成します。
バックアップフォルダは、
元のフォルダ名_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\")
    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コード内にコメントを入れていますが、
処理手順としては以下の順となっています。、

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


【業務改善の実務】

実務としては、sjisの単純なテキストの読み書きくらいなら、このOpenステートメントを使いますが、
Excelで最も良く使うテキストファイルのCSVは、文字コードも多種で単純なコードでは済まない場合が多々あります。
CSVに関しては、下記の参考ページのコードを流用すれば良いでしょう。
毎回新たにVBAコードを書いていたのでは大変です。
自分なりに、流用できるVBAを集めておくという事も、VBA開発においては重要です。

VBAに用意されている、ファイル・フォルダ関係のステートメント・関数は、正しく動作する場合の制限がいくつかあります。
使い方が少々面倒になりますが、より汎用性のある、
FileSystemObject
こちらも必ず使えるようにしておいてください。


【本サイト内の関連ページ】





同じテーマ「MOS VBAエキスパート対策」の記事

プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作
ユーザーフォームとメニューの操作
VBAスタンダード試験対策まとめ

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

数値範囲で表検索するVLOOKUP近似一致|エクセル関数超技(10月5日)
エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.定数と型宣言文字(Const)|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作




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


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





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

本文下部へ

↑ PAGE TOP