Accessのノウハウ(フォーム上でのインポート設定)

ファイルのインポート・エキスポートをフォーム上で実行する

こんな感じのものを作ります。
前回取り込んだパスを入れておけるので、直す箇所が最小限ですみます。

 

 

 

 

インポートの作成手順は以下の通りです。

1.どんなフォームを作るか考える

(テキストボックス(取り込みパス)やボタンの数を考えておく)

2.フォームとテーブルの設計

①フォームのレコードソースになるテーブルを作る
(今回は「T_format」としました)
T_formatのフィールド名やデータ型を設定
②テーブルにインポートパス名を入力
③フォーム作成
取り込み用のテキストボックスやボタンを作る

3.必要なファイルをいったん取り込んでみる

ウィザードを使ってインポートする。
CSV等のテキストファイルは、取り込み時に、インポート定義を保存する

4.取り込み後のテーブルは 「T_workなんちゃら」にする

いったんワークファイルに取り込む

5.上記「T_work…」を使って、正式なテーブルに取り込む

正式なテーブルには、追加クエリで追加する。
※蓄積型で無いテーブルなら、追加クエリの前に削除クエリでいったん空にする。

※通常は、インポートしたテーブルを使って、そのまま定例処理を実施しない方が良いです。
なぜなら、テーブルのフォーマットが変わったり、
データの不具合があったりして、テーブルが取り込めなかったときに、定例処理に影響が出る可能性があるからです。
ですから、ワークテーブルにいったん取り込むのです。

6.最終的には、以下の流れになります。

①ワークテーブルのデータ削除(削除クエリ)
②データインポート(CSVまたはExcelファイル)
CSVの時はインポート定義を使うと便利(インポート定義を使わなくても動きます)
③正式なテーブルに取り込む(削除クエリ+追加クエリ)
(正式:その後の処理…クエリ等を組み込んでいるテーブル)

7.上記の流れをフォーム(フォームモジュール)に書き込む

■フォームのテキストボックスの入力チェック・ファイルの存在チェック等。
■ワーニングをFalseにしたり、Trueに戻したり。

※2020/9/8補足 上記のうち、Excelインポートで False(ヘッダーなし)で書いてましたが、
一般的にはTrue(ヘッダーあり)ですね。紛らわしくてスミマセン。

 

8.一度にインポートする

「複数のテキストボックスを入力して、全てを一度にインポートするボタン」を作る場合は、注意が必要です。

モジュールを書くときには、ボタンを押した「直後」に
「テキストボックスの入力チェック「入力ファイルパスの存在チェック」を済ませるようにして下さい。

たまに、「一個処理する毎にファイルの存在チェックをしている」という大変悲しいフォームを見ることもあります。
→30分かかってインポートして、最後のファイルのインポート時に「ファイルが存在しません」でコケるわけです。

たまにベンダーの方が作ったものでも見ることはありますので、
依頼するときは、「失礼ながら、まず全てのファイルの存在チェックをしていますよね」と念のため確認するのがお勧めです。

9.整備

フォームの見た目を整えたり、テーブルで次のデータに進まないようにする。

10.Mainフォームへの遷移ボタンを作ったりする。

11.その他便利ハック

ちなみに、インポート定義のファイル名等は、以下のようにすると確認できます。
①ナビゲーションオプションを開いて、「システムオブジェクトの表示」にチェックを入れる。

 

②MSysIMEXSpecs で、どんなインポート定義ファイルがあるか確認できる。
またMSysIMEXColumnsフィールド名等も確認できる。

12.一応コード貼っておきますね。

2020/9/8補足 Excelインポートで False(ヘッダーなし)で書いてましたが、
一般的にはTrue(ヘッダーあり)なので訂正しておきます。

Private Sub cmd_import_Click()
    Dim myDirFN As String
    Dim myFN As String
    
    myFN = "T_work明細"
     
    If IsNull(Me.txt_Import) Then
        MsgBox "フォルダパスを入力してください"
        Exit Sub
    End If

    myDirFN = Me.txt_Import
    
    If Dir(myDirFN) = "" Then
        MsgBox "ファイルが見つかりません"
        Me.txt_Import.SetFocus
        Exit Sub
    End If
    
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "Q_001_import明細_削除"
    
    'CSVデータのインポートの時
    DoCmd.TransferText acImportDelim, "MEISAIインポート定義", myFN, myDirFN, False
    
    'xlsxのインポートの時
    'DoCmd.TransferSpreadsheet acImport, , myFN, myDirFN, True
    
    DoCmd.OpenQuery "Q_101_明細_削除"
    DoCmd.OpenQuery "Q_102_明細_追加"
    MsgBox ("import終了")
    
    DoCmd.SetWarnings True
    
End Sub