#366 カンマ区切りの文字列から配列データを形成する方法 VBA

CSVファイル(カンマ区切り記号付きテキストファイル)からデータを読み込む場合、一つの方法として、「Input # ステートメント」を使う方法があります。この方法を使えば、カンマで区切られたデータを自動的に切り出して、それぞれのデータを変数に代入することができます。カンマという文字自体を意識してそれを除外するようなコードは必要ありません。
■Input # ステートメントの例

  Dim lngFileNum As Long
  Dim strData As String

  lngFileNum = FreeFile()
  Open "c:\test\社員.CSV" For Input As #lngFileNum
  Do Until EOF(lngFileNum)
    Input #lngFileNum, strData
    Debug.Print strData
  Loop
  Close #lngFileNum
Input # ステートメントの実行結果

しかしこのステートメントの問題として、"1レコード分の終端を検知できない"という点が挙げられます。そこで、その対応として「Line Input # ステートメント」を使うことになりますが、この場合はカンマという文字も含めて1レコード分が読み込まれるため、その後処理としてカンマごとにデータを切り出すという文字列処理が必要となってきます。
■Line Input # ステートメントの例

  Dim lngFileNum As Long
  Dim strData As String

  lngFileNum = FreeFile()
  Open "c:\test\社員.CSV" For Input As #lngFileNum
  Do Until EOF(lngFileNum)
    Line Input #lngFileNum, strData
    Debug.Print strData
  Loop
  Close #lngFileNum
Line Input # ステートメントの実行結果

そのようなときには、VBAの組み込み関数である「Split関数」が便利です。この関数では、カンマを含む一連の文字列をカンマで区切って、それぞれの要素(データ)を配列に格納してくれます。配列の添え字1つ1つがフィールドに対応することになりますので、それを処理することによって、フィールド単位でのデータの取り扱いが可能となります。

次のサンプルコードでは、「社員.CSV」ファイルから1行ずつ(CRLFが現れるまで)をループで読み込み、Split関数で一括してカンマごとにデータを配列に代入、それぞれの値を「社員」テーブルの対応するフィールドに追加していきます。

なおここで、Split関数の返り値を代入する配列を宣言する際には「Dim strData(12) As String」のような表記ではなく、次のように、"カッコなし"のVariant型の変数として宣言することに注意してください。

Public Sub SplitTest()

  Dim dbs As Database
  Dim rst As Recordset
  Dim varData As Variant
  Dim lngFileNum As Long
  Dim strData As String

  '入力元CSVファイルを開く
  lngFileNum = FreeFile()
  Open "c:\test\社員.CSV" For Input As #lngFileNum

  'テーブルを開く
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset("社員")

  'CSVファイルの全レコードを読み込むループ
  Do Until EOF(lngFileNum)
    'CSVファイルより1件分を読み込み
    Line Input #lngFileNum, strData
    'カンマで区切って配列に代入
    varData = Split(strData, ",", , vbTextCompare)
    '各フィールドデータをテーブルに追加
    With rst
      .AddNew
        !社員コード = varData(0)
        !フリガナ = varData(1)
        !氏名 = varData(2)
        !在籍支社 = varData(3)
        !部署名 = varData(4)
        !誕生日 = varData(5)
        !入社日 = varData(6)
        !自宅郵便番号 = varData(7)
        !自宅都道府県 = varData(8)
        !自宅住所1 = varData(9)
        !自宅住所2 = varData(10)
        !自宅電話番号 = varData(11)
      .Update
    End With
  Loop

  rst.Close
  Close #lngFileNum

End Sub

| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved