Microsoft Access 掲示板

adoのINSERTが、3回に1回くらいしか成功しなくなりました。

7 コメント
views
4 フォロー

ウェブスクレイピングで取得したデータを、
アクセスに登録するために使用しています。

一度コネクトしてから、連続して登録するように変更しました。

以下のコードで、3回に一回くらいしか登録できなくなってしまいました。
どこが悪いのでしょうか?

エラーメッセージは出ません。
同じコードを、2~3回試すと登録されるので、コード自体の誤りはないと思われます。

CPUはI7なので、そこそこ早いと思います。
全く見当がつきません。
どなたか、よろしくお願いいたします。

Dim adoCn As Object
Dim strSQL As String
Dim ws As Worksheet
Dim Num1 As String
Dim n1 As String
Dim n2 As String
Dim n3 As String
Dim n4 As String
Dim n5 As String
Dim n6 As String
Dim n7 As String
Dim n8 As String

    strFileName = "cdデータ.accdb" 'データベースのファイル名

    Set adoCn = CreateObject("ADODB.Connection") 'ADODBコネクションオブジェクトを作成
    adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\tasukaru\Desktop\通販\出品データ\" & strFileName & ";" 'Accessファイルに接続

    Set ws = Workbooks("取得.xlsx").Worksheets("sheet1")
    lc = Cells(Rows.Count, "E").End(xlUp).Row

    For i = 2 To lc

    Num1 = Cells(i, 7).Value '開始価格取得

    n1 = Cells(i, 1).Value 'janコード取得

    'Debug.Print n1

    n2 = Cells(i, 5).Value 'タイトル取得
     n2 = Replace(n2, "'", "''") ''を''に変換

    n3 = Cells(i, 16).Value 'タイトルリスト取得
     n3 = Replace(n3, "'", "''") ''を''に変換

    n4 = Cells(i, 6).Value 'アーティスト名取得
     n4 = Replace(n4, "'", "''") ''を''に変換

    n5 = Cells(i, 10).Value '収録曲取得
     n5 = Replace(n5, "'", "") ''を削除

    n6 = Cells(i, 11).Value 'カテゴリ取得

    n7 = Cells(i, 3).Value 'TSUTAYAコード取得

    n8 = Cells(i, 2).Value 'メーカーコード取得

    Tn = "[JAN]"

    Fn = "([開始価格],[JAN],[タイトル],[タイトルリスト],[アーティスト],[収録曲],[カテゴリー],[TSUTAYAコード],[メーカーコード])"
    Fd = Num1 & ",'" & n1 & "','" & n2 & "','" & n3 & "','" & n4 & "','" & n5 & "','" & n6 & "','" & n7 & "','" & n8 & "'"

    strSQL = "INSERT " & "INTO " & Tn & Fn & " VALUES" & "(" & Fd & ")"

    'Debug.Print strSQL

    adoCn.Execute strSQL 'SQLを実行して対象を追加

    Next i

    adoCn.Close

    FileCopy "C:\Users\tasukaru\Desktop\通販\出品データ\cdデータ.accdb", "E:\通販\出品データ\cdデータ.accdb" 'cdデータをバックアップする

End Sub

5流クン
作成: 2019/04/18 (木) 16:55:12
通報 ...
1

 adoCn.Execute strSQL がエラーを出さずに実行されているのに、追加に失敗するというのはちょっと考えにくいですね。
うーん、実物をみないと難しいかも。

Accessから、DoCmd.TransferSpreadsheet でインポートしたほうがシンプルなコードになるとおもいますが、それではだめですか。

2
5流クン 2019/04/19 (金) 10:44:52 73ee0@9ec8c

前回の件も含めて、INSERTの処理には、原因不明のエラーが多いです。
EXCELLからACCESSに、INSERTでデータを登録するのは、避けた方が良いという事なのでしょうか?

SQLと、ACCESSは使い始めたばかりで、
初めてのことは、極力避けて通ろうとしがちなのですが、
どうも必要性があるようなので、
DoCmd.TransferSpreadsheetを試してみます。

3
5流クン 2019/04/19 (金) 11:08:30 73ee0@9ec8c

お伺いしておきたいのですが、
EXCELLファイルと、CSVファイルでは、どちらのファイルが取り込みに適しているのでしょうか?

4

EXCELLからACCESSに、INSERTでデータを登録するのは、避けた方が良いという事なのでしょうか?

そういうわけではないです。
通常は、問題なくできると思います。
今回はうまくいかないようなので別案を提案してみたまでです。

うまくいかないのは、
adoCn.Execute strSQL 事態に問題があるのではなく、別の部分に原因があるのではと、私は疑ってます。
原因を決めつけないで、もう一度、コード全体を見直してみてはどうでしょうか。

ただ、自分がするなら、最終的にAccessに格納するなら、最初から Access でウェブスクレイピングでして、テーブルに格納します。その方がシンプルだしトラブルもすくないと思います。

5
5流クン 2019/04/19 (金) 15:53:35 73ee0@9ec8c

ご指摘の通りです。
実は、ieオブジェクトのスクレイピングは自作したのですが、
重くてどうにもならない状況になり、ほかの言語のプログラムを外注しました。

ところが、この方がデータベースの知識がなかった。。。。。
さすがに、c+やRUBYを覚えるのが嫌なのでというわけです。
適当な値段で、請け負ってくれる方がいたら、作り直したいです。

情報が入手しやすいので、良い面もありましたが
EXCELL VBAも、どういうものかな~と思い始めています。

ただ、全部作り直すのは、大変すぎます。

今回の場合、
Set ws = Workbooks("取得.xlsx").Worksheets("sheet1")

Workbooks("取得.xlsx").Worksheets("sheet1").activate
に戻すと、エラーは多発しなくなりました。

ただ、これはありえないことなので、悩みどころです。

6
hatena 2019/04/19 (金) 16:10:36 修正

その外注したプログラムはスクレイピングの結果をエクセルに出力するものなのですか。
最終的Accessに格納するならcsvで出力してもらったら方が楽だったかも知れませんね。

やっていることの全体像が分からないのでなんとも言えませんが、
処理を分けて実行するようにして、どこで問題が発生しているか切り分けをすることから始めるべきかと思います。

スクレイピング結果をシート上に出力する。
このデータに問題がないか確認する。
その後、そのシートデータをAccessに出力するようにする。

出力は、"INSERT INTO " をExcuteするのではなく、
Recordsetとして開いて、AddNewする方法を試してみるといいかもしれません。

出力先のAccessファイルはローカルにあるのですよね。
ネットワーク上にあって共有しているとかだと、それが影響することもあります。

7
5流クン 2019/04/19 (金) 17:30:45 73ee0@9ec8c

スクレイピングの結果は、CSVに出力されます。
しかし、そのままだと使い物にならないので、'を’’に変換したり、
外字を変換したり、文字数をカウントして調整したりします。

この段階では、EXCELLにありますが、CSVで保存をするだけなので問題ありません。