アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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
    • good
    • 1
この回答へのお礼

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

お礼日時:2004/03/22 20:37

下記コードで、確認のため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
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/03/21 13:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!