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

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

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

Q&A

解決済

4回答

6488閲覧

VBAファイル操作の高速化

kihokutarou

総合スコア59

0グッド

0クリップ

投稿2018/10/21 03:28

編集2018/10/21 05:12

あるディレクトリにあるすべてのファイルを開いて必要個所をコピーし、一つのブックにまとめる作業をしています。
しかしこの作業が非常に時間がかかります。フォルダ内50程度のファイルでも1~2分。最終的に1000ファイル位を扱うことを考えると、少しでも高速化したいところです。どなたかお知恵を拝借できませんか。

大変失礼しました。
Application.ScreenUpdating = False
Application.ScreenUpdating = True
のセットが抜けておりました。描写非表示でなおかつ高速化の手順があればご教示願います。

VBA

1Sub 各ブック必要個所集合() 2 Application.DisplayAlerts = False 3 4 Dim dlg As FileDialog 5 Dim fold_path As String, i As String 6 7 Set dlg = Application.FileDialog(msoFileDialogFolderPicker) 8 9 ' キャンセルクリック処理 10 If dlg.Show = False Then Exit Sub 11 12 ' フォルダフルパスを変数格納 13 fold_path = dlg.SelectedItems(1) 14 15 Set mb = ThisWorkbook 16 myfdr = ThisWorkbook.Path 17 fname = Dir(fold_path & "*.xls") 18 Do Until fname = Empty 19 If fname <> mb.Name Then 20 Application.EnableEvents = False 21 Set wb = Workbooks.Open(fold_path & "\" & fname) 22 Application.EnableEvents = True 23 24 Sheets("あああああ").Visible = True 25 26 Worksheets("あああああ").Select 27 Range("e2:e633").Copy 28 mb.Activate 29 Worksheets("いいいいい").Select 30 Cells(1, 10000).End(xlToLeft).Offset(0, 1).Select 31 ActiveCell.Value = x & wb.Name 32 ActiveCell.Offset(1, 0).PasteSpecial xlPasteAll 33 wb.Close 34 End If 35 fname = Dir 36 Loop 37 38End Sub

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

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

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

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

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

guest

回答4

0

VBA

1Option Explicit 2Sub 各ブック必要個所集合() 3 Dim dlg As FileDialog 4 Dim fold_path As String 5 Dim Sh As Worksheet 6 Dim Col As Long 7 Dim fname As String 8 Set dlg = Application.FileDialog(msoFileDialogFolderPicker) 9 If dlg.Show = False Then Exit Sub ' キャンセルクリック処理 10 fold_path = dlg.SelectedItems(1) ' フォルダフルパスを変数格納 11 Application.ScreenUpdating = False 12 Application.EnableEvents = False 13 Set Sh = ThisWorkbook.Worksheets("いいいいい") 14 Col = Sh.Cells(1, Sh.Columns.Count).End(xlToLeft).Column 15 fname = Dir(fold_path & "*.xls") 16 Do Until Len(fname) = 0 17 If fname <> ThisWorkbook.Name Then 18 With Workbooks.Open(fold_path & "\" & fname, ReadOnly:=True) 19 Col = Col + 1 20 Sh.Cells(1, Col).Value = fname 21 Sh.Cells(2, Col).Resize(632).Value = .Worksheets("あああああ").Range("E2:E633").Value 22 .Close 23 End With 24 End If 25 fname = Dir 26 Loop 27 Application.EnableEvents = True 28 Application.ScreenUpdating = True 29End Sub

投稿2018/10/21 09:46

iruyas

総合スコア1067

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

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

kihokutarou

2018/10/21 10:25

なるほど、selectしないアクセスしないというのがよくわかりました。50件程度でも数秒単位で差がわかりました。ありがとうございます。
guest

0

あるファイルとは、どんな形式ですか?EXCEL、CSV、PRN、RDB??

投稿2018/10/21 07:15

akirafudo6

総合スコア341

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

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

sazi

2018/10/21 09:48

コード中に fname = Dir(fold_path & "*.xls") とあります。
guest

0

FSOのファイル検索は高速とはいいがたいので、コマンドであらかじめファイルパスの取得をして、
配列に放り込んでおくとかなり高速化できるのではないかと思います。

vba

1Dim WSH, FilePath 2Set WSH = CreateObject("WScript.Shell") 3 4FilePath = WSH.Exec("dir """& fold_path &""" /s /b /a-d").StdOut.ReadAll 5FilePath = Split(FilePath, vbCrLf) ''最終行が空で入るので気を付けてください 6

投稿2018/10/21 06:54

satoshi_tajima

総合スコア337

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

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

kihokutarou

2018/10/21 10:26

ご回答ありがとうございます。 これ、挑戦してみたかったんですよね。なるほどファイル検索部分での短縮ですか。勉強になります。ちょっと参考にさせていただいて学習します。
guest

0

ベストアンサー

処理中の内容を表示しないようにするのが一番効果的です。
以下参考
エクセルVBA高速化ランキング【第1位】

追記

コピーの部分は多少短縮できると思います。
無駄なSelectをしない

投稿2018/10/21 05:03

編集2018/10/21 05:36
sazi

総合スコア25173

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

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

kihokutarou

2018/10/21 05:11

大変申し訳ありません。質問のために整形していて Application.ScreenUpdating = False のセットを削除していました。 その上でもしなにかお知恵があればお願いします。
sazi

2018/10/21 05:20

他にも割愛しているコードはありませんか? コードの高速化が質問なので、割愛すると意味がありません。
kihokutarou

2018/10/21 05:45

いえ、ほかには割愛している箇所はありません。 無駄なアクセスをしないということであれば、開いたブックの必要範囲を2次元配列にして最終的に書き出しをしたほうが良いかと気づかされました。 もう少し回答をお待ちしてみます。 ご回答ありがとうございます。
sazi

2018/10/21 05:55

一旦配列に入れるのは無駄だと思います。 追加したリンク先の最後の方を参照して下さい。
kihokutarou

2018/10/21 10:27

selectとはアクセスとも違う部分があるんですね、勉強になりました。具体的なコードを提示してくださった方もありますが、お教示いただいたことが勉強になりましたのでBAとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問