- ベストアンサー
VBAでテキストファイルのデータを1つずつ読みたい
VBでなくVBAなのですが、以下のようなテキストファイルの1,2行目は行単位で、4行目以降は1データずつ読みたいのですが、自分の知識では'Line'を使用しての行単位での読み込みしかできません。方法があれば教えて頂きたく存じます。 DATE 03/03/21 TIME 09:44:21 (空行) 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 ・ ・ ・ このような感じです。よろしくお願い致します。あと、VBAのファイル操作の詳しい解説書なども教えて頂けるとなお助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Option Explicit Private Const DEF_TEST_FILE As String = "c:\test.txt" Private Const DEF_LINE_INDEX_DATE As Integer = 1 '1行目が日付 Private Const DEF_LINE_INDEX_TIME As Integer = 2 '2行目が時間 Private Const DEF_LINE_INDEX_DATA As Integer = 4 '4行目以降がデータ Private Const DEF_DATA_AREA As Integer = 4 '1データの領域を4文字とする Private Const DEF_DATA_COUNT As Integer = 5 '1列のデータには、5データ存在する Sub Main() Dim intFile As Integer 'ファイルオープン用ファイル番号 Dim lngLen As Long 'ファイルバイトサイズ Dim strBuff As String 'テキストバッファ Dim lngUBound As Long '配列要素数 Dim varLineData As Variant '全データを改行コードでの配列として格納 Dim i As Long 'データ列ループカウンタ Dim j As Integer 'データ列内、各データループカウンタ 'ファイルサイズ取得 lngLen = FileLen(DEF_TEST_FILE) '文字領域確保 strBuff = String(lngLen, vbNullChar) 'ファイルをオープンして、全データ取得 intFile = FreeFile Open DEF_TEST_FILE For Binary Access Read As #intFile Get intFile, , strBuff Close #intFile '改行分割 varLineData = Split(strBuff, vbCrLf) '配列要素数取得 lngUBound = UBound(varLineData) '// 情報出力 // 'ヘッダ情報 Debug.Print "日付:" & varLineData(DEF_LINE_INDEX_DATE - 1) Debug.Print "時間:" & varLineData(DEF_LINE_INDEX_TIME - 1) '値情報 For i = (DEF_LINE_INDEX_DATA - 1) To lngUBound For j = 1 To (DEF_DATA_COUNT * DEF_DATA_AREA) Step DEF_DATA_AREA Debug.Print Trim$(Mid$(varLineData(i), j, DEF_DATA_AREA)) Next j Next i End Sub
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
下記コードで、確認のためMSGBOXを入れていますが、本来の処理したいルーチンで置換えてください。 質問のデータでDate、Timeと10から150 まで表示されるのを確認しました。区切り文字ですが、 1半角スペースにメモ帳で修正して、ファイル保存して 実行しました。この点実際のファイルがどうなっているか 微妙です。 FORループで0から4は項目数で変えてください。 下記コードは旧Basic式ですが、他にもあると思います。Split関数はE2000以後ぐらいから使えると 思います。なければINSTR関数で区切り文字の位置を 割り出す処理になります(略)。 Sub test01() Open "c:\my documents\tt2.txt" For Input As #1 Line Input #1, a MsgBox a 'すべき処理ルーチンを入れる Line Input #1, a MsgBox a 'すべき処理ルーチンを入れる Line Input #1, a While Not EOF(1) Line Input #1, a b = Split(a, " ") For i = 0 To 4 MsgBox b(i) 'すべき処理ルーチンを入れる Next i Wend Close #1 End Sub
お礼
早速のご回答ありがとうございました。 私の説明が不足してしまい失礼いたしました。当方Excel2002ですので、教えて頂いたソースを実行しましたところ正常に動作、Split関数は使用可能でした。またデータですが、実際は1~999までの数字が入り乱れて 10 248 645 9 86 232 45 778 99 100 0 222 76 412 9 ・ ・ ・ のような感じで1の位が揃っている状態にあります。ですので、3桁同士の数字が隣り合っている場合は1半角スペース間隔ですが、1桁や2桁の数字が来た場合に右隣のデータとの間隔が変化してしまう難点があります。でも、行単位で読み込んだデータをSplitで区分けできる方法を教えて頂いただけでも十分勉強になりました。ありがとうございました。
お礼
す、すごいです。まさに期待していた通りの完璧の動作をしました。専門の知識を惜しげもなく披露して頂き誠に恐縮です。ただ、私の方がまだかなりの勉強不足でソースを理解し切れていないので、なるべく早く教本を入手して理解したいと思います。本当にありがとうございました。