VBAエキスパート対策
ファイルの操作

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
こちらも必ず使えるようにしておいてください。


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

第79回.ファイル操作T(Dir)
VBAでは、フォルダのファイル一覧を取得したり、ファイルの存在確認をする事が出来ます、指定したパターンやファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。Dir関数は、引数に指定したファイルが存在すると、そのファイル名を返し、存在しないと空,Excelマクロの基礎と応用
第80回.ファイル操作T(その他)
VBAではファイル操作するためのステートメントと関数が用意されています、VBAでファイル操作する場合は、これらの用意されたステートメントや関数を使い処理を実現します。ファイル操作で使う、ステートメントと関数 ChDriveステートメント ChDirステートメント Mk,Excelマクロの基礎と応用

第116回.ファイル操作U(OpenとClose)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、次に、読込書込みを行い、最後に、ファイルを閉じます。ファイルを開くには、Openステートメントを使います、ファイルをとじるには、Closeステートメントを使います。Excelマクロの基礎と応用
第117回.ファイル操作U(Line Input #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、次に、読込書込みを行い、最後に、ファイルを閉じます。ファイルを読み込む時に、LineInput#ステートメントを使います。Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
第118回.ファイル操作U(Print #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、次に、読込書込みを行い、最後に、ファイルを閉じます。ファイルを書き込む時に、Print#ステートメントを使います。Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説

第119回.ファイルシステムオブジェクト(FileSystemObject)
FileSystemObjectオブジェクトは、コンピュータのファイルシステムへのアクセスを提供します、VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし、機能が大変多いため、これらを全て覚えるという,Excelマクロの基礎と応用

CSVの読み込み方法
エクセルのマクロVBAでのCSVの読込方法としては、・テキストファイルとして読み込む ・ワークブックとして読み込む ・クエリーテーブルを使う ・ADOを使う、大別するとこのようになります。エクセルのマクロVBAでCSVの読み込みについてネットで検索したところ
CSVの読み込み方法(改)
実施したいこと ・ファイル名を指定し、形式をカンマ区切り、文字列で開く、その際、改行コードLF、CRLF、CRいずれにも対応、セル内の","や改行についてはカラムで区切らない。掲示板で上記のリクエストを頂きました。ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
CSVの読み込み方法(改の改)
CSVの読込方法については複数の記事を掲載しており、人気記事として多くのアクセスがあります、掲載しているVBAコードは汎用的に書いてあり、ほぼそのまま使用できるものです。しかし、CSVは多くの形式(区切り文字、文字コード等)があり、今まで掲載したコードでは解決出来ないも,VBAの実用サンプル
CSVの出力(書き出し)方法
シート内容をCSV出力(書き出し)する方法です。CSVの読込は、「CSVの読込方法」「CSVの読込方法(改)」こちらを参照して下さい。ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
UTF-8でCSVの読み書き(ADODB.Stream)
VBAでUTF-8を扱う為には、ADODB.Streamを使う必要があります。以下のコードを使用するには、参照設定で、「MicrosoftActiveXDataObjects2.8Library」にチェックを付けて下さい。ExcelマクロVBAの実用サンプル、エクセルVBA集と解説





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

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

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

クラスとCallByNameとポリモーフィズム(多態性)|VBA技術解説(4月6日)
VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説(4月3日)
クラスとイベントとマルチプロセス並列処理|VBA技術解説(4月2日)
エクセルの日付と時刻のまとめ|エクセル関数超技(3月6日)
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)

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

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



  • >
  • >
  • >
  • ファイルの操作

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


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






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

    本文下部へ