今回やりたい事の内容
今回のやりたいことは、ヘッダー付き(1レコード目がフィールド名)の
ココがポイント
csvファイルを、テーブルにインポート
することです。
そして、ただ単にやるのではなく、
ココがポイント
ファイル選択ダイヤログを開いてインポートするファイルを選択
できるようにしてのインポート処理をしてみたいと思います。
メモ
前準備として、
dbo_uploadbox というインポートテーブルを準備して、
amazon-sample.txt というcsvファイルを準備しました。
ファイル選択ダイヤログの設置
インポートする時のファイル名が変わらないなら必要ないのですが、都度変わる場合などはファイル選択ダイヤログがあると便利ですよね。
Accessにてフォームを準備して、上の図のように、「ファイル選択」にコードにて、イベントプロシージャを作成しました。
プログラム内容は、ネットに沢山転がっていますので、拾ってきました。
Private Sub ファイル選択_btn_Click() On Error Resume Next '変数定義 Dim intRet As Integer 'ダイアログ用変数 Dim GetFileName As String 'フルパスの値 With Application.FileDialog(msoFileDialogOpen) 'ダイアログのタイトルを設定 .Title = "ファイルを開くダイアログ" 'ファイルの種類を設定 .Filters.Clear .Filters.Add "Microsoft Office Excelファイル", "*.csv,*.txt" .FilterIndex = 1 '複数ファイル選択を許可しない .AllowMultiSelect = False '初期パスを設定 .InitialFileName = CurrentProject.Path 'ダイアログを表示 intRet = .Show If intRet <> 0 Then 'ファイルが選択されたとき 'そのフルパスを返り値に設定 GetFileName = Trim(.SelectedItems.Item(1)) Else 'ファイルが選択されなければブランク GetFileName = "" End If End With '選択されたフルパスをテキストボックスへ表示 Form_order_upload.file.Value = GetFileName End Sub
.Filters.Add "Microsoft Office Excelファイル", "*.csv,*.txt"
この部分だけ、csvファイルに限定しましたので、「*.xlex」は省きました。
インポート定義とCSVファイルの注意点
VBAでいきなりインポートやろうとしても何かと難しい壁があります。
なので、いったん手動でテーブルにインポートができるか!?
それから、
ココがポイント
インポート定義を作成
した方が便利です。
メニューバー>>外部データ>>テキストファイル
と進むと、上のような画面がでてきますので、インポートしたいファイル名を選択して、「レコードのコピーを次のテーブルに追加する」にて、インポートしたいテーブル名を選択します。
OKして先に進むと、
理由は分かりませんが、コードページが「西ヨーロッパ」とかになっているので、「日本の(シフトJIS)」に変更しました。
また、その内容を、保存し、定義をクリックして、インポート定義名を確認します。
この手順でちゃんとテーブルにインポートできたことを確認してください。
手動で何かしらエラーが出てインポートができない場合は、VBAにしてもエラーがでます。
私の場合もエラーがでました。
ココに注意
CSVファイルがシフトJISじゃなかったのが原因
でした。
シフトJISで「文字コードして保存」をしてやったらインポートできました。
それでもダメな場合は、タブ区切りとか、カンマ区切りなどを確認した方が良いかもしれませんね。
インポートVBAを設置
あとは、「アップロード」ボタンに指定したテーブルにインポートするVBAを設置すれば完了です。
[code lang="js"] Private Sub upload_btn_Click() Dim cn As ADODB.Connection On Error GoTo Err_Handler If IsNull([Forms]![order_upload]![file]) Then MsgBox "アップロードするファイルが選択されていません。" Exit Sub End If Set cn = CurrentProject.Connection DoCmd.OpenForm "jobwait" DoEvents ' トランザクションの開始 cn.BeginTrans '=== CSVをテーブルにインポートする === 'ヘッダ有り DoCmd.TransferText acImportDelim, "amazon インポート定義", "dbo_uploadbox", [Forms]![order_upload]![file], True ' トランザクションの終了 cn.CommitTrans DoCmd.Close acForm, "jobwait" cn.Close: Set cn = Nothing MsgBox "受注データのアップロードが完了しました。" DoCmd.Close acForm, "order_upload", acSaveNo DoCmd.OpenForm "menu", acNormal, , , acFormEdit, acWindowNormal Exit Sub Err_Handler: DoCmd.Close acForm, "jobwait" MsgBox "エラーが発生しました。変更を破棄して終了します。" '変更を破棄し、トランザクション処理前の状態に戻す cn.RollbackTrans Set myCmd = Nothing cn.Close: Set cn = Nothing End Sub [/code]
とりあえず、アップロードが失敗した時の事を考えてトランザクション処理やエラー処理を付加しました。
また、もちろんファイルが選択されてない場合で「アップロード」ボタンを押されたら困りますので、メッセージを出すようにしました。
その中でも特にポイントがテーブルにインポートするために部分かと思います。
DoCmd.TransferText acImportDelim, "amazon インポート定義", "dbo_uploadbox", [Forms]![order_upload]![file], True
「amazon インポート定義」という部分が、手動でやった時の設定になります。
また、最後の「True」とすることで、ヘッダー有と判断して、レコードの1行目を省いてインポートしてくれるような流れになります。
インポートするCSVが変化したら再定義
本当は、インポートするCSVファイルのデータ数(フィールド数)が変化しても、dbo_uploadboxテーブルでは、80フィールドを確保しているので取り込めるようにしたかったのですが、その変化に対応できるような柔軟性がありません。
注意ポイント
インポートするフィールド数が変化したら、インポート定義を再設定することが必要
になるでしょうね。
ま、いろいろと苦労しましたが欲しい機能は準備できました。