ウェブスクレイピングで取得したデータを、
アクセスに登録するために使用しています。
一度コネクトしてから、連続して登録するように変更しました。
以下のコードで、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
adoCn.Execute strSQL がエラーを出さずに実行されているのに、追加に失敗するというのはちょっと考えにくいですね。
うーん、実物をみないと難しいかも。
Accessから、DoCmd.TransferSpreadsheet でインポートしたほうがシンプルなコードになるとおもいますが、それではだめですか。
前回の件も含めて、INSERTの処理には、原因不明のエラーが多いです。
EXCELLからACCESSに、INSERTでデータを登録するのは、避けた方が良いという事なのでしょうか?
SQLと、ACCESSは使い始めたばかりで、
初めてのことは、極力避けて通ろうとしがちなのですが、
どうも必要性があるようなので、
DoCmd.TransferSpreadsheetを試してみます。
お伺いしておきたいのですが、
EXCELLファイルと、CSVファイルでは、どちらのファイルが取り込みに適しているのでしょうか?
そういうわけではないです。
通常は、問題なくできると思います。
今回はうまくいかないようなので別案を提案してみたまでです。
うまくいかないのは、
adoCn.Execute strSQL 事態に問題があるのではなく、別の部分に原因があるのではと、私は疑ってます。
原因を決めつけないで、もう一度、コード全体を見直してみてはどうでしょうか。
ただ、自分がするなら、最終的にAccessに格納するなら、最初から Access でウェブスクレイピングでして、テーブルに格納します。その方がシンプルだしトラブルもすくないと思います。
ご指摘の通りです。
実は、ieオブジェクトのスクレイピングは自作したのですが、
重くてどうにもならない状況になり、ほかの言語のプログラムを外注しました。
ところが、この方がデータベースの知識がなかった。。。。。
さすがに、c+やRUBYを覚えるのが嫌なのでというわけです。
適当な値段で、請け負ってくれる方がいたら、作り直したいです。
情報が入手しやすいので、良い面もありましたが
EXCELL VBAも、どういうものかな~と思い始めています。
ただ、全部作り直すのは、大変すぎます。
今回の場合、
Set ws = Workbooks("取得.xlsx").Worksheets("sheet1")
を
Workbooks("取得.xlsx").Worksheets("sheet1").activate
に戻すと、エラーは多発しなくなりました。
ただ、これはありえないことなので、悩みどころです。
その外注したプログラムはスクレイピングの結果をエクセルに出力するものなのですか。
最終的Accessに格納するならcsvで出力してもらったら方が楽だったかも知れませんね。
やっていることの全体像が分からないのでなんとも言えませんが、
処理を分けて実行するようにして、どこで問題が発生しているか切り分けをすることから始めるべきかと思います。
スクレイピング結果をシート上に出力する。
このデータに問題がないか確認する。
その後、そのシートデータをAccessに出力するようにする。
出力は、"INSERT INTO " をExcuteするのではなく、
Recordsetとして開いて、AddNewする方法を試してみるといいかもしれません。
出力先のAccessファイルはローカルにあるのですよね。
ネットワーク上にあって共有しているとかだと、それが影響することもあります。
スクレイピングの結果は、CSVに出力されます。
しかし、そのままだと使い物にならないので、'を’’に変換したり、
外字を変換したり、文字数をカウントして調整したりします。
この段階では、EXCELLにありますが、CSVで保存をするだけなので問題ありません。