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