• ベストアンサー

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のファイル操作の詳しい解説書なども教えて頂けるとなお助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.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

maxyamabiko116
質問者

お礼

す、すごいです。まさに期待していた通りの完璧の動作をしました。専門の知識を惜しげもなく披露して頂き誠に恐縮です。ただ、私の方がまだかなりの勉強不足でソースを理解し切れていないので、なるべく早く教本を入手して理解したいと思います。本当にありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

下記コードで、確認のため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

maxyamabiko116
質問者

お礼

早速のご回答ありがとうございました。 私の説明が不足してしまい失礼いたしました。当方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で区分けできる方法を教えて頂いただけでも十分勉強になりました。ありがとうございました。

関連するQ&A

専門家に質問してみよう