- ベストアンサー
Excel VBAデータ登録のスピードアップ方法
- ExcelのVBAを使用してデータ登録のスピードを向上させる方法についてアドバイスをお願いします。
- データを格納するシートとデータの受け渡しを行うシートの間でデータレコードを切り替える際にかかる時間を短縮する方法を教えてください。
- ExcelのVBAを使用してデータ登録・閲覧・編集を行っていますが、データレコードの切り替えに時間がかかってしまい、作業効率が低下しています。どのように修正すれば良いでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 >試した結果では、複写範囲が広くなっても、処理時間が比例的に増加する事はありませんでした。 スミマセン。これ嘘でした。実行一回目はコンパイルの関係か、キャッシュの関係か時間がかかるので、見誤っておりましたが、やはりセル数に比例して処理時間は増加します。但し、個々に転送するのに比べて20倍くらい速いです。まとめて転送する事で、セル数がバラの場合の20倍以下でおさまるなら速度アップが期待できます。 この方法の場合は、数式を介しておりますので、再計算は自動のままにしておく必要がありますので、念のため付け加えさせていただきます。 ただ、単純なモデルで試した限りでは、256個の転送程度ならイラっとする程の時間はかからないと思いますので、遅くなる原因は他にあるのかもしれません。要所でGetTickCountを実行して、どこで時間がかかっているのかお調べになってはいかがでしょうか。
その他の回答 (2)
- mitarashi
- ベストアンサー率59% (574/965)
1.まずデータ転記部分を Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ’ここに転記処理を記す Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True で囲むと、処理時間半減位にはなると思います。 2.それ以上の高速化には、範囲まとめて値転写するのが速いと思います。 バラバラのセル→一行書き込みでは、作業用のシートに数式で一旦受けて、一行にまとめる様にしておいて、 Sheets("Sheet3").Rows(1).Value = Sheets("Sheet4").Rows(1).Value といった感じで値のみ代入すれば良いでしょう。 一行→バラバラのセルの場合も、同じセル配置の作業用のシートを設けて、 一行のデータから目的の配置に関数で転記して、 Sheets("Sheet5").Range("A1:T20").Value = Sheets("Sheet4").Range("A1:T20").Value といった感じで、定数的な見出し文字といった情報もひっくるめて目的のシートに値を転記すれば速いと思います。 試した結果では、複写範囲が広くなっても、処理時間が比例的に増加する事はありませんでした。 検索してヒットした行から、作業シートのバラバラのセルに値を移すには、INDEX関数を用いるなり、作業用のシートの所定の行に一旦コピーしても良いでしょう。 なお、この方法だと、転記先のシートの書式情報はそのまま保持されます。 但し、貼付先の書式によっては、転写元の空白が、転写先で0になってしまうといった問題が出るかもしれません。 以上、ご参考まで。
- mks1902
- ベストアンサー率40% (11/27)
>If (fRange Is Nothing) Then '見つからなかった? >MsgBox "入力された顧客コードが存在しません。", vbExclamation >Exit Sub >End If 件数が多いとIF~THEN命令は不向きです。私も経験しました。 ヒントとして IF~THEN命令のところをオートフィルタで顧客コードを抽出。 結果をコピーし、別のシートに貼り付け。 counta関数で抽出件数を出す。 0件なら顧客コードが存在しない 1件ならヒット 2件以上なら重複 頑張ってみてください。
お礼
mk1902様 回答ありがとうございました。 まだトライできていませんが、是非活用させていただきたいと思います。 勉強になりました。 ありがとうございます。
お礼
mitarashi様 いつも本当にありがとうございます。既にNO2で頂いた回答で既に劇的に早くなりました。20秒から1秒以下にまで縮まりました。なんてお礼を言ったらよいか・・。なぜこんなに早くなるのか、いまいち理解仕切れていませんので、そこもしっかり勉強していくつもりです。 本当にありがとうございました。