パソコン情報

【Access】csvファイルを選択ダイヤログからテーブルにインポートする仕組み

今回やりたい事の内容

 

今回のやりたいことは、ヘッダー付き(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フィールドを確保しているので取り込めるようにしたかったのですが、その変化に対応できるような柔軟性がありません。

 

 

注意ポイント

インポートするフィールド数が変化したら、インポート定義を再設定することが必要

 

になるでしょうね。

 

ま、いろいろと苦労しましたが欲しい機能は準備できました。