[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.031 Excel97 VBA CRLF抜きの固定長ファイルを処理

Excel97 VBA CRLF抜きの固定長ファイルを処理


本文(発行内容)


<Excel97 VBA CRLF抜きの固定長ファイルを処理>
目次
1.はじめの挨拶
2.さて、どうしよう 
3.まず、読み込みだけ、作成しよう
4.依頼はCSV作成でしょ
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
なんか、毎晩の営業活動で疲れてます。

今回は、マジメに、プログラムやってみたいと思います。

簡単に消化可能な話題、、あったかなぁ、、
あっ、これ、やってみよう。。。
----
>特殊な固定長形式のデータ(1行になっていて、最
>後にEOFがきて終わりです。データファイル名:Test.txtを
>参照して下さい)を64バイトごとに
>区切るのはどうしたら良いでしょうか?また、このデータからダイレク
>トに社員番号(8桁)、漢字氏名(20桁)、ローマ字(24桁)、予
>備1(6桁)、予備2(6桁)のCSVデータにすることは可能でしょ
>うか?
>いやらしいことに、漢字氏名は全角と半角が混在しています。
----

なんとか、なるだろう、、たぶん。

/*
 * 2.さて、どうしよう
*/
送られてきた、サンプルデータを見ると、改行されてない、、
改行文字も無く、そのままデータが続いている、、、

さて、どうしよう

VBAでファイルを開いて、
64バイト読む、
それを分けよう、、、なんて、できるかな?

調べることは、
・バイト数指定で、ファイルから読み込めるか?
・EOFでとめるには?
これをファイル関係のヘルプから探す。

テメエが詳細をうまく解説してないだけで、
過去の講座で一部やってるダロ、
BMPファイルを読み込んで、ヘッダ情報から、サイズを取り出すヤツ。

あっ、そうか、あれを改造して、、、

/*
 * 3.まず、読み込みだけ、作成しよう
*/
作成プログラム
( hosoku/031/index.html )
'---- kotei.xls に保存されています。
Type TYPERecord              'ユーザー定義型を定義します。
    社員番号   As String * 8  '
    漢字氏名   As String * 20 '
    ローマ字   As String * 24
    yobi1     As String * 6
    yobi2     As String * 6
End Type

'メイン処理
Sub main()

    Dim nYLINE     As Integer
    Dim FNO%
    Dim Position   As Long
    Dim strREADBUF As TYPERecord

    FNO = FreeFile '空いているファイル番号を取る

    ' test.txt ファイルを ランダム アクセス モードで開きます。
    Open ActiveWorkbook.Path & "\test.txt" For Random Access Read As #FNO Len = 64

    '変数初期化
    n = 1                      ' レコード番号を定義します。
    nYLINE = 2 '見出しを抜かして、2行目から処理

    While EOF(FNO) = False
        ' Get ステートメントを使って、サンプル ファイルを読み込みます。
        Get #FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
        'テストなので、セルにセット、、
        Cells(nYLINE, 1).Value = strREADBUF.社員番号
        Cells(nYLINE, 2).Value = strREADBUF.漢字氏名
        Cells(nYLINE, 3).Value = strREADBUF.ローマ字
        Cells(nYLINE, 4).Value = strREADBUF.yobi1
        Cells(nYLINE, 5).Value = strREADBUF.yobi2
        'カウントアップ
        n = n + 1
        nYLINE = nYLINE + 1
    Wend

    Close #FNO                          ' ファイルを閉じます。

End Sub
----------
さて、解説しますと、
Type TYPERecord              'ユーザー定義型を定義します。
    社員番号   As String * 8  '
    漢字氏名   As String * 20 '
    ローマ字   As String * 24
    yobi1     As String * 6
    yobi2     As String * 6
End Type
ここで、フィールドをきります、、なんてカッコよく始めて、、

Type タイプ名
  変数(メンバー名) 変数タイプ
  変数(メンバー名) 変数タイプ
end type

を使用して、64バイトの新しいタイプ型を宣言します。

Dim strREADBUF As TYPERecord
と書き、TYPERecord型の変数、strREADBUFを定義します。

次に、ファイルを ランダム アクセス モードで開きます。
Open ActiveWorkbook.Path & "\test.txt" For Random Access Read As #FNO Len = 64
ここでは、kotei.xls と同じディレクトリに入っている、
test.txt を ランダムアクセスモード、レコード長64バイトで開きます。

ファイルが終わりに達しているかを判断するために、
EOF(ファイル番号)関数を使用します。
ここでは、ファイルが終わっていない間にしたいので、
While EOF(FNO) = False
と書きました。

While Not EOF(FNO) と書く人もいます。
うちのできる後輩達は、みんなNot EOF ですね。。。まっ、いっか。
*エンドオブファイルじゃないとき、、

' Get ステートメントを使って、サンプル ファイルを読み込みます。
Get #FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
これで、変数にファイルから読み込んだデータが入ります。

次がここでのポイント?
Cells(nYLINE, 1).Value = strREADBUF.社員番号
変数.メンバー名で値を代入する。。。

社員番号数値あたま0が取れちゃった、、まっ、いっか
じゃ、寝ようかな。おやすみなさい。







/*
 * 4.依頼はCSV作成でしょ
*/
依頼はCSV作成でしょ、、
あっ、、、改造したサンプルを書きに載せます
-----
'テキストファイル、OUT.TXTを作成
'test.txt --> out.txt
Sub MakeText()

    Dim nYLINE     As Integer
    Dim IN_FNO%, OUT_FNO%
    Dim Position   As Long
    Dim strREADBUF As TYPERecord

    IN_FNO = FreeFile '空いているファイル番号を取る
    
    ' test.txt ファイルを ランダム アクセス モードで開きます。
    Open ActiveWorkbook.Path & "\test.txt" For Random Access Read As #IN_FNO Len = 64
    
    '出力先 out.txt を シーケンシャル ライト モードで開きます
    OUT_FNO = FreeFile
    Open ActiveWorkbook.Path & "\out.txt" For Output As #OUT_FNO
    
    '変数初期化
    n = 1                      ' レコード番号を定義します。
    nYLINE = 2 '見出しを抜かして、2行目から処理
    
    While EOF(IN_FNO) = False
        ' Get ステートメントを使って、サンプル ファイルを読み込みます。
        Get #IN_FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
        '読み込まれたデータを書き込むCSVにする、、、
        'カンマだけ付ける””は好みで?
        Print #OUT_FNO, Trim(strREADBUF.社員番号) & ",";  '←セミコロンを付けると
        Print #OUT_FNO, Trim(strREADBUF.漢字氏名) & ",";  '改行されない
        Print #OUT_FNO, Trim(strREADBUF.ローマ字) & ",";  'ここがポイント
        Print #OUT_FNO, Trim(strREADBUF.yobi1) & ",";
        Print #OUT_FNO, Trim(strREADBUF.yobi2)       '最後は改行したいので付けない
        'カウントアップ
        n = n + 1
        nYLINE = nYLINE + 1
    Wend

    Close #IN_FNO                          ' ファイルを閉じます。
    Close #OUT_FNO

    '結果をメモ帳表示
    Shell "notepad.exe " & ActiveWorkbook.Path & "\out.txt", vbNormalFocus
    
End Sub
----

ポイントは、
Print #OUT_FNO, Trim(strREADBUF.社員番号) & ",";  
セミコロンを付けるとテキスト出力で改行されません、、、

テスト実行、、、
あれ、trimで囲っているのに、
漢字氏名だけ、スペースが取れない、、、
( hosoku/031/index.html#005 参照 )

/*
 * 5.終わりの挨拶
*/
今回は、少しは、まともな講座でした、、
積み残し、食べ残し、まだまだ、あるけど、、、

では、また。 三流PG Ken3でした。




ページフッター

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

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

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

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]