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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
博識な方、アバターページにつ...
-
VB2005でINSERT文が。。。
-
ハッシュテーブルの使い方
-
DataGridの中身をDataSetにテー...
-
オートナンバー型を変換したい
-
Access2007でアプリケーション...
-
CSVファイルのエクスポートでソ...
-
エクセルのテーブルを解除する...
-
【ADO】「Execute」を使うと...
-
SQL同時実行違反
-
VBの質問です
-
StrConvでUnicodeに変換出来な...
-
【C++/CLI】int型からString型...
-
OracleDataReaderについて…
-
Excel VBAでグラフの可変データ...
-
エクセル(VBA)の空白配列の削除...
-
オートナンバー型を抽出条件に...
-
VBA どっちが速い?
-
Accessのフィールド名に半角括...
-
VBA 桁数が混在するソート
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
『列名 '担当者CD' があいま...
-
SQLを発行とは?クエリの作成と...
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
手動または分散トランザクショ...
-
エクセルのテーブルを解除する...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
HTMLのテーブルの行数が多くな...
-
ACCESS2010 実行時エラー 2766
-
ExcelVBAからAccessMDB内のテー...
-
Excel複数シートをaccessへ一括...
-
DataGridViewに複数テーブルの...
-
他のMDBのテーブルに追加したい
-
ワークテーブルの作成について
-
★クリスタルレポートの元になる...
-
COBOLのINVALID KEYが理解でき...
-
VBでコンボボックスとテキスト...
-
VB.NETでのAccessテーブルリンク
-
Accessのフォームでリス...
おすすめ情報