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
No.1ベストアンサー
- 回答日時:
こんばんは
しばらく放置されているようなので あてには成らないかと思いますが
書き込むデータをあらかじめ配列などで作るのはどうでしょう?
大して変わらないかも・・・
"SELECT 在庫管理テーブル.* FROM 在庫管理テーブル WHERE ID =?"
こんな書き方なかったっけ?
ループ内の
'カーソルをクライアント側に設定
'レコードセットを開く
'レコードセットを閉じる
無くしたいのだけれど・・
>他のパソコンに配布しなければならない
残念ですが環境もないのでデバッグも出来ないのでサンプル(テスト)は書けません・・ね
ありがとうございます、結局別な方法で書き込みできました。
このコードでは大量のデータを処理するのは不向きなのでしょうか?
いまだに謎です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
手動または分散トランザクショ...
-
ADO&mdbで、リンクテーブルの...
-
アクセステーブル、リンクとロ...
-
ワークテーブルの作成について
-
DataGridの中身をDataSetにテー...
-
WORD VBA プログラム修正をお願...
-
ACCESSのテーブル名をリストに...
-
オラクルデータベースへの更新方法
-
VBとアクセスでSQL文に変...
-
DataGridViewに複数テーブルの...
-
エクセルのテーブルを解除する...
-
AccessからExcelへエクスポート...
-
SQL文で在庫推移を得る。
-
Access2003VBA リンクテーブル...
-
Accessで別mdbのテーブルをコピー
-
ExcelVBAからAccessMDB内のテー...
-
CSVファイルのエクスポートでソ...
-
MDBテーブルへの追加変更を教え...
-
asp.net mvcを利用する場合の複...
-
VB.NET データセットとADOレコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WORD VBA プログラム修正をお願...
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
『列名 '担当者CD' があいま...
-
ExcelVBAからAccessMDB内のテー...
-
他のMDBのテーブルに追加したい
-
手動または分散トランザクショ...
-
SQLを発行とは?クエリの作成と...
-
DataGridViewに複数テーブルの...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
エクセルのテーブルを解除する...
-
Excel複数シートをaccessへ一括...
-
HTMLのテーブルの行数が多くな...
-
COBOLのINVALID KEYが理解でき...
-
アクセステーブル、リンクとロ...
-
ACCESSのテーブル名をリストに...
-
ACCESS2010 実行時エラー 2766
-
DataGridの中身をDataSetにテー...
-
【ADO】「Execute」を使うと...
おすすめ情報