質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

8330閲覧

アクセスでのEXCELファイルからのシートインポート高速化について

yuujiMotoki

総合スコア90

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/10/30 02:20

編集2018/10/30 02:41

ACCESSでアプリ開発をしています。

2000個ほどの、EXCELファイルの中から、シートをIMPORTしていますが、
ものすごく時間がかかっています。

EXCELシートからの取り込みに関して、もっと良い方法があれば教えていただきたいのですが

現状のソースを下記に示します。

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTblName, strPath, True, sheet & "!"

vb

1 2Public TableNames As Collection 3Private qdf As DAO.QueryDef 4Dim myRS As DAO.Recordset 5Private sql As String 6Private xlPath As String 7 8Public Sub tablename() 9Dim FSO As FileSystemObject 10Dim filenum As Variant 11Dim table As Variant 12Dim FIO As ClsFileIO 13Set FIO = New ClsFileIO 14Dim bar As Variant: Set bar = New clsProgressBar 15Dim count_all 16Dim count 17count_all = TableNames.count 18 19For Each filenum In TableNames 20With filenum 21Dim tbln 22tbln = StrConv(.tbl, 4) 23FIO.Import .Path & "\" & .File, "Lot結果", "Lot結果" 24bar.UpdateProgress count, count_all, filenum.File, Form_frmProgressBar 25count = count + 1 26End With 27Next 28 29End Sub 30 31 32 33Public Sub Import(strPath As Variant, strTblName As Variant, sheet As Variant) 34On Error GoTo err 35 36Select Case OdbcSelect(strPath) 37Case ACCESS 38 DoCmd.TransferDatabase acImport, "Microsoft Access", _ 39 strPath, acTable, strTblName, strTblName 40 Exit Sub 41 42Case EXCEL 43DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTblName, strPath, True, sheet & "!" 44 45 Exit Sub 46Case Else 47End Select 48 49err: MsgBox "テーブル構造が違います" 50 51End Sub 52 53

読み込むシートは下記のようなデータで、400行程度です。

L1シートNo 基板連番 YMP測定No 個片No NG判定 ブロックNo
10311M87U010254 1 1 1 4WNG #N/A
10311M87U010254 1 2 28 4WNG #N/A
10311M87U010254 1 3 55 4WNG #N/A
10311M87U010254 1 4 82 4WNG #N/A
10311M87U010254 1 5 2 4WNG #N/A
10311M87U010254 1 7 56 4WNG #N/A
10311M87U010254 1 8 83 4WNG #N/A
10311M87U010254 1 15 58 4WNG #N/A
10311M87U010254 1 16 85 4WNG #N/A

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エクセルファイルをテキストとして読むなんて、無茶してますね。
正しく読めているんでしょうか?

リンクするかインポートして扱う方が高速でしょうし、処理も簡潔になるかと思います。
Excel ブックのデータのインポートとリンクの設定
DoCmd.TransferSpreadsheet メソッド

投稿2018/10/30 02:33

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuujiMotoki

2018/10/30 02:42

大変申し訳ありません。添付すべき箇所を間違えておりました。DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTblName, strPath, True, sheet & "!" 。このコマンドが非常に時間がかかっている状態です。
sazi

2018/10/30 02:49 編集

400行程度でどの程度時間がかかっているのですか? またインポートされた結果のテーブルは何行位ですか? 普通は数千件でも数秒でインポートは完了すると思いますので、コマンド単独での処理時間の計測をお勧めします。
yuujiMotoki

2018/10/30 04:13

先ほどの回答から、すぐに走らせて見た結果です 1   11:45ごろ 1995 2018/10/30 12:49:26 1996 2018/10/30 12:49:30 1997 2018/10/30 12:49:34 1998 2018/10/30 12:49:38 1999 2018/10/30 12:49:40 2000件で1時間ちょっとでしたので、1件あたり2秒程度になっている見込みです
sazi

2018/10/30 04:30 編集

そのログがファイル単位というなら、所要時間の解釈がおかしいですし、1件単位というなら、DoCmd.TransferSpreadsheet はファイル単位の処理ですから、コマンドの処理時間ではないですね。 インポートした後の処理に時間が掛かっているんじゃないですか。
yuujiMotoki

2018/10/30 04:42

ありがとうございます。コマンド単位の解釈がよく分からなかったもので。コマンド前後でのnow()表示を見てみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問