スキルの無い自分にとって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文で処理をすれば可能になりますね。
ちょっと考えればできる方法ではありますが、自分の備忘録として残しておきたいと思います。