[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.103 あるファイルから指定した行数分データを抜き出す

あるファイルから指定した行数分データを抜き出す

メルマガ発行内容

<あるファイルから指定した行数分データを抜き出す>

どうも、三流プログラマーのKen3です。 今回は、 掲示板にあった質問、 >タイトル:csvファイルの指定した行の表示 で、 Dir関数、あとはファイルの空読みをやってみます。 たいした解説、回答内容じゃないのですが。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi で、下記の質問をもらいました。 ---- >タイトル:csvファイルの指定した行の表示 > >ホルダーの中にあるCSVファイルで特定のファイルすべての特定の行(数行)だけをエクセルのBOOKに一覧表示したい。 >10001001.1 >10001001.2 >10001001.3 >10001001.dat > . > . > . >上記のようなファイルで.datと付いたファイルすべての指定した行のみを >ファイルごとに一覧にしたいと思っていますが、出来るのでしょうか? ---- さてと、 該当ファイル名の規則は、*.dat あとは、特定の行を抜き出すのかぁ。

/* * 2.調べごと、下準備 */

まずは、該当ファイルを取り出さないとね。
Sub FileChk_test()

    Const strCHKPATH = "E:\Work\"  'データの保管場所
    Dim strFILENAME As String   'ファイル名格納用
    
    strFILENAME = Dir(strCHKPATH & "*.dat")  'ファイルのパスとパターンを渡す
    While strFILENAME <> ""  '空文字以外の間ループする
        MsgBox "取り出したファイル名[" & strFILENAME & "]"
        strFILENAME = Dir()  '引数無しでDir関数を呼び出すと次のファイル名を返す
    Wend

End Sub
と、Dir関数を使用して、該当データファイルを選別してみました。 ポイントは、 Dir(strCHKPATH & "*.dat") と、ワイルドカード付きでDir関数を呼ぶと、該当ファイル名を返します。 見つからない場合は""と空文字列を返してくれます。 引数無しで再度Dir関数を呼ぶと、次のファイル名を返してくれます。 で、無くなった時は、""と空白文字列を返します。 それを利用して、ループを作成してます。 No.3 Dir関数でファイルの存在をチェックする http://www.ken3.org/backno/backno_vba01.html#3 で作っている、ファイルリストの処理も参考にしてみてください。 次は、行を飛ばして、データを読まないとね。
Sub READ_DATA_TEST()

    Dim nFILENO       As Integer 'ファイル番号
    Dim strInFileName As String  '入力ファイル名
    Dim strBUFF       As String  'レコードを読みこむバッファ
    Dim n As Integer  'カウンター変数
    
    strInFileName = "e:\work\0001.dat" 'ファイル名を作る今は固定値だけど

    'ファイルの存在チェック
    If Dir(strInFileName) = "" Then
        MsgBox strInFileName & "が見つかりません"
        Exit Sub
    End If
    
    'ファイルを入力モードで開く
    nFILENO = FreeFile()  '空いているフィル番号を取り出す
    Open strInFileName For Input As #nFILENO  'ファイルを入力モードで開く
    
    '空読みする(行を読み飛ばす)
    For n = 1 To 4  'テストで4行読み飛ばす
        Line Input #nFILENO, strBUFF  '読み込むが何もしない
    Next n

    '数行読み込む
    For n = 1 To 3  'テストで3行読み込む
        Line Input #nFILENO, strBUFF  'バッファに読み込む
        MsgBox "読み込んだデータ" & strBUFF
    Next n
    
    'ファイルは閉じようね
    Close #nFILENO
    
End Sub
ただ、単に、 '空読みする(行を読み飛ばす) For n = 1 To 4 'テストで4行読み飛ばす Line Input #nFILENO, strBUFF '読み込むが何もしない Next n と、 空読みして飛ばした、ただけでした(笑) No.29 テキストファイル処理 ファイルからの読み込み http://www.ken3.org/backno/backno_vba06.html#29 で、テキストファイルの読み込み系、 No.33 FreeFile関数で空いてるファイル番号を返す方法 http://www.ken3.org/backno/backno_vba07.html#33 で、空いてるファイル番号を使う理由 上記2つも、あわせてみてください。

/* * 3.関数を組み合わせる(上位と下位の関数をまとめる) */

Sub FileChk_test()

    Const strCHKPATH = "E:\Work\"  'データの保管場所
    Dim strFILENAME As String   'ファイル名格納用
    
    strFILENAME = Dir(strCHKPATH & "*.dat")  'ファイルのパスとパターンを渡す
    While strFILENAME <> ""  '空文字以外の間ループする
        MsgBox "取り出したファイル名[" & strFILENAME & "]"
        strFILENAME = Dir()  '引数無しでDir関数を呼び出すと次のファイル名を返す
    Wend

End Sub
で ファイル名のループは出来ました。 テストプログラムで固定値だったけど、 e:\work\0001.dat から 4行読み飛ばして3行読み込めました。 必要なのは、 読み込むファイル名 読み込み開始行 読み込む行数 読み込み結果の格納場所ですね。 関数名 READ_DATA(strInFileName As String, _ nSTART As Integer, _ nREADCNT As Integer, _ strREADBUFF() As String) として、入力ファイル名strInFileNameと 読み込み開始行nSTART,読み込む行数nREADCNT データの格納先、strREADBUFFの文字列型の配列 をパラメータで受け取り、データをセットする関数を作ります。 (関数にします) ※ここから下2つで、目的の処理を実行してます。
Sub Main_test()

    Const strCHKPATH = "E:\Work\"  'データの保管場所
    Dim strFILENAME As String   'ファイル名格納用
    Dim strBOX(3)   As String   'データを格納するバッファ

    strFILENAME = Dir(strCHKPATH & "*.dat")  'ファイルのパスとパターンを渡す
    While strFILENAME <> ""  '空文字以外の間ループする
        
        'データを読み込むサブ関数を呼ぶ 5行目から3行読む
        Call READ_DATA(strCHKPATH & strFILENAME, 5, 3, strBOX())

        'strBOXにデータが読み込まれているので、それを利用した処理を書く
        MsgBox "strbox(0)" & strBOX(0)
        MsgBox "strbox(1)" & strBOX(1)
        MsgBox "strbox(2)" & strBOX(2)
  
        '次のファイル名を取り出す
        strFILENAME = Dir()  '引数無しでDir関数を呼び出すと次のファイル名を返す
    Wend

    MsgBox "処理終了"

End Sub
メインのルーチンでは、 該当ファイル名でループさせます。 ループの中で、データの読み込み関数を呼び、データを配列に保存、 その配列を使用した処理を書き、 次のファイル名に移る。 データ読み込み、セット側では、 ファイルを開き、 データの頭だし(空読みして、行を飛ばす) 必要数分データを読み込み、配列にセット。 ファイルを閉じる。
Sub READ_DATA(strInFileName As String, _
                     nSTART As Integer, _
                   nREADCNT As Integer, _
              strREADBUFF() As String)

    Dim strBUFF As String    'データ読み込み用のバッファ
    Dim nFILENO       As Integer 'ファイル番号
    Dim n As Integer  'カウンター変数
    Dim nSETCNT As Integer
    
    'ファイルを入力モードで開く
    nFILENO = FreeFile()  '空いているフィル番号を取り出す
    Open strInFileName For Input As #nFILENO  'ファイルを入力モードで開く
    
    '空読みする(行を読み飛ばす)
    For n = 1 To nSTART - 1  '開始行数の1つ前まで空読みする
        If EOF(nFILENO) = True Then Exit For '途中でファイルが終わっていたか?
        Line Input #nFILENO, strBUFF  '読み込むが何もしない
    Next n

    '数行分読み込み、バッファにセットする
    nSETCNT = 0
    For n = 1 To nREADCNT    '読み込み行数分ループで読み込む
        If EOF(nFILENO) = True Then Exit For '途中でファイルが終わっていたか?
        Line Input #nFILENO, strBUFF    'バッファに読み込む
        strREADBUFF(nSETCNT) = strBUFF  'データをn番目にセット
        nSETCNT = nSETCNT + 1  'セット位置を+1する
    Next n
    
    'ファイルは閉じようね
    Close #nFILENO
    
End Sub
といった、2構成に分けてみました。

/* * 4.終わりの挨拶 */

今回は、 指定ファイルから指定行数抜き出して処理してみました。 カッコよくて面白い人を探せ・・(かわいくて、素直な子を探せ) と一度に考えると、大変なので、 まずは、指定ファイルの処理をテストして、次に指定行数の抜き出し、 その二つを引数で必要なデータを渡し、つなげてみました。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]