こんにちは、Ryoです。
用途によってテキストファイルをVBAで操作したいこともあるかと思いますので、今回はExcelシート上のデータをテキストファイルに書き込む(カンマ区切り)方法と、その書込んだテキストファイルを読み込んで変換し、新規ブックとして開く方法について書いていきます。
1.サンプル概要、サンプルコード
◆Sample1:テキストファイルへの書込み(カンマ区切り)
サンプルとして以下画像に示す表があるとします。
この内容を指定したテキストファイルへ書込みを行うことで、以下の様に実行されます。
≪ Sample1:サンプルコード ≫
Sub Sample1() 'カンマ区切りでテキストファイルへ書込み Dim FileNm As Integer Dim LastRow As Long Dim i As Long Worksheets("Sample1").Activate 'セルA1を含む領域を取得して最終行の取得 LastRow = Cells(1, 1).CurrentRegion.Rows.Count '使用可能なファイル番号を取得 FileNm = FreeFile '指定したテキストファイルを開き、ファイル番号を指定 Open "D:\デスクトップ\write_Sample1.txt" For Output As #FileNm '全行数分の繰り返し処理を行う For i = 1 To LastRow '指定したテキストファイルに各行の1~5列のセルデータを書き込む Write #FileNm, Cells(i, 1).Value, Cells(i, 2).Value, _ Cells(i, 3).Value, Cells(i, 4).Value, Cells(i, 5).Value Next i 'ファイルを閉じ、ファイル番号の解放を行う Close #FileNm End Sub
本サンプルのようなカンマ区切りでテキストファイルに書き込む場合は、Write #ステートメントを使用します。
Write #FileNumber , Outputlist
このWrite #ステートメントはOpenステートメント(後述)によって開かれたテキストデータに書込むものです。この書き込まれたデータは「”(ダブルクォーテーション)」で囲まれ、データ間は「,(カンマ)」区切りとなります。
FileNumber・・・Openステートメントで割り当てたファイル番号(#Filenm変数)
Outputlist・・・テキストファイルに書き込むデータの指定で、複数指定する場合はカンマで区切って指定します。(Cells(i,1)~Cells(i,5)がデータ)
Write #FileNm, Cells(i, 1).Value, Cells(i, 2).Value, Cells(i, 3).Value, _
Cells(i, 4).Value, Cells(i, 5).Value
そしてOpenステートメントについてですが、簡潔に言いますとテキストファイルの入出力をパソコン内部で行う為に使用するものです。
Open フルパス For モード As #Filenumber
フルパスの部分は”(ダブルクォーテーション)で囲んで指定し、モードは書込みの場合Outputを指定します。Filenumberは開いたファイルへ番号を割り当てます。
FileNm = FreeFile ’ここで使用可能なファイル番号を取得
Open “D:\デスクトップ\write_Sample1.txt” For Output As #FileNm
後は構文に従ってパス指定とモード選択、取得したファイル番号を割り当てます。
本サンプルではDドライブのデスクトップ上にある「write_Sample1.txt」というファイルへ書込みを行う例としているので、パスやテキス名などは適宜用途に応じて変更が必要です。
◆Sample2:テキストファイルからデータ取得、開く
次に先程出力したテキストデータは以下の通りですが、これを読み込んでExcelの新ブックで開きます。
このテキストデータに対しサンプルコードを実行すると以下の通りになります。
≪ Sample2:サンプルコード ≫
Sub Sample2() 'テキストファイルから列単位でデータ取得し新ブックで開く Workbooks.OpenText Filename:="D:\デスクトップ\write_Sample1.txt", _ DataType:=xlDelimited, TextQualifier:=xlTextQualifierDoubleQuote, _ Comma:=True, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), _ Array(4, 1), Array(5, 1)) End Sub
テキストファイルを開くにはOpenTextメソッドを使います。この構文自体はやたらと長いのですが書きますと、
オブジェクト.
OpenText(FileName,Origin,StartRow,DataType,TextQualifier,
ConsecutiveDelimiter,Tab,Semicolon,Comma,Space,Other,
OtherChar,FieldInfo,TextVisualLayout,DecimalSeparator,
ThousandsSeparator,TrailingMinusNumbers,Local)
羅列すると何のことやら状態ですが、以下の表に内容を簡単に書いています。
サンプルコードでもそうですが、全てを指定する必要もないので実使用上はそれほど面倒ということもないのでご安心?ください。
項目 | 内容 |
FileName | パスを含むテキストファイルを”で囲んで指定 |
Origin | 省略可 xlMacintosh マッキントッシュ xlWindows ウィンドウズ xlMSDOS MS-DOS |
StartRow | 省略可、読み込み開始行位置 |
DataType | 省略可(規定はxlDelimited) xlDelimited タブやカンマ区切り xlFixedWidth 固定長フィールド形式 |
TextQualifier | 省略可(規定はxlTextQualifierDoubleQuote) xlTextQualifierDoubleQuote 引用符 ” xlTextQualifierSingleQuote 引用符 ’ xlTextQualifierNone 引用符なし |
ConsecutiveDelimiter | 省略可(規定はFalse) 連続した区切り文字を1文字としたい場合True |
Tab | 省略可(規定はFalse) 区切り文字が「タブ」の場合にTrue |
Semicolon | 省略可(規定はFalse) 区切り文字が「セミコロン」の場合にTrue |
Comma | 省略可(規定はFalse) 区切り文字が「カンマ」の場合にTrue |
Space | 省略可(規定はFalse) 区切り文字が「スペース」の場合にTrue |
Other | 省略可(規定はFalse) 区切り文字が上述以外の場合にTrue |
OtherChar | 省略可、引数OtherがTrueの場合に区切り文字を指定 |
FieldInfo | 変換するデータ形式をArray関数を使い指定 固定長フィールド形式以外は省略可 |
TextVisualLayout | 省略可、テキストの視覚的な配置指定 |
DecimalSeparator | 省略可、数値の小数点記号を指定 |
ThousandsSeparator | 省略可、数値の区切り記号を指定 |
TrailingMinusNumbers | 省略可(規定はFalse) 末尾に負の符号が付いているデータを負の数として扱うならTrue、文字列ならFalse |
Local | 省略可(規定はFalse) [形式のオプション]ダイアログ設定参照を使用する場合にTrue |
ほぼ省略も可能ですので、サンプルコードで使用しているのは以下5つのみです。
Filename:=”D:\デスクトップ\write_Sample1.txt”
DataType:=xlDelimited
TextQualifier:=xlTextQualifierDoubleQuote
Comma:=True
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1))
この中でテキストファイルを読み込む際に指定するデータはArray関数を使用します。
サンプルにあるようにArray(1, 1)の赤字部分でデータ形式を指定します。
定数 | 数値 | 変換形式 |
xlGeneralFormat | 1 | 標準 |
xlTextFormat | 2 | 文字列 |
xlMDYFormat | 3 | MDY(月日年)形式 |
xlDMYFormat | 4 | DMY(日月年)形式 |
xlYMDFormat | 5 | YMD(年月日)形式 |
xlMYDFormat | 6 | MYD(月年日)形式 |
xlDYMFormat | 7 | DYM(日年月)形式 |
xlYDMFormat | 8 | YDM(年日月)形式 |
xlSkipColumn | 9 | スキップ列 |
xlEMDFormat | 10 | EMD(台湾年月日)形式 |
今回のサンプルでは全て標準で取り込んでいるので「1」を指定していますが、文字列としたければ「2」、読み込みたくないデータは「9」を指定すればOKです。
2.まとめ
テキストファイルとしての出力や読み込みの基本的な流れについては、サンプルに示した感じが元になるかなと思いますので、知っておくとテキストファイルを活用出来る機会もあるのではないでしょうか。
構文だけみると一見複雑そうですが、実使用で考えるとそれほどでもないので、機会があればぜひご検討くださいませ!
以上、テキストファイルへの書込みや開く作業を行う方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo