プロが教えるわが家の防犯対策術!

ExcelからAccessのテーブルに書き込みに以下のコードを使用しています。
ネットにあったものを参考にさせていただいてます。

データ数は5000ほどあります。
現在職場で使用しているパソコン(cpuはi5でメモリは8G)では20秒ほどかかります。
他のパソコンでも行おうとすると3分ほどかかります。
ちなみに職場の同じ機種ではやはり20秒ほどで処理が終わります。
別のメーカーのパソコン(スペックは同じかそれ以上)を何台か試しましたがすべて3分かかります。
ファイルはネットワーク上にあるのですが、試しにCドライブ直下に置いても変わりませんでした。

Excelを他のパソコンに配布しなければならないのですが時間がかかりすぎるので使い物になりません。

コードに問題があるのでしょうか?別の要因があるのでしょうか?
とても困っています、どなたか教えてください。




Sub 在庫一覧書き込み()
Dim adoCON As New ADODB.Connection
Dim adoRS As New ADODB.Recordset
Dim strSQL As String
Dim odbdDB As Variant
Dim wSheetName As Variant
Dim i As Integer
Dim wLastGyou As Long

'カレントディレクトリのデータベースパスを取得
odbdDB = ActiveWorkbook.Path & "\管理.accdb"

'データベースに接続する
adoCON.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=" & odbdDB & ""
adoCON.Open

'トランザクション開始
adoCON.BeginTrans

'アクティブなシート名を取得
wSheetName = ActiveSheet.name

With Worksheets(wSheetName)

'最終行番号を取得
wLastGyou = .UsedRange.Rows.Count

'Excelの一覧を読み込みAccessに書き込む
For i = 3 To wLastGyou

'IDの数値チェック(数字の場合は処理を実行)
If IsNumeric(.Cells(i, 1).Value) And _
.Cells(i, 1).Value <> "" Then

'DB接続用SQL
strSQL = "SELECT 在庫管理テーブル.* FROM 在庫管理テーブル "
strSQL = strSQL & "WHERE ID = " & CLng(.Cells(i, 1).Value) & " ;"
'カーソルをクライアント側に設定
adoRS.CursorLocation = adUseClient
'レコードセットを開く
adoRS.Open strSQL, adoCON, adOpenKeyset, adLockOptimistic

'入力されたIDと同一のレコードが無い場合は新規登録
If adoRS.EOF Then
adoRS.AddNew
adoRS!ID = CLng(.Cells(i, 1).Value)
End If
adoRS!入庫日 = .Cells(i, 2).Value
adoRS!担当 = .Cells(i, 3).Value
adoRS!製番 = .Cells(i, 4).Value
adoRS!注番 = .Cells(i, 5).Value
adoRS!図番 = .Cells(i, 6).Value
adoRS!品名 = .Cells(i, 7).Value

adoRS!個数 = .Cells(i, 8).Value
adoRS!保管1 = .Cells(i, 9).Value
adoRS!保管2 = .Cells(i, 10).Value
adoRS!出荷数 = .Cells(i, 11).Value
adoRS!出荷日 = .Cells(i, 12).Value



adoRS.Update

'レコードセットを閉じる
adoRS.Close: Set adoRS = Nothing

End If

Next i

End With

'トランザクション終了
adoCON.CommitTrans

'ADOコネクションオブジェクトのクローズ処理
adoCON.Close: Set adoCON = Nothing

End Sub

A 回答 (1件)

こんばんは


しばらく放置されているようなので あてには成らないかと思いますが
書き込むデータをあらかじめ配列などで作るのはどうでしょう?
大して変わらないかも・・・

"SELECT 在庫管理テーブル.* FROM 在庫管理テーブル WHERE ID =?"
こんな書き方なかったっけ?

ループ内の
'カーソルをクライアント側に設定
'レコードセットを開く
'レコードセットを閉じる
無くしたいのだけれど・・

>他のパソコンに配布しなければならない
残念ですが環境もないのでデバッグも出来ないのでサンプル(テスト)は書けません・・ね
    • good
    • 0
この回答へのお礼

ありがとうございます、結局別な方法で書き込みできました。
このコードでは大量のデータを処理するのは不向きなのでしょうか?
いまだに謎です。

お礼日時:2022/10/18 05:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!