[三流君] −−> [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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.103を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・