#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 しかしこのステートメントの問題として、"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 そのようなときには、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 |
|||
|
Copyright © T'sWare All rights reserved |