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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのテーブルを解除する...
-
DataGridViewに複数テーブルの...
-
ExcelVBAからAccessMDB内のテー...
-
手動または分散トランザクショ...
-
vb6のコンボボックスの操作につ...
-
Accessのフォームでリス...
-
他のMDBのテーブルに追加したい
-
ワークテーブルの作成について
-
SQLを発行とは?クエリの作成と...
-
『列名 '担当者CD' があいま...
-
オラクルデータベースへの更新方法
-
asp.net mvcを利用する場合の複...
-
DAOの作成単位について
-
アクセステーブル、リンクとロ...
-
VBとアクセスでSQL文に変...
-
★クリスタルレポートの元になる...
-
DataGridの中身をDataSetにテー...
-
CSVファイルのエクスポートでソ...
-
ACCESS2010 実行時エラー 2766
-
C# OleDbDataAdapter.Fillメソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBとアクセスでSQL文に変...
-
『列名 '担当者CD' があいま...
-
AccessからExcelへエクスポート...
-
他のMDBのテーブルに追加したい
-
Accessで別mdbのテーブルをコピー
-
手動または分散トランザクショ...
-
DataGridViewに複数テーブルの...
-
エクセルのテーブルを解除する...
-
ACCESS2010 実行時エラー 2766
-
SQLを発行とは?クエリの作成と...
-
COBOLのINVALID KEYが理解でき...
-
アクセステーブル、リンクとロ...
-
CSVファイルのエクスポートでソ...
-
HTMLのテーブルの行数が多くな...
-
ExcelVBAからAccessMDB内のテー...
-
DataGridの中身をDataSetにテー...
-
ACCESSのテーブル名をリストに...
-
access2007 「#Deleted」
-
.net 複数の主キーを設定する方法
-
DAOでフィールドのデータ型を変...
おすすめ情報