Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
更新SQL 早く処理するには
投稿日時: 17/04/29 21:28:52
投稿者: TOM57

VBAにてフォルダ内のファイルをインポートして、そのファイル名をSQLを実行して 
テーブル更新するようにしたのですが、ファイル数が多いのでインポートするだけで 
10分ぐらいはかかるのですが、ファイル名を更新させるSQLを追加すると何時間もかかって 
しまうのですが、処理を早くするにはどうしたらいいでしょうか。 
(全てインポートすると100ファイル以上、最終インポート後データ件数 30万件)
 
よろしくお願いします。 
 
 
    StrSQL = "UPDATE テーブル1 SET NAME = '" & impFile & "' WHERE NAME Is Null" 
         
        DoCmd.SetWarnings False 
        DoCmd.RunSQL StrSQL 
        DoCmd.SetWarnings True 

回答
投稿日時: 17/04/30 13:18:15
投稿者: jung

まず説明を正しく行えますか?
>ファイル名を更新させるSQLを追加すると
提示してあるSQLはテーブル(テーブル1)の項目(NAME)を
修正するものです。
1つ
テーブル項目の名称として「NAME」は止めた方が良いです。
予約語でない名称を付けましょう。

投稿日時: 17/04/30 17:00:58
投稿者: TOM57

 jungさん
 
説明が悪くてすいません。
インポートするテーブルは1つでフォルダ内にあるCSVファイルをインポート。
テーブルは、インポートするCSVファイルの項目以外に、
ファイル名の項目がありインポート後、ファイル名欄は空白となるので、
そこにファイル名を更新して入れるようにしています。
 
  Do While buf <> ""
         
        DoCmd.TransferText acImportDelim, "", "テーブル1", "C:\csv\" & buf, True, ""
             
        StrSQL = "UPDATE テーブル1 SET ファイル名 = '" & buf & "' WHERE ファイル名 Is Null"
         
        DoCmd.SetWarnings False
        DoCmd.RunSQL StrSQL
        DoCmd.SetWarnings True
         
        buf = Dir()
    Loop
 
NAMEはすいません、実際には違う項目名にしているのですが、質問する用に
変換してしまいました。

回答
投稿日時: 17/05/01 09:29:27
投稿者: i-brown

1. 1ファイルを「追加用」のテーブルにインポート
2. 追加用テーブルに対してUpdate
3. 追加用テーブルから本来のテーブルにデータをコピー
4. 追加用テーブルのデータを削除
 
でどうでしょうか?
 
最後の方のファイルでは、30万件のデータのうち1ファイル分の「ファイル名がNULL」のデータを探してから更新処理をしていると思うので、後半ほど時間がかかると思います。
 

回答
投稿日時: 17/05/01 12:34:11
投稿者: hatena
投稿者のウェブサイトに移動

i-brownさんも言われてますが、
Null を検索して更新する更新クエリが遅いのだと思われるので、
それをしない方法を検討するのがいいでしょう。
 
i-brownさんも提案されてますが、いろいろなアイデアが考えられますね。
 
 
案1
 
1. テキストファイルからリンクテーブルを作成 (DoCmd.TransferText acLinkDelim ・・・)
2. リンクテーブルを元に追加クエリSQL("INSERT INTO ")を生成、そこに、「ファイル名」フィールドも入れておく
3. 追加クエリSQLを実行
4. リンクテーブルを削除
 
上記をループで繰り返し実行
 
 
 
案2
 
1.IN句でテキストファイルに接続する追加クエリSQLを生成、「ファイル名」フィールド含む
2.追加クエリSQLを実行
 
上記をループで繰り返し実行
 
 
案2のコード例
 

    Do While buf <> "" 

        StrSQL = "INSERT INTO テーブル1 " & _
                "SELECT *, '" & buf & "' AS ファイル名 " & _
                "FROM [" & buf & "] IN '' [Text;DATABASE=C:\csv;HDR=YES;];"
        CurrentDB.Excute StrSQL

       buf = Dir() 
    Loop 

 
IN句でのテキストファイルへの接続は、下記のリンク先等を参考。
B.WH |AC : クエリのIN句で外部(EXCEL)ファイルに接続
http://blogwizhook.blog.fc2.com/blog-entry-73.html

投稿日時: 17/05/03 16:11:23
投稿者: TOM57

 i-brownさん、hatenaさん
 
回答有難うございます。助かりました!!
確かにそうですね・・・考え方を変えないと
 
IN句で外部(EXCEL)ファイル接続、初めて知りました。
今後も使えそうで、勉強になりました。
ありがとうございます。