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

Excel VBAエキスパート対策です
公開日:2018-03-14 最終更新日:2019-08-26

ファイルの操作


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


【ここでのポイント】

テキストファイルの操作に関しては、定型文として、そのまま覚えるようにして下さい。
以下の説明を一通り読んだ後は、使用例のVBAコードを丸暗記する感じで覚えて下さい。
特にBinaryモードについては細部を気にしたらきりがありません、例文だけで十分です。

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

テキストファイルの操作

2019/05/15からの「VBAエキスパート」リニューアルに伴い出題範囲から削除されました。

マクロVBAを初心者向けの基本から上級者向けの高度な内容までサンプルコードを掲載し解説しています。エクセル関数・機能・基本操作の入門解説からマクロVBAまでエクセル全般を網羅しています。

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回.ファイル操作Ⅰ(Dir)
・Dir関数 ・Dir関数の使用例 ・Dir関数の実践例 ・Dir関数の制限について ・Dir関数の関連記事
第80回.ファイル操作Ⅰ(その他)
・ファイル操作で使う、ステートメントと関数 ・ファイル操作の使用例 ・ファイル操作の実践例 ・ファイル操作について

第116回.ファイル操作Ⅱ(OpenとClose)
・Openステートメント ・Closeステートメント ・OpenステートメントとCloseステートメントの使用例
第117回.ファイル操作Ⅱ(Line Input #)
・Line Input # ステートメント ・EOF関数 ・Line Input # ステートメント と EOF関数の使用例.
第118回.ファイル操作Ⅱ(Print #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、その後に、読込み書込みを行い、最後に、ファイルを閉じます。ファイルを書き込む時には、Print#ステートメントを使います。Print#ステートメント シーケンシャル出力モード(OutputまたはAppend)で開いたファイルにデータを書き込むファイル入…

第119回.ファイルシステムオブジェクト(FileSystemObject)
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例

CSVの読み込み方法
・もっとも簡単かつ良くあるCSV読み込みVBAコード ・「,」「"」に対応したCSV読み込みVBAコード ・CSVをExcelブックとして開くVBA ・クエリーテーブルを使ったCSV読み込みVBAコード ・その他のCSV読み込み方法
CSVの読み込み方法(改)
実施したいこと ・ファイル名を指定し、形式をカンマ区切り、文字列で開く、その際、改行コードLF、CRLF、CRいずれにも対応、セル内の","や改行についてはカラムで区切らない。掲示板で上記のリクエストを頂きました。ということで、対応ロジックを書いてみました。
CSVの読み込み方法(改の改)
・CSVの形式について ・CSV読み込みVBAコード ・配列を使ってシートにまとめて出力する場合 ・QueryTablesを使ったCSV読み込みVBAコード ・本サイトにあるCSV関連記事一覧
CSVの出力(書き出し)方法
・エクセルの機能をそのまま利用します ・直接CSVを出力 ・本サイトにあるCSV関連記事一覧
UTF-8でCSVの読み書き(ADODB.Stream)
・アクティブシートの内容をUTF-8でCSV出力します ・UTF-8のCSVを読込、シートに出力します ・ADODB.Streamのメソッドとプロパティ ・本サイトにあるCSV関連記事一覧

VBAエキスパート公式テキスト

2019/5/30発売リニューアル版


2019/7/26発売リニューアル版

こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。



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

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


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

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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