<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でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
項目別に本音?それとも建て前?的な記事をまとめました。
気になったジャンル↓を選択してください。 |
Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]