-
三流君の [コンビニ系HPへ] [VBA系HPへ] [ASP系HPへ] [愚痴系HPへ]

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

戻 る
サンプル→031.LZH 12KB をダウンロードして、見てください。
Excel97 VBA CRLF抜きの固定長ファイルを処理 kotei.xls が入っています


元データです

こんな感じで改行無し、、
TYPEでやると、ユーザー型がでる、、VBA賢い、、
実行結果
CSVファイルを作る
結果、、あれ、1行最後空行だ、、あと、Trimでスペース取れてない
<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.まず、読み込みだけ、作成しよう */ 作成プログラム '---- 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で囲っているのに、 漢字氏名だけ、スペースが取れない、、、 /* * 5.終わりの挨拶 */ 今回は、少しは、まともな講座でした、、 積み残し、食べ残し、まだまだ、あるけど、、、


質問や要望、クレームを送る(三流君に連絡する 連絡方法)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい

(感想や質問・要望・苦情はHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[
三流君連絡先]に連絡してください。

番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)

2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、

←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送


[三流君(TOP)]へ戻る。