テキストファイル(UTF-8)を読み込み、書き出し(ADODB.Stream)
Stream オブジェクト
ADO(ActiveX Database Object)の Stream オブジェクト(ADODB.Stream)を使用すると UTF-8 形式のテキストファイルを読み込むことができます。
ADO を使用するには、ライブラリファイルへの参照設定を行う方法と、CreateObject 関数を使う方法があります。
ADODB.Stream
<CreateObjects 関数を使用する場合>
Dim st As Object
Set st = CreateObject(“ADODB.Stream”)
<参照設定を行う場合>
Dim st As ADODB.Stream
Set st = New ADODB.Stream
引数・戻り値
Excel2003 以前では、Microsoft ActiveX Data Objects 2.8 Library を選択します。
Excel2007 以降では、Microsoft ActiveX Data Objects バージョン番号 Library を選択します。
参照設定の方法については、ファイルシステムオブジェクト(FileSystemObject)の使い方 を参照してください。
CreatObject 関数 を使用する場合は、参照設定の必要はありませんが、VBE で、自動メンバ表示等のコーディング支援機能が使用できません。また、マクロの実行速度も遅くなります。
Open メソッド / Close メソッド
Open は、Stream オブジェクト を開きます。
Close は、開いている Stream オブジェクト を閉じます。
object.Open
object.Close
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
Type プロパティ
Stream オブジェクト内のデータ型(テキスト or バイナリ)を設定します。
object.Type = StreamType
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- StreamType ・・・ StreamTypeEnum 列挙型の定数またはその値を指定します。
定数 値 内容 adTypeBinary 1 バイナリデータ adTypeText 2 テキストデータ(既定値)
Charset プロパティ
ファイルの文字コードを指定します。
object.Charset = CharacterCode
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- CharacterCode ・・・ 文字コードを表す文字列(String 型)を指定します。
(例)UTF-8、Shift_JIS、euc-jp、ISO-2022-JP、Unicode(デフォルト)など
LoadFromFile メソッド
指定したファイルの内容を Stream に読み込みます。
object.LoadFromFile FileName
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- FileName ・・・ ファイルの名前を文字列型(String)で指定します。指定したファイルが存在しない場合は、エラーが発生します。
SaveToFile メソッド
Stream オブジェクトの内容を指定したファイルに保存します。
object.SaveToFile FileName [, SaveOptions]
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- FileName ・・・ ファイルの名前を文字列型(String)で指定します。
- SaveOptions ・・・ 新規ファイルを作成するかどうかを SaveOptionsEnum 値で指定します(省略可)。
定数 値 内容 adSaveCreateNotExist 1 FileName で指定したファイルが存在しない場合は新規のファイルを作成します(既定値)。 adSaveCreateOverWrite 2 FileName で指定したファイルが存在しない場合は新規のファイルを作成し、存在する場合は上書きされます。
Position プロパティ
Stream オブジェクト内の現在の位置を取得、または設定します。
<取得>
long = object.Position
<設定>
object.Position = long
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- long ・・・ Stream オブジェクト内の位置を示す長整数型(Long)の値をバイト単位で設定(取得)します。
EOS プロパティ / SetEOS メソッド
EOS プロパティで、Stream オブジェクト内の現在の位置が末尾かどうかを確認します。SetEOS メソッドで、Stream オブジェクト内の位置をを末尾に設定します。
<末尾かどうかを確認>
boolean = object.EOS
<末尾に設定>
object.SetEOS
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- boolean ・・・ 現在の位置が Stream の末尾かどうかを示すブール型(Boolean)の値を返します。現在の位置が末尾の場合は True、末尾でない場合は False を返します。
Read メソッド / ReadText メソッド
Stream オブジェクトから指定したバイト数または文字数のデータを読み取ります。
object.Read [ NumBytes ]
object.ReadText [ NumChars ]
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- NumBytes ・・・ ファイルから読み取るバイト数を長整数型(Long)の値で指定します。または、StreamReadEnum 値 を指定します。
- NumChars ・・・ ファイルから読み取る文字数を長整数型(Long)の値で指定します。または、StreamReadEnum 値 を指定します。
StreamReadEnum
定数 | 値 | 内容 |
adReadAll | -1 | 現在の位置から EOS マーカー方向に、すべてのバイトをストリームから読み取ります(既定値)。 |
adReadLine | -2 | ストリームから次の行を読み取ります。 |
Write メソッド / WriteText メソッド
Stream オブジェクトにバイナリデータまたはテキストデータを書き込みます。
object.Write Buffer
object.WriteText Data [ ,Options ]
引数・戻り値
- object ・・・ 対象となる Stream オブジェクトを指定します。
- Buffer ・・・ Stream オブジェクトに書き込むバリアント型(Variant)の値を指定します。
- Data ・・・ Stream オブジェクトに書き込む文字列型(String)の値を指定します。
- Options ・・・ 指定した文字列の終わりに行区切り文字を書き込むかどうかを StreamWriteEnum 値で指定します(省略可)。
定数 値 内容 adWriteChar 0 引数 Data で指定した文字列を書き込みます(既定値)。 adWriteLine 1 Data で指定した文字列と行区切り文字を書き込みます。
ConvertFormula メソッド 使用例
サンプルVBAソース 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub Sample_ADOStream_Load() '【参照設定】Microsoft ActiveX Data Objects 6.1 Library Dim st As ADODB.Stream Dim myPath As String Dim myStr As String myPath = ThisWorkbook.path & "\test01.csv" Set st = New ADODB.Stream With st .Open 'Stream を開く .Type = adTypeText 'テキスト形式 .Charset = "UTF-8" '文字コードの指定 .LoadFromFile myPath 'ファイルの内容を読み込む myStr = .ReadText '読み込んだ内容を取得 .Close 'Stream を閉じる End With MsgBox myStr End Sub |
実行結果
サンプルVBAソース 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Sub Sample_ADOStream_Save1() '【参照設定】Microsoft ActiveX Data Objects 6.1 Library Dim st As ADODB.Stream Dim myPath As String Dim myStrLine As String Dim myRng As Range Dim i As Long Dim j As Long myPath = ThisWorkbook.path & "\test02.csv" Set st = New ADODB.Stream st.Open 'Stream を開く st.Type = adTypeText 'テキスト形式 st.Charset = "UTF-8" '文字コードの指定 With Worksheets("Sheet1") Set myRng = .Range("A1").CurrentRegion For i = 1 To myRng.Rows.Count myStrLine = "" For j = 1 To myRng.Columns.Count If j = 1 Then myStrLine = .Cells(i, j) Else myStrLine = myStrLine & "," & .Cells(i, j) End If Next j st.WriteText myStrLine, adWriteLine '内容を書き込む Next i End With st.SaveToFile myPath, adSaveCreateOverWrite 'ファイルに保存 st.Close 'Stream を閉じる Set st = Nothing Set myRng = Nothing End Sub |
実行結果(作成されたテキストファイル)
サンプルVBAソース 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
Sub Sample_ADOStream_Save2() '【参照設定】Microsoft ActiveX Data Objects 6.1 Library Dim st As ADODB.Stream Dim myPath As String Dim myStrLine As String Dim myBuf() As Byte Dim myRng As Range Dim i As Long Dim j As Long myPath = ThisWorkbook.path & "\test03.csv" Set st = New ADODB.Stream st.Open 'Stream を開く st.Type = adTypeText 'テキスト形式 st.Charset = "UTF-8" '文字コードの指定 With Worksheets("Sheet1") Set myRng = .Range("A1").CurrentRegion For i = 1 To myRng.Rows.Count myStrLine = "" For j = 1 To myRng.Columns.Count If j = 1 Then myStrLine = .Cells(i, j) Else myStrLine = myStrLine & "," & .Cells(i, j) End If Next j st.WriteText myStrLine, adWriteLine '内容を書き込む Next i End With With st .Position = 0 '位置を先頭に設定 .Type = adTypeBinary 'バイナリ形式に変更 .Position = 3 '位置を3バイト分移動 myBuf = .Read '内容を取得 .Position = 0 '位置を先頭に設定 .Write myBuf '内容を書き込む .SetEOS '位置を末尾に設定 .SaveToFile myPath, adSaveCreateOverWrite 'ファイルに保存 .Close 'Stream を閉じる End With Set st = Nothing Set myRng = Nothing End Sub |
実行結果(作成されたテキストファイル)
サンプルVBAソース 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
'-------------------------------------------------------------------------- ' BOMありなしをチェックする方法 ' ' 1.ファイルをバイナリ形式で読み込む ' 2.先頭3バイトを確認する ' → EF BB BF の場合は、BOMあり、そうでない場合は、BOMなし ' '-------------------------------------------------------------------------- Sub Sample_ADOStream_BOMCheck() '【参照設定】Microsoft ActiveX Data Objects 6.1 Library Dim st As ADODB.Stream Dim myPath As String Dim myByte() As Byte Dim strByte As String Dim v As Variant myPath = ThisWorkbook.path & "\test01.csv" Set st = New ADODB.Stream With st .Open 'Stream を開く .Type = adTypeBinary 'バイナリ形式 .LoadFromFile myPath 'ファイルの内容を読み込む myByte = .Read(3) '先頭から3バイトを取得 .Close 'Stream を閉じる End With For Each v In myByte strByte = strByte & Hex(v) Next If strByte = "EFBBBF" Then MsgBox "BOM あり" Else MsgBox "BOM なし" End If Set st = Nothing End Sub |
実行結果
関連記事
-
配列(多次元配列・配列の次元の変更)
多次元配列 【書式】 多次元配列の宣言 <静的配列(固定長配列)> Dim my …
-
メッセージボックスを表示(MsgBox関数)
MsgBox関数 【書式】 result = MsgBox ( Prompt [ …
-
日付時刻:日付から曜日を取得( Weekday 関数、WeekdayName 関数 )
Weekday 関数(日付から曜日を表す数値を返す)の使い方 【書式】 week …
-
フォント名(Name,ThemeFont,StandardFont)
フォント名を取得・設定する(Name プロパティ) Name プロパティは、オブ …
-
Option Compare ステートメント
Option Compare ステートメントの使い方 【書式】 Option C …
-
Join 関数(配列の要素を結合)
Join 関数 1次元配列の各要素を指定した区切り文字で連結します。 【書式】 …
-
指定した数のスペースを挿入する(Spc 関数)
指定した数のスペースを挿入 指定した数のスペースを挿入するには、Spc 関数を使 …
-
列挙型変数(Enum ステートメント)
列挙型変数を使う 列挙型変数を使用するには、Enum ステートメントを使って、宣 …
-
VBA の演算子(比較演算子)
比較演算子 比較演算子による演算の結果は「真」の場合は「True」、「偽」の場合 …
-
変数がオブジェクト型かどうかをチェックする( IsObject 関数 )
IsObject 関数の使い方 【書式】 result = IsObject ( …
- PREV
- 連想配列(Dictionary オブジェクト)
- NEXT
- Join 関数(配列の要素を結合)