Access:ネットワーク越しにファイルをインポートする際の注意点 - 中小企業のITサポート

Access:ネットワーク越しにファイルをインポートする際の注意点

はじめに

Accessのマクロを使用してネットワーク越しにファイルを直接参照してインポートする場合、処理が正常に完了していないにもかかわらず、エラーとして検知されないケースがあります。

このような問題を未然に防ぐためには、ネットワーク上のファイルを直接参照するのではなく、一度ローカルにコピーしてからインポートする方法が推奨されます。本記事では、AccessVBAを活用してローカルにコピーを行い、安全にデータを取り込む手順を解説します。

最近、ネットワーク越しにファイルを直接参照してインポートする際、いつもより処理時間が長かったり、インポート先のテーブルにデータが取り込まれていない事象に遭遇しました。この問題は、インポート処理のみ別の手順に分けることで解決しましたが、根本的な原因は不明のままです。

このようなトラブルを防ぐためにも、ネットワーク越しではなく、ローカルにファイルをコピーしてからインポートする手法を強くお勧めします。処理を分割することでエラー処理が容易になり、エラー発生時の原因調査も行いやすくなります。

1. ネットワーク越しにファイルをインポートする場合の問題点

発生する可能性がある問題点は以下です

1.1. ファイルロックの問題

複数のユーザーが同時にネットワーク上のファイルにアクセスすると、ファイルがロックされてしまうことがあります。この状態では、インポート処理ができない(中断される)か、意図したデータを正しく取得できない可能性があります。

1.2. ネットワーク接続の不安定さ

ネットワーク環境が不安定な場合、一時的な接続切断や遅延が発生する可能性があります。その結果、インポート処理が中断されたり、データが欠落することがあります。

1.3. エラーの検知難易度

ネットワーク越しのインポートでは、処理が中断されてもAccessのマクロやVBAでエラーが正しく検知されない場合があります(単純にエラーハンドリングが正しく行えていないだけの場合もあります)。このような場合、エラーの原因を特定するのが難しく、原因調査に時間がかかることがあります。

2. 解決策:ローカルにコピーしてからインポートする

2.1 ローカルにコピーする利点

ネットワーク越しのインポートは、エラー発生のリスクが高いため、ファイルをローカルにコピーしてからインポートすることで、安定した処理が可能になります。ローカル環境ではネットワークの遅延や切断の影響を受けず、処理のスピードと正確性が向上します。

2.2 VBAでファイルをローカルにコピーする方法

以下は、ネットワーク上のファイルをローカル環境にコピーするVBAのコードです。

Sub CopyFile()
    Dim SourcePath As String
    Dim DestinationPath As String

    SourcePath = "\\Server\Share\FileName.csv" ' ネットワーク上のファイルパス
    DestinationPath = "C:\Temp\FileName.csv"  ' コピー先のローカルパス

    On Error Resume Next
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    FSO.CopyFile SourcePath, DestinationPath, True

    If Err.Number <> 0 Then
        MsgBox "ファイルコピーに失敗しました: " & Err.Description
        Err.Clear
    Else
        MsgBox "ファイルコピーが完了しました"
    End If
End Sub

2.3 VBAでローカルのファイルをインポートする方法

次に、ローカルにコピーしたファイルをインポートするVBAのコードです。

Sub ImportTextFile()
    On Error GoTo ErrorHandler

    ' --- 設定する変数 ---
    Dim FilePath As String          ' インポートするファイルのパス
    Dim TableName As String         ' インポート先のテーブル名
    Dim ImportSpecName As String    ' インポート仕様の名前

    ' --- パラメータ設定 ---
    FilePath = "C:\Temp\FileName.csv"  ' インポートするファイルの絶対パス
    TableName = "ImportedData"         ' データを格納するテーブル名
    ImportSpecName = "MyImportSpec"    ' 事前に作成したインポート仕様の名前

    ' --- インポート処理 ---
    DoCmd.TransferText acImportDelim, ImportSpecName, TableName, FilePath, True
    MsgBox "ファイルのインポートが完了しました。テーブル名: " & TableName

    Exit Sub

ErrorHandler:
    ' --- エラー処理 ---
    MsgBox "エラーが発生しました: " & Err.Description
    Err.Clear
End Sub

DoCmd.TransferText の補足説明
- DoCmd.TransferText:テキストファイルをAccessにインポートします。
- acImportDelim:区切り文字付きファイル(CSVやタブ区切り)をインポートします。
- ImportSpecName:ファイルの構造(フィールドの区切り方やデータ型など)を定義したインポート定義の名前です。事前にAccessのインポートウィザードを使用して、ファイルのフォーマットに応じたインポート定義を作成し、保存しておく必要があります。
- TableName:インポート先のテーブル名です。
- FilePath:インポートするファイルのパスです。
- True:ヘッダー行がある場合に指定します。

まとめ

ネットワーク越しのファイルをインポートする際のリスクを回避するためには、ローカルにファイルをコピーしてからインポートする方法が有効です。本記事で紹介したVBAコードを活用すれば、安全なインポート処理を実現できます。一度ローカルにコピーすることで、エラー原因の調査も容易になりますので、ぜひ取り入れてみてください。

他にもVBAに関する記事を書いていますので参考にしてみてください

reisaikigyo.hatenablog.com

reisaikigyo.hatenablog.com

reisaikigyo.hatenablog.com