FileSystemObject | Excel作業をVBAで効率化 https://vbabeginner.net いつものExcel作業はVBAを使えば数秒で終わるかもしれませんよ Sat, 09 Nov 2024 06:24:29 +0000 ja hourly 1 https://wordpress.org/?v=6.6.2 https://vbabeginner.net/wp-content/uploads/2019/02/favicon-150x150.png FileSystemObject | Excel作業をVBAで効率化 https://vbabeginner.net 32 32 TextStreamクラスのWriteメソッド https://vbabeginner.net/textstream-write/ Sat, 24 Apr 2021 14:51:33 +0000 https://vbabeginner.net/?p=5230 TextStreamクラスのWriteメソッド

TextStreamクラスのWriteメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルにデータを書き込みます。

Writeメソッドは改行コードを付与しません。そのため、Windowsの標準改行コードのCRLFではなく、LFを改行コードとしてファイルに書き込みたい場合はWriteメソッドを使ってLF(VBA定数ではvbLf)を書き込みます。その他、ASCIIコードの特殊文字(0x00から0x1F)を書き込みたい場合も同様です。なお、WriteLineメソッドは改行コードのCRLFが付与されます。

書き込み開始位置は上書きモードで開いた場合はファイルの先頭になり、追記モードで開いた場合はファイルの終端になります。

FileSystemObjectで扱えるファイルの文字コードはASCIIかUnicodeのどちらかになるため、Writeメソッドで書き込む文字列もファイルを開いたときの文字コードに準拠します。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Sub Write(Text As String)

Text ファイルに書き込む文字列を指定します。改行コードを書き込む場合は、vbCrLfなどを文字列に含める必要があります。

ファイルの文字コードとWriteで指定する文字数とバイト数の関係

先にも少し書いていますが、TextStreamオブジェクトを生成するFileSystemObjectクラスのOpenTextFileメソッドでは対象ファイルの文字コードをASCIIかUnicodeのどちらかであるかを指定できます。

ただ、実際に扱うファイルの文字コードが「Unicode」であることはかなり少ないでしょう。実際に使うファイルの文字コードはほとんどの場合はShift-JISかUTF-8かEUCのいずれかです。

なお、「UTF-8」とVBAで扱う「Unicode」は別物です。何が違うかというと、UTF-8の場合、半角カナは3バイトで全角文字は3から5バイトで半角英数は1バイトになります。そしてUnicodeはDBCS(Double Byte Character Set)言語換算になるため半角全角関わらず全ての文字が2バイトになります。

このことから、ファイルオープン時にASCIIを指定したときもUnicodeを指定したときもWriteメソッドで指定するのは文字数ですが、実際に読み込まれるデータはファイルの文字コードのままのデータであり、文字数が同じでもASCIIとUnicodeではバイト数が異なります。

文字数だけで判定するのであれば問題はありませんが、バイト単位で処理を行う場合にはファイルオープン時の文字コードの指定に注意が必要です。

このあたりについては「VBAのByte単位用関数の問題点」で詳しく書いていますのでご参照ください。

そして、ざっくりした言い方ですが、VBAで扱うのであればファイルはShift-JISが一番ラクです。別の文字コードなのであれば事前にShift-JISに変換してから読み込むようにした方がよいでしょう。例えばUTF-8からShift-JISに変換するのであれば「VBAでUTF-8のファイルをShift-JISに変換する」をご参照ください。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード1:上書きで書き込み

以下のコードは一般的なテキストファイルを上書きで書き込むサンプルです。

上書きにしたい場合は、サンプルのようにCreateTextFileメソッドのOverwrite引数をTrueにするか、OpenTextFileメソッドのIOMode引数にForWritingを設定してテキストファイルを開く必要があります。

テキストファイルを開いたあとは、Writeメソッドを使って既存ファイルの内容を上書きします。上書きのため、元の内容は削除されます。

'// 上書きで書き込み
Sub TextStreamWriteOverwrite()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    
    '// ファイルパスを設定
    sFilePath = "C:\overwrite.txt"
    
    '// ファイルを開く(上書き)
    Set ts = fso.CreateTextFile(Filename:=sFilePath, Overwrite:=True, Unicode:=False)
    
    Call ts.Write("abc")
    Call ts.Write(vbCrLf)
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

サンプルコード2:追記で書き込み

以下のコードは一般的なテキストファイルの最終行に追記するサンプルです。

追記で書き込む場合はサンプルのようにOpenTextFileメソッドのIOMode引数にForAppendingを指定する必要があります。

テキストファイルを開いて、Writeメソッドを使って既存ファイルの内容に続いて書き込みます。元の内容は削除されません。

'// 追記で書き込み
Sub TextStreamWriteAppend()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    
    '// ファイルパスを設定
    sFilePath = "C:\append.txt"
    
    '// ファイルを開く(追記)
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForAppending, Create:=True, Format:=TristateFalse)
    
    Call ts.Write("abc")
    Call ts.Write(vbCrLf)
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

]]>
TextStreamクラスのSkipLineメソッド https://vbabeginner.net/textstream-skipline/ Tue, 09 Jun 2020 21:45:31 +0000 https://vbabeginner.net/?p=4807 TextStreamクラスのSkipLineメソッド

TextStreamクラスのSkipLineメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルの読み込み位置を次の行の先頭に移動させます。

移動できるのは先頭から終端方向のみで、逆方向の終端から先頭側に向かって移動させることはできません。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Sub SkipLine()

引数や戻り値はありません。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

一般的なテキストファイルを参照する処理をサンプルで書いています。

テキストファイルは1行目が見出し行で、2行目以降はランダムにD:ではじまるデータ行と、C:ではじまるコメント行がある以下のような構成になっているとします。

見出し行
D:データ行
D:データ行
C:コメント行
D:データ行
C:コメント行
D:データ行

データ行だけを参照したい場合は1行目の見出し行とコメント行を読み飛ばす必要があります。それをSkipLineで行います。

テキストファイルを開いて、2文字読み取り、データ行かコメント行かを判定して、データ行であればイミディエイトウィンドウに出力し、ファイルを閉じるコードです。

テキストファイルの全行を読み込む場合はファイル終端を判定するAtEndOfStreamプロパティを使ってテキストファイルの全行ループを行います。

Sub TextStreamSkipLine()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    Dim sRead                               '// ファイルデータ
    
    '// ファイルパスを設定
    sFilePath = "C:\aaa.txt"
    
    '// ファイルを開く
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse)
    
    '// 1行目の見出し行をスキップ
    Call ts.SkipLine
    
    Dim i
    i = 1
    
    '// ファイルを全行ループ
    Do While ts.AtEndOfStream <> True
        '// ファイルから2文字取得
        sRead = ts.Read(2)
        
        '// データ行の場合
        If sRead = "D:" Then
            '// データ部分を取得
            sRead = ts.ReadLine
            Debug.Print sRead
        '// コメント行でない場合
        Else
            '// コメント行をスキップ
            Call ts.SkipLine
        End If
        
        i = i + 1
    Loop
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

実行結果
ファイルの内容は以下とします。
————
見出し
D:1234567
C:コメント
D:ABCD
D:EFGH
D:IJKKKKK
C:コメント行です
D:6666665555555
C:ここもコメント
D:aaaaa
————

上記関数を実行するとD:で始まるデータ行のみがイミディエイトウィンドウに出力されます。
————
1234567
ABCD
EFGH
IJKKKKK
6666665555555
aaaaa
————

]]>
TextStreamクラスのSkipメソッド https://vbabeginner.net/textstream-skip/ Wed, 08 Apr 2020 04:36:17 +0000 https://vbabeginner.net/?p=4794 TextStreamクラスのSkipメソッド

TextStreamクラスのSkipメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで参照モードで開いたファイルの読み込み位置を指定位置まで移動させます。

ファイルを開く際に読み取りモード(参照モード)でない場合は「エラー54 ファイル モードが不正です」が発生します。

移動できるのは先頭から終端方向のみで、逆方向の終端から先頭側に向かって移動させることはできません。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Sub Skip(Characters As Long)

Characters 現在の読み込み位置から次の読み込み位置まで読み飛ばす文字数を指定します。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

一般的なテキストファイルを参照する処理をサンプルで書いています。

テキストファイルを開いて、1文字ずつ読み取り、読み取ったデータが改行コードCRであればSファイルを閉じるコードです。

テキストファイルの全行を読み込む場合はファイル終端を判定するAtEndOfStreamプロパティを使ってテキストファイルの全行ループを行います。

テキストファイルは以下のように3行のデータで、各行に改行コードのCRLFがついているとします。
aaa(CRLF)
bbbb(CRLF)
ccccc(CRLF)

Sub TextStreamSkip()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    Dim sRead                               '// ファイルデータ
    
    '// ファイルパスを設定
    sFilePath = "C:\aaa.txt"
    
    '// ファイルを開く
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse)
    
    Dim i
    i = 1
    
    '// ファイルを全行ループ
    Do While ts.AtEndOfStream <> True
        '// ファイルから1文字取得
        sRead = ts.Read(1)
        
        '// 改行コードの場合
        If sRead = vbCr Then
            '// 次のLFの1文字をスキップ
            Call ts.Skip(1)
        Else
            Debug.Print CStr(i) & " : [" & Len(sRead) & "]:[" & sRead & "]"
        End If
        
        i = i + 1
    Loop
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

実行結果
ファイルから読み取った行データをイミディエイトウィンドウに出力します。

1 : [1]:[a]
2 : [1]:[a]
3 : [1]:[a]
5 : [1]:[b]
6 : [1]:[b]
7 : [1]:[b]
9 : [1]:[c]
10 : [1]:[c]
11 : [1]:[c]
12 : [1]:[c]
13 : [1]:[c]

]]>
TextStreamクラスのReadLineメソッド https://vbabeginner.net/textstream-readline/ Sun, 05 Apr 2020 09:37:34 +0000 https://vbabeginner.net/?p=4788 TextStreamクラスのReadLineメソッド

TextStreamクラスのReadLineメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルから行単位でデータを取得します。取得したデータには改行コードは含まれません。

ReadLineメソッドを実行する度に次の行のデータが読み取られます。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Function ReadLine() As String

引数 ありません
戻り値 改行コードまでを読み取ります。注意点として、CRLFとLFは改行コードとみなしますが、CRは改行コードとみなされません。読み取った文字列には改行コードは含みません。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

一般的なテキストファイルを参照する処理をサンプルで書いています。

テキストファイルを開いて、1行ずつ読み取り、ファイルを閉じるコードです。

テキストファイルの全行を読み込む場合はファイル終端を判定するAtEndOfStreamプロパティを使ってテキストファイルの全行ループを行います。似たようなプロパティでAtEndOfLineプロパティがありますが、こちらを使うと空行(改行コードしかない行)の位置でループが終了してしまいます。

Sub TextStreamReadLine()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    Dim sLine                               '// ファイル行
    
    '// ファイルパスを設定
    sFilePath = "C:\aaa.txt"
    
    '// ファイルを開く
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse)
    
    Dim i
    i = 1
    
    '// ファイルを全行ループ
    Do While ts.AtEndOfStream <> True
        '// ファイルから1行取得
        sLine = ts.ReadLine
        
        Debug.Print CStr(i) & " : [" & Len(sLine) & "]:[" & sLine & "]"
        
        i = i + 1
    Loop
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

実行結果
ファイルから読み取った行データをイミディエイトウィンドウに出力します。

]]>
TextStreamクラスのReadAllメソッド https://vbabeginner.net/textstream-readall/ Tue, 31 Mar 2020 15:55:36 +0000 https://vbabeginner.net/?p=4783 TextStreamクラスのReadAllメソッド

TextStreamクラスのReadAllメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルの内容を全て読み取り文字列として取得します。

ファイルサイズが大きい場合や固定長のレコードで構成されている場合はReadLineメソッドやReadメソッドで少しずつ読み取ることを採用しますが、そうでない場合はReadAllメソッドを使って一度にファイルデータをすべて読み取る方が都合がいい場合が結構あります。

ReadAllメソッドを使う一番の利点は、ループ処理が不要になり処理が単純になることです。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Function ReadAll() As String

戻り値として、読み込んだ文字列を返します。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

一般的なテキストファイルのデータを全て取得するサンプルです。

テキストファイルを開いて、ReadAllメソッドを使って全てのデータを読み取り、ファイルを閉じるコードです。

ReadAllメソッドはファイルデータをすべて読み取るため、ReadLineメソッドやReadメソッドのようにファイルデータを少しずつ読み取るためのループ処理が不要になり処理が単純になります。

Sub TextStreamReadAll()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    Dim sData                               '// ファイルデータ
    
    '// ファイルパスを設定
    sFilePath = "C:\aaa.txt"
    
    '// ファイルを開く
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse)
    
    '// ファイルデータを取得
    sData = ts.ReadAll
    Debug.Print sData
        
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

実行結果
ファイルデータをイミディエイトウィンドウに出力します。

]]>
TextStreamクラスのReadメソッド https://vbabeginner.net/textstream-read/ Tue, 31 Mar 2020 14:25:54 +0000 https://vbabeginner.net/?p=4773 TextStreamクラスのReadメソッド

TextStreamクラスのReadメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルの内容を指定した文字数だけ読み取ります。

指定した文字数よりファイルに書かれている文字数が少ない場合は読み取れる分だけを読み取ります。その場合はエラーにはなりません。

読み込み開始位置は前回Readメソッドを実行して取得した終端の次の文字が対象になります。例えばテキストファイルに「123456789」とデータがある場合にRead(4)を実行すると、”1234″が読み込まれ、次の開始位置は”5″になります。その状態で再度Read(4)を実行すると”5678″が読み込まれ、”9″が次の開始位置になります。さらにRead(4)を実行すると”9″のみが読み込まれます。

FileSystemObjectで扱えるファイルの文字コードはASCIIかUnicodeのどちらかになるため、Readメソッドで指定する文字数もファイルを開いたときの文字コードに準拠します。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Function Read(Characters As Long) As String

Characters ファイルから読み取る文字数を指定します。バイト数ではありません。全角半角関係なく指定した文字数分だけ読み取ります。
戻り値 読み込んだ文字列を返します。

ファイルの文字コードとReadで指定する文字数とバイト数の関係

先にも少し書いていますが、TextStreamオブジェクトを生成するFileSystemObjectクラスのOpenTextFileメソッドでは対象ファイルの文字コードをASCIIかUnicodeのどちらかであるかを指定できます。

ただ、実際に扱うファイルの文字コードが「Unicode」であることはかなり少ないでしょう。実際に使うファイルの文字コードはほとんどの場合はShift-JISかUTF-8かEUCのいずれかです。

なお、「UTF-8」とVBAで扱う「Unicode」は別物です。何が違うかというと、UTF-8の場合、半角カナは3バイトで全角文字は3から5バイトで半角英数は1バイトになります。そしてUnicodeはDBCS(Double Byte Character Set)言語換算になるため半角全角関わらず全ての文字が2バイトになります。

このことから、ファイルオープン時にASCIIを指定したときもUnicodeを指定したときもReadメソッドで指定するのは文字数ですが、実際に読み込まれるデータはファイルの文字コードのままのデータであり、文字数が同じでもASCIIとUnicodeではバイト数が異なります。

文字数だけで判定するのであれば問題はありませんが、バイト単位で処理を行う場合にはファイルオープン時の文字コードの指定に注意が必要です。

このあたりについては「VBAのByte単位用関数の問題点」で詳しく書いていますのでご参照ください。

そして、ざっくりした言い方ですが、VBAで扱うのであればファイルはShift-JISが一番ラクです。別の文字コードなのであれば事前にShift-JISに変換してから読み込むようにした方がよいでしょう。例えばUTF-8からShift-JISに変換するのであれば「VBAでUTF-8のファイルをShift-JISに変換する」をご参照ください。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

一般的なテキストファイルを参照する処理をサンプルで書いています。

テキストファイルを開いて、Readメソッドを使って50文字ずつ読み取り、ファイルを閉じるコードです。

Sub TextStreamRead()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    Dim sRead                               '// ファイルデータ
    
    '// ファイルパスを設定
    sFilePath = "C:\aaa.txt"
    
    '// ファイルを開く
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse)
    
    Dim i
    i = 1
    
    '// ファイルを全行ループ
    Do While ts.AtEndOfStream <> True
        '// ファイルから50文字取得
        sRead = ts.Read(50)
        
        Debug.Print CStr(i) & " : [" & Len(sRead) & "]:[" & sRead & "]"
        
        i = i + 1
    Loop
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

実行結果
ファイルを50文字ずつ読み込みそれをイミディエイトウィンドウに出力します。

]]>
TextStreamクラスのCloseメソッド https://vbabeginner.net/textstream-close/ Sun, 29 Mar 2020 14:57:30 +0000 https://vbabeginner.net/?p=4768 TextStreamクラスのCloseメソッド

TextStreamクラスのCloseメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルを閉じます。

Closeメソッドを呼び出していない場合は、CreateTextFileメソッドやOpenTextFileメソッドが書いてある関数を抜けると自動的にVBA側でファイルが閉じられます。

TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Sub Close()

引数なしです。戻り値もありません。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

一般的なテキストファイルを参照する処理をサンプルで書いています。

テキストファイルを開いて、1行ずつ読み取り、ファイルを閉じるコードです。

Sub TextStreamClose()
    On Error GoTo ERR_LABEL
    
    Dim fso         As New FileSystemObject '// FileSystemObjectクラス
    Dim ts          As TextStream           '// TextStreamクラス
    Dim sFilePath                           '// ファイルパス
    Dim sLine                               '// ファイル行
    
    '// ファイルパスを設定
    sFilePath = "C:\aaa.txt"

    '// ファイルを開く
    Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse)
    
    Dim i
    i = 1
    
    '// ファイルを全行ループ
    Do While ts.AtEndOfStream <> True
        '// ファイルから1行取得
        sLine = ts.ReadLine
        
        Debug.Print CStr(i) & " : " & sLine
        
        i = i + 1
    Loop
    
    '// ファイルを閉じる
    ts.Close
    
ERR_LABEL:
    
    '// エラー発生時
    If Err.Number <> 0 Then
        '// エラー内容を出力
        Debug.Print Err.Number & " " & Err.Description
    End If
End Sub

Closeメソッドを書かなくてもCloseされるけど

デバッグをしていると気が付きますが、OpenTextFileメソッドなどでファイルを開いたあとにCloseせずに途中でデバッグを終了させたりすることがありますが、その際にCloseメソッドを実行していなくても、ちゃんとファイルは閉じられており、次のオープン処理は正しく行われます。

これは関数処理を抜けたら開いていたファイルをVBAで閉じてくれているおかげです。

なので、Closeメソッドがなくても次の実行時には問題がないことがほとんどです。

「ファイルを開いて読み込んで終わり」、程度の簡単なプログラムであればCloseメソッドは無くても問題ないことがほとんどでしょう。Closeメソッドが必要になるのは同じプログラムの中でオープンとクローズを何度も行うような場合ぐらいです。

しかし、だからといってCloseメソッドはいらないのかというと、そうではなく、やはり開いたものはちゃんと閉じなさい、というのがプログラミングの作法です。

]]>
FileSystemObjectのDrivesプロパティ https://vbabeginner.net/filesystemobject-drives/ Tue, 10 Mar 2020 16:26:08 +0000 https://vbabeginner.net/?p=4723 FileSystemObjectのDrivesプロパティ

FileSystemObjectのDrivesプロパティは、パソコンの全てのドライブの情報をDrivesオブジェクトで返します。

取得したDrivesオブジェクトはDriveクラスオブジェクトの配列になっており、Drivesオブジェクトから1つずつDriveオブジェクトを取得し、そのDriveオブジェクトからドライブ名(C:など)や容量などの情報が参照できます。

ちなみに、PowerShellで「Get-PSDrive -PSProvider FileSystem」と入力してEnterキーを押すと、Drivesプロパティと同様の結果が一覧表示されます。なお、「Get-PSDrive」とだけ入力した場合はドライブ以外の一部のレジストリなどの情報も一覧表示されます。

FileSystemObjectの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Property Drives As Drives

戻り値 全ドライブの情報をDrivesオブジェクトで返します。

Drivesオブジェクトの各プロパティは以下になります。ドライブによっては参照できないプロパティがあります。

AvailableSpace 使用可能なディスク容量をバイト単位で返します。FreeSpaceプロパティの値と同じになります。
DriveLetter ドライブ文字を返します。Cドライブであれば”C”が取得できます。
DriveType ドライブの種類をDriveTypeConst定数で返します。

定数 内容
CDRom 4 CD-ROMドライブ
Fixed 2 ハードディスク
RamDisk 5 RAMディスク
Remote 3 ネットワークドライブ
Removable 1 リムーバブルドライブ
UnknownType 0 不明
FileSystem ファイルの種類を文字列で返します。”NTFS”などです。
FreeSpace 使用可能なディスク容量をバイト単位で返します。AvailableSpaceプロパティと同じ値になります。
IsReady ドライブが利用できるかをTrue(利用可能)かFalse(利用不可)で返します。CD-ROMのようにドライブとメディアが分かれている場合にメディアが入っているかどうかの判定ができます。
Path ドライブのパスを取得します。Cドライブであれば「C:」の文字列が返します。
RootFolder 対象のドライブのルートフォルダをFolderオブジェクトで返します。
SerialNumber ドライブのシリアルナンバーを返します。CD-ROMなどの可搬性メディアの場合はメディアのシリアルナンバーが返されます。
ShareName ネットワークドライブの場合のみ、そのネットワーク接続先のパスが返されます。
TotalSize 対象のドライブの総容量をバイトで返します。
VolumeName ドライブのボリューム名を取得または設定します。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

ドライブのパスを出力するサンプルコードです。

Sub FileSystemObjectDrives()
    Dim fso     As New FileSystemObject     '// FileSystemObjectクラス
    Dim drvs    As Drives                   '// Drivesクラス
    Dim drv     As Drive                    '// Driveクラス
    
    '// 全てのドライブ情報を取得
    Set drvs = fso.Drives
    
    '// ドライブ数を出力
    Debug.Print "ドライブ数:" & drvs.Count
     
    '// 全ドライブをループ
    For Each drv In drvs
        '// 出力
        Debug.Print drv.Path & " " & drv.DriveType
    Next
End Sub

実行結果(PCによって結果は異なります)
ドライブ数:4
C: 2
D: 4
U: 3
V: 3

]]>
FileSystemObjectのGetSpecialFolderメソッド https://vbabeginner.net/filesystemobject-getspecialfolder/ Wed, 04 Mar 2020 15:33:26 +0000 https://vbabeginner.net/?p=4690 FileSystemObjectのGetSpecialFolderメソッド

FileSystemObjectのGetSpecialFolderメソッドは、Windows特有のフォルダパスを返します。

FileSystemObjectの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Function GetSpecialFolder(SpecialFolder As SpecialFolderConst) As Folder

SpecialFolder 取得する特殊フォルダの種類をSpecialFolderConst定数で指定します。

SpecialFolderConst定数 内容
SystemFolder 1 ライブラリやフォントやデバイスドライバなどが格納されているフォルダです。環境変数は登録されていません。通常は”C:¥Windows¥System32″を指します。
TemporaryFolder 2 一時ファイルが格納されるフォルダです。通常はTempフォルダを指します。環境変数TMPで登録されています。通常は”C:¥Users¥ログインユーザ¥AppData¥Local¥Temp”を指します。
WindowsFolder 0 WindowsOSがインストールされているフォルダです。環境変数SystemRootで登録されています。通常は”C:¥Windows”を指します。
戻り値 取得した特殊フォルダをFolderオブジェクトで返します。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

各定数での特殊フォルダのFolderオブジェクトからフォルダパスを出力するサンプルです。

Sub FileSystemObjectGetSpecialFolder()
    Dim fso         As New FileSystemObject     '// FileSystemObjectクラス
    Dim f           As Folder                   '// 特殊フォルダ
    
    Set f = fso.GetSpecialFolder(SystemFolder)
    Debug.Print f.Path

    Set f = fso.GetSpecialFolder(TemporaryFolder)
    Debug.Print f.Path
    
    Set f = fso.GetSpecialFolder(WindowsFolder)
    Debug.Print f.Path
End Sub

実行結果
C:\Windows\System32
C:\Users\user\AppData\Local\Temp
C:\Windows

]]>
FileSystemObjectのGetParentFolderNameメソッド https://vbabeginner.net/filesystemobject-getparentfoldername/ Wed, 04 Mar 2020 15:24:51 +0000 https://vbabeginner.net/?p=4688 FileSystemObjectのGetParentFolderNameメソッド

FileSystemObjectのGetParentFolderNameメソッドは、引数のパスの親フォルダを返します。

引数のファイルパスやフォルダパスは文字列として判定を行うため、実際に存在していなくても問題ありません。

FileSystemObjectの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。

構文

Function GetParentFolderName(Path As String) As String

Path ファイルパスやフォルダパスを指定します。存在しないパスも指定できます。
戻り値 引数のパスの親フォルダを返します。親フォルダが存在しない場合やパスとして認識できない場合は空文字列””を返します。

事前設定

以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。

FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。

サンプルコード

各種ファイルパスやフォルダパスから親フォルダを取得して出力するサンプルです。

Sub FileSystemObjectGetParentFolderName()
    Dim fso         As New FileSystemObject     '// FileSystemObjectクラス
    Dim sPath       As String                   '// 戻り値
    
    '// アクティブブックのフォルダパス
    sPath = fso.GetParentFolderName(ActiveWorkbook.Path)
    Debug.Print ActiveWorkbook.Path & " - " & sPath

    '// アクティブブックのファイルパス
    sPath = fso.GetParentFolderName(ActiveWorkbook.FullName)
    Debug.Print ActiveWorkbook.FullName & " - " & sPath
    
    '// 存在しないパス
    sPath = fso.GetParentFolderName("ZZ:\aaa\bbb")
    Debug.Print "ZZ:\aaa\bbb" & " - " & sPath
End Sub

実行結果
C:\aaa\bbb\ccc – C:\aaa\bbb
C:\aaa\bbb\ccc\test.xlsm – C:\aaa\bbb\ccc
ZZ:\aaa\bbb – ZZ:\aaa

]]>