Excelの複素数関数を使用していて、この実行が遅いので、これをなんとかするというのを前提に回答します。
関数自体の性能は、どうしようもありませんので、VBA側で足を引っ張っている部分を修正します。
(ですから、複素数関数に関係なくどのようなExcelのマクロでも高速化の可能性があります。)
遅い要因としては、
1.ワークシートに書き込むたびにExcelが描画をするため、遅くなる
2.ワークシートに書き込むたびにExcelの自動計算が動作するため、遅くなる
3.Excelのオブジェクトへの参照が頻繁に発生するために、遅くなる
などの原因があります。もちろん、ロジック自体に要因がある場合がありますが、それはソースをみないとなんともいえませんので・・・
1ですが、描画をとめる命令があります。
■描画停止
Application.ScreenUpdating = False
■描画再開
Application.ScreenUpdating = True
マクロのはじめで、停止させて、終わる前で再開させてください。
マウスカーソルも砂時計にしておいたほうがいいかも。
■マウスカーソルを砂時計にする
Application.Cursor = xlWait
■マウスカーソルを元にもどす
Application.Cursor = xlDefault
2は、自動計算をマニュアルにします。
■自動計算を手動にする
Application.Calculation = xlCalculationManual
■自動計算を自動にする
Application.Calculation = xlCalculationAutomatic
自動計算をマニュアルにしている場合で、プログラムが、ワークシート内の自動計算の結果を利用している場合は、手動では問題がありますので、計算結果を利用する前に計算を強制的に実行してください。
Application.Calculate
Calculateは、ワークシートに対して実行させることもできます。また、自動計算を自動に設定しただけでは、再計算は実行されませんので、手動にした場合は、自動に戻すときに、一度Calculateで強制的に計算をさせてください。
3はですが、例えば、下記のようなプログラムがあった場合ですが、
Dim i As Long
Dim x As Long
For i = 1 to 10
x = ThisWorkbook.Worksheets(1).Range("B1").value * ThisWorkbook.Worksheets(1).Cells(i,1).value
Next
ThisWorkbook.Worksheets(1).Range("B1").valueを10回も探しにいきますので、変数に値をとっておいて、実行させるようにします。
Dim i As Long
Dim x As Long
Dim x1 As Long
x1 = ThisWorkbook.Worksheets(1).Range("B1").value
For i = 1 to 10
x = x1 * ThisWorkbook.Worksheets(1).Cells(i,1).value
Next
ThisWorkbook.Worksheets(1).Cells(i,1).valueの部分も、ThisWorkbook.Worksheets(1)は、固定ですから、早く見つけ出せるように変数に入れるようにします。
Dim i As Long
Dim x As Long
Dim x1 As Long
Dim objSheet As Worksheet
Set objSheet = ThisWorkbook.Worksheets(1)
x1 = ThisWorkbook.Worksheets(1).Range("B1").Value
For i = 1 To 10
x = x1 * objSheet.Cells(i, 1).Value
Next
こんなところでしょうか。
質問の解釈を間違っていましたらごめんなさい。
お礼
参照設定を使い何度もループさせていたので、 おっしゃられた通り、複素数に詳しい方に関数を作ってもらい(自分では作れませんでした)、モジュール内に直接書き込みプログラムを完成させました。 スピードは、当初 複素数関数を含んだ計算処理を実行した時は40分かかる計算が、なんと、4分になりました。(本当です)1/10です。 もう驚きです。 スッキリした気分です。 解決にならないどころか、とても参考になりました。 ご助言していただき、ありがとうございました。嬉しいです!