パソコン情報

【Access】CSVファイルの先頭Nレコードを削除するVBAコード

スキルの無い自分にとって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文で処理をすれば可能になりますね。

 

ちょっと考えればできる方法ではありますが、自分の備忘録として残しておきたいと思います。