スキルの無い自分にとってCSVファイルをインポートして処理をすることは色々と課題が出てきます。
今回も、
ココがポイント
インポートでモタツキ、インポートしたCSVファイルの必要ないレコードに悩まされました
「インポート定義」が必要なの!?
インポートするCSVファイルを見ると、200フィールドを超える仕様となっており、まずは、インポートするテーブルの準備から始まった。
インポートするデータ型によってテーブルのフィールドの型を準備した方がいいのだろうが、200フィールドを超えるとなるとメンドクサイので、すべて「短いテキスト」にしてしまいました。
インポートしてから、必要なフィールドの型を変更すればいいや!っていう考えです。
そして
DoCmd.TransferText acImportDelim, "インポート定義", "テーブル", CSVファイルの場所, True
にて、インポートをするのですが、インポート定義を設定しないとインポートできませんでした。
https://pctips.jp/pc-soft/access-csv-import202001/
仕方なく、インポート定義を設定して、とりあえずインポートができるようにはなりましたが、先頭フィールドがおかしな感じにインポートされます。
準備したテーブルには、
ココに注意
オートナンバー型のIDフィールドを先頭に設置して、スキップするようにしていました
何かとテーブルには主キーを設定しておいた方が無難な事が多かったので、先頭フィールドにIDを設置する癖がありました。
この不可解な現象を避けることができなかったので、最終フィールドにIDを持っていきました。
オートナンバーにすると、1から採番されないので困ります。
テーブル削除して作り直すなんて言う事は200フィールド以上もあるので無理です。
リセットするVBAなども探してみましたが、適当な物が見つかりませんでした。
時間がある時に、探してみたいと思います。
結局、IDフィールドは削除することにしました。※主キー無状態。
ファイル指定してインポートするVBA
CSVファイルのあるフォルダを指定してファイルを選択した物が、フォーム上の非連結テキストボックス[Forms]![sg_import]![file]内にあります。
そのVBAコードは、下記のサイトを参考にしてください。
https://pctips.jp/pc-soft/access-csv-import202001/
下記のコードは、CSVファイルをインポートするVBAコードになります。
Private Sub upload_btn_Click() Dim cn As ADODB.Connection On Error GoTo Err_Handler If IsNull([Forms]![sg_import]![file]) Then MsgBox "アップロードするファイルが選択されていません。" Exit Sub End If 'アクションクエリ非表示設定 DoCmd.SetWarnings False Set cn = CurrentProject.Connection ' トランザクションの開始 cn.BeginTrans ' インポートテーブル内データ削除 DoCmd.RunSQL "DELETE * FROM job_sg_import" '=== CSVをテーブルにインポートする === 'ヘッダ有り DoCmd.TransferText acImportDelim, "sg_import", "job_sg_import", [Forms]![sg_import]![file], True ' トランザクションの終了 cn.CommitTrans cn.Close: Set cn = Nothing ExitErr_Handler: Call sakujo ' 先頭Nレコード削除 MsgBox "受注データのアップロードが完了しました。" Exit Sub Err_Handler: MsgBox "エラーが発生しました。変更を破棄して終了します。" cn.RollbackTrans cn.Close: Set cn = Nothing End Sub
上記のVBA内には、「Call sakujo」というサブルーチンを入れてあります。
インポートするだけなら、このサブルーチンは必要ありません。
CSVファイルの先頭Nレコードを削除
今回のCSVファイルは、先頭から4レコードまでが必要ありません
インポート時に、読み込ませない方法もあるようですが、自分の場合は、インポートしたテーブルから削除する方法で処理をすることにしました。
Sub sakujo() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim lngCount As Integer '変数にADOオブジェクトを代入 Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset 'レコードセットを取得 rs.Open "job_sg_import", cn, adOpenKeyset, adLockOptimistic lngCount = 1 '先頭4レコードを削除 Do Until lngCount >= 4 rs.Delete rs.MoveNext lngCount = lngCount + 1 Loop '終了処理 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
ココがポイント
VBAでCSVファイルを先頭からループさせて1レコードづつ削除
そして、指定回数に達したらループを抜けて終了させることで目的を達成しています。
この方法は、先頭からNレコード目を削除する時に便利な方法ですね。
3レコードだけ削除、lngCount=3として、IF文で処理をすれば可能になりますね。
ちょっと考えればできる方法ではありますが、自分の備忘録として残しておきたいと思います。