[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAの処理速度』(ミサイル)
こちらのコードを使って、統計データから値を反映させる処理を行っていますが、処理時間が30~40秒ほどかかってしまい、もう少し速くなるようにコードの改善をしたいです。何かいい方法はございませんでしょうか・・・?
Dim k As Long, l As Long, j As Long, i As Long, o As String
k = ActiveSheet.Cells(11, 3) l = ActiveSheet.Cells(10, 3) o = ActiveSheet.Cells(9, 4) For i = 0 To 11 For j = 0 To 7 ActiveSheet.Cells(13 + i, 5 + j) = ExecuteExcel4Macro("'ファイルパス名】\[ファイル名.xls]" & o & "'!R" & k + i & "C" & l + j) Next j Next i
< 使用 Excel:unknown、使用 OS:unknown >
tkitさんのおっしゃっているのは、VBAの中で目的のシートを開き、データを転記(コピー)するということでしょう。 (tora) 2020/10/29(木) 13:29
Workbooks.Openを使った方が一般的なので、検索して出てきたサンプルを参考に書き直してみてください。
数秒くらいにはなると思います。
(通りすがり) 2020/10/29(木) 14:00
データ元のシート内容を配列で取得すれば多少速くなりそうですが、
ループ数が少ないので、100msecも変わらないかもです。
動作確認はしておりませんので、あしからず。
Sub sample() Dim ws As Worksheet Dim openBook As Workbook Dim openPath As String Dim pasteArr As Variant Dim k As Long, l As Long, j As Long, i As Long, o As String Set ws = ActiveSheet With ws k = .Cells(11, 3) l = .Cells(10, 3) o = .Cells(9, 4) End With '▼任意のフルパスを入れてください openPath = "" '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Set openBook = Workbooks.Open(Filename:=openPath, ReadOnly:=True) ws.Parent.Activate ReDim pastarr(11, 7) With openBook.Worksheets(o) For i = 0 To 11 For j = 0 To 7 pasteArr(i, j) = .Cells(k + i, l + j).Value Next j Next i End With ws.Cells(13, 5).Resize(UBound(pasteArr, 1) + 1, UBound(pasteArr, 2) + 1).Value = pasteArr Erase pasteArr Set ws = Nothing openBook.Saved = True openBook.Close Set openBook = Nothing End Sub
(tkit) 2020/10/29(木) 15:44
ExecuteExcel4Macroでアクセスする度、ブックを開いているようなものなので、時間が掛かるのは当たり前です。
実行時間短縮は諦めてください。
以上
(tkit) 2020/10/29(木) 16:51
With Cells(13, 5).Resize(8, 12) .Formula = "='ファイルパス名】\[ファイル名.xls]" & o & "'!" & Cells(k, l).Address(0, 0) .Value = .Value End With
(マナ) 2020/10/29(木) 17:32
いままでの経験では、マナさんの案が「ExecuteExcel4Macro」を使うより50倍くらい速いです。
30〜40秒なら単純計算で、たった1秒で終わります。
(半平太) 2020/10/29(木) 19:18
(1) 質問者さんの提示されたコードは、縦12行横8行に書き込む処理ですが、 それが30〜40秒かかるというのは時間が掛かりすぎの印象です。 ワークシートに多数の式が書き込まれていて、 書き込みによって式の再計算でも起きているのでしょうか。 1秒もかからないはずですが。
普通に開いて配列にとりこみ、それを一括して書き込む方式と比べると、 今の程度のセル範囲の大きさでは、両者は余り差はないですが、 多くなれば、Excel4Macroのほうが断然遅くなります。 それは、一セル毎に書き込むというのが、とても非効率なためです。
(2) Excel4Macroに関しては、 ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application) https://excel-ubara.com/excelvba5/EXCELVBA242.html が参考になるでしょう。 その結論では、 >余程の事情が無い限り、ExecuteExcel4Macroは積極的に使うものではないでしょう。 とされています。
どうしても、Excel4macroに魅力を感じて、この延長線上でスピードアップを求めるなら、 それは「解無し」ということです。(既に指摘がありました)
(3) 現在の範囲の大きさでは少なくとも、 マナさんの計算式埋め込み方式が最速で、他と二つと比べて1/30程度の時間ですむはずです。 可能性があると思います。
# ただ私見では、普通に開いて、速度を求めるなら配列利用などを工夫するという方式を # 中心に考えるということでいいような気がします。 # それは計算式を構成するのが手間という私の個人的な事情によりますが。
(γ) 2020/10/29(木) 20:00
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.