Microsoft Access 掲示板

adoでレコードを追加したときの結果の確認方法 / 3

11 コメント
views
4 フォロー
3

Worksheets("出品ファイル").Activate
 For i = 2 To nl
で、データを拾っていきます。

この For Next内で DataプロシージャをCallしているということでよすね。
このFor Next内で何をしているか知りたいのです。

というのは、

この過程で、画像をコピーしたり、フォルダを作ったりという作業を並行して行っているので
先走りして、追加が終わらないうちに、次のデータの処理を始めてしまうのが、原因だろうと予想しております。

まずはその予想があっているのかどうか、
VBAはシングルタスクなのでVBAの標準のコマンドならそのようなことは通常はおこらないはず、外部コマンドを使っているか、なにか特別なことをしているのか、
その辺を確認したいのです。

追加に失敗したら、追加されるまで処理を繰り返すというのは対症療法的な解決法です。できれば、根本の原因を特定して、そちらで解決できる方法がないかさぐるのが先決だと考えます。

その解決法がどうしてもないのなら、次善策として対症療法的解決法をとるというようにすべきと考えます。


とりあえず現状のコードで修正したほうかいいと思われるところを指摘しておきます。

    Worksheets("出品ファイル").Activate
    Num1 = 1 '回数入力
    Num2 = Cells(i, 6).Value '特価取得
    ・・・

シートをActivateしてアクティブなシートを対象に処理をしていますが、アクティブシートを前提にするとバグのもとになります。
シートを変数に格納してそれを対象にするか、With ステートメントで明示的に対象シートを指定するほうが確実、安全なコードになります。

    Dim ws As WorkSheet
    Set ws = ThisWorkbook.Worksheets("出品ファイル")
    Num1 = 1 '回数入力
    Num2 = ws.Cells(i, 6).Value '特価取得
    ・・・
    With ThisWorkbook.Worksheets("出品ファイル")
        Num1 = 1 '回数入力
        Num2 = .Cells(i, 6).Value '特価取得
    ・・・
    End With

次に、下記のコードについて

Function AddDB(ByVal Tn As String, ByVal Fn As String, ByVal Fd As String) As ADODB.Recordset

Functionの戻り値を Recordset にしてますが、INSERT INTO文は Recordset を返しません。テーブルへのデータを追加するだけです。
Function内で戻り値も設定していないので無意味なものになっています。
また、この関数内で、
Set adoCn = CreateObject("ADODB.Connection")
とADODBコネクションを生成してますが、
Closeしてません。使用後は明示的にCloseすべきです。

さらに、100件くらいのレコードを追加する場合、
100回ADODBコネクションを生成することになりますが、
無駄なことです。
100件のレコードを追加するなら、コネクションを最初に1回生成してOpenして、
続けて100回追加して、最後にCloseするという処理にすると効率的です。

通報 ...