#094 ユーザー定義型による固定長テキストファイルの読み込み VBA

固定長のテキストファイルは、もしテーブルとしてインポートするのであれば"Docmd.TransferText"を使いかつ引数に「インポート定義(注)」を指定することで読み込むことができます。しかし、1件読み込むごとにデータを加工しながらテーブルに書き込むような場合には"Docmd.TransferText"は使えません。そのような場合にはVBAで直接テキストファイルを開いて読み込むことになりますが、そのとき、ユーザー定義型の変数を使うとインポート定義に似た設定が一括して行えますので、後でデータを加工する際のフィールドの認識が非常に簡単になります。
※「インポート定義」:手動によるインポート操作では、固定長テキストファイルに対してフィールドとして区切る位置や、テーブルに保存する際の各フィールド名やデータ型を指定しますが、インポート定義はその設定情報を保存したものです。

●ユーザー定義型を用いない場合
Dim strSyain As String
  
Open "社員マスター.txt" For Input As #1
Do Until EOF(1)
  Line Input #1, strSyain
  strSyain = StrConv(strSyain, vbFromUnicode)
  '社員番号
  Debug.Print StrConv(MidB$(strSyain, 1, 3), vbUnicode)
  '氏名
  Debug.Print StrConv(MidB$(strSyain, 4, 15), vbUnicode)
  'カタカナ
  Debug.Print StrConv(MidB$(strSyain, 19, 15), vbUnicode)
  '電話番号
  Debug.Print StrConv(MidB$(strSyain, 34, 13), vbUnicode)
Loop
Close #1
員マスター.txtでは「氏名」は漢字で入力されています。そのためMid$でフィールドを区切ると、漢字の文字数とバイト数にずれが生じてしまいます。そのためここではStrConv関数を使ってUnicodeからの変換をを行ってから文字位置をカウントするようにしています。すべて半角で構成されている場合には、その心配はありません。


●ユーザー定義型を用いた場合
Type tEmplyee 'ここで各フィールドサイズを設定します
  Number As String * 3
  Name As String * 15
  Katakana As String * 15
  TEL As String * 13
  CRLF As String * 2  '改行も1つのフィールドとして扱います
End Type
※このユーザー定義型の宣言は、標準モジュールまたはフォームなどのモジュールの"Declarations"セクションで行います。フォームなどに宣言する場合にはPrivate Type tEmplyeeのように"Private"を付けます。
Dim tShain As tEmplyee

Open "d:\tmp\社員マスター.txt" For Random As #1 Len = Len(tShain)
Do Until EOF(1)
  Get #1, , tShain
  With tShain
    Debug.Print .Number    '社員番号
    Debug.Print .Name      '氏名
    Debug.Print .Katakana  'カタカナ
    Debug.Print .TEL       '電話番号
  End With
Loop
Close #1

ご覧のように、最初にユーザー定義型で各フィールドサイズを設定しておけば、実際に読み込んだあとは全角/半角も意識することもなく、簡単にフィールドのデータを取得することができます。
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします
 

Copyright © T'sWare All rights reserved