![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。
Access2000のVBAでコードを作成したのですが、
処理をもっと早く出来る方法ありましたら教えて頂ければと
思います。
処理している内容としては、
(1)データ元のエクセルファイルを開く
(2)エクセルファイルに記載されているセルの内容をAccessに挿入
※取り込み開始・終了が200回程繰り返す
※While (oApp.Sheets(sheet).cells(iRow, 1) <> "")のループは500回程繰り返す
少しでも処理を速くする方法があれば教えて頂きたいので
宜しくお願い致します。
------------ソース----------------
Set oApp = CreateObject("Excel.Application")
oApp.Workbooks.Open FileName:=CurrentProject.Path & "\メイン.xlsm"
---------------取り込み開始-------------
rs2.Open "選手", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
iRow = 2
sheet = "program"
rs.Open "選手情報_選手ID", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
iRow = 2 ' ★
sheet = "program"
While (oApp.Sheets(sheet).cells(iRow, 1) <> "")
rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2)
rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1)
rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3)
If (rs.EOF) Then
rs.AddNew
rs("日") = oApp.Sheets(sheet).cells(iRow, 2)
rs("場") = oApp.Sheets(sheet).cells(iRow, 1)
rs("番号") = oApp.Sheets(sheet).cells(iRow, 3)
End If
rs("1番") = oApp.Sheets(sheet).cells(iRow, 5)
rs("2番") = oApp.Sheets(sheet).cells(iRow, 5 + 26)
rs("3番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26)
rs("4番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26)
rs("5番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26 + 26)
rs("6番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26 + 26 + 26)
rs.Update
iRow = iRow + 1
Wend
rs.Close
---------------取り込み終了-------------
---------------取り込み開始-------------
rs.Open "選手情報_選手名", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
iRow = 2 ' ★
sheet = "program"
While (oApp.Sheets(sheet).cells(iRow, 1) <> "")
rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2)
rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1)
rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3)
If (rs.EOF) Then
rs.AddNew
rs("日") = oApp.Sheets(sheet).cells(iRow, 2)
rs("場") = oApp.Sheets(sheet).cells(iRow, 1)
rs("番号") = oApp.Sheets(sheet).cells(iRow, 3)
End If
rs("1番") = oApp.Sheets(sheet).cells(iRow, 1 + 5)
rs("2番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26)
rs("3番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26)
rs("4番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26)
rs("5番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26 + 26)
rs("6番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26 + 26 + 26)
rs.Update
iRow = iRow + 1
Wend
rs.Close
---------------取り込み終了-------------
No.1ベストアンサー
- 回答日時:
早くなるかどうかは、実験してみないとわかんないけど
ADOでエクセルにアタッチしてみたらどうだろう。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
あと、アクセスのインサートはSQL一発のほうが早いと思う。
http://www.1keydata.com/jp/sql/sql-insert-into.php
No.4
- 回答日時:
No.3です。
コードに
oApp.Sheets(sheet)
とたくさん書きならべてありますが、
これは書きならべないでWithを使うか変数にsetしてから使うかのどちらかにしたほうが速度が少し速くなると思います。
No.3
- 回答日時:
AccessのことはさっぱりわからないExcelユーザです。
Excelのブックは1つでCellsはたくさん実行するのですね。
もしもそのブックに数式がたくさん存在するなら、再計算による速度低下が無視できないくらいあるかもしれません。
(数式が少なければ再計算の影響はわずかと思われます)
もしそうであれば、再計算を停止することで高速化するはずです。
方法ですが、
最初の取り込み開始の前に
oApp.parent.Calculation = -4135 'xlCalculationManual
最後の取り込み終了の後に
oApp.Calculation = -4105 'xlCalculationAutomatic
と入れます。
あるいは、もしも何らかの方法でiRowの最大値がわかるなら、
たとえばそれがiRowMaxとして、
dim xsarray as variant
with oapp.sheets(sheet)
xsarray=.range(.cells(1,1), .cells(iRowMax, 5 + 26 + 26 + 26 + 26 + 26))
end with
のようにして2次元配列として一気に取り込めば、再計算を停止しなくても再計算による速度低下の影響は少ないと思います。
(その後2次元配列xsarrayから所定の変数へ代入します)
ただ、本質問のケースでは配列がかなり大きくなりそうなのでその点が心配です。
No.2
- 回答日時:
別件の質問のヒントだけど、、、
この質問を見る限りでは、エクセルマクロでセルに値を書くことはできるし、
アクセスから書かれた値を読むことはできるんだよね。
あとは、定期的に見張るって部分だけど、一般的には
vbで言うところの、timer コントロールみたいなものがないから、
loop のなかにSleepをくみこんで、監視すると良いと思いますよ。
http://detail.chiebukuro.yahoo.co.jp/qa/question …
>別件の質問のヒントだけど、、、
>この質問を見る限りでは、エクセルマクロでセルに値を書くことはできるし、
>アクセスから書かれた値を読むことはできるんだよね。
ご教授頂きまして、まことにありがとうございます。
お手本がないと何もできない馬鹿ですので。。
アドバイスありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- Visual Basic(VBA) VBA For Each 〜 複数条件について 3 2022/10/20 20:05
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) エクセル VBA メール本文に指定セルに記載されているURLをリンクとして記載する方法 8 2022/08/08 07:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA
-
Range("A1")⇔cells(1,1)の変換。
-
再質問です。マクロの修正箇所...
-
Excelで数字を入れたら対応する...
-
[EXCEL]ボタン押す→時刻が表に...
-
B列の最終行までA列をオート...
-
エクセルで特定の文字列が入っ...
-
エクセルVBAが途中で止まります
-
Changeイベントでの複数セルの...
-
マクロの「SaveAs」でエラーが...
-
vba 2つの条件が一致したら...
-
「段」と「行」の違いがよくわ...
-
IIF関数の使い方
-
Excelで、あるセルの値に応じて...
-
VLOOKUPの列番号の最大は?
-
EXCEL VBA 文字列から電話番号...
-
VBA シートをコピーする際に Co...
-
Excel グラフのプロットからデ...
-
文字列の結合を空白行まで実行
-
VBAでの SendKeysの変数指定方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA
-
Range("A1")⇔cells(1,1)の変換。
-
vba formulaの中での変数の扱い
-
VBA SUM関数に変数を入れた計算...
-
エクセル マクロ range
-
エクセルvbaのコンパイルエラー
-
セルの値を足す
-
AccessVBAから、Excelシート内...
-
初歩的な質問で申し訳ありませ...
-
csv形式でも文字点滅可能でしょ...
-
VB2010でのExcel操作
-
Access2000のVBAコードの最適化
-
VBAマクロ実行時エラーの修正に...
-
エクセル マクロ オートフィ...
-
VBA シートをコピーする際に Co...
-
Worksheets メソッドは失敗しま...
-
エクセルで複数のシートのクリ...
-
エクセルで特定の文字列が入っ...
-
Excelで、あるセルの値に応じて...
-
あああ..ああい..ああう とい...
おすすめ情報