|
皆さん、おはようございます。
>On Error nextで抜ける方法と
>for であるかないか探す方法と
>ありましたが、一見On Error nextでやる方が処理は速そうですが
>(名前付きセル範囲)をExcellが探すとき、結局はコンピュータの内部
>でも、くり返し文で探していると思うので、処理速度は同じなのでしょうか。
私たちが作成するVBAプログラムがインタープリタ言語(解釈実行プログラム言語)であり、
Excelがコンパイラ言語(実行プログラム言語)で作成されていることを考えれば、
仮に同じアルゴリズムだとしても解釈を行わない分だけExcelに任せた方が
処理速度は速いと思います。
さらに
>結局はコンピュータの内部
>でも、くり返し文で探していると思うので、
ここですが、私もVBAがどのような処理をしているのか
知っている訳ではありません。
20年前ぐらいに他言語のインタープリタに関わったことがありますが、
このような場合に内部では「くり返し文で探す」というような
逐次検索のアルゴリズムを使っていませんでした。
(逐次検索と言うのはn個の検索データがあれば、最大検索回数がn回ですね)
この時は、ハッシュ検索と言って検索回数を1に近づける手法が使われていました。
(実際には、1ではないためにオーバーフロー処理が必要でしたが)
ハッシュ検索なんて、名前は仰々しいですが、概念は簡単ですし、
知らず知らずのうちにその手法は名前を知らなくても使っているかもしれませんよ!!
(但し、これを運用するのは難しいと思いますけど)。
ハッシュ検索でNetを検索して調べてみてください。
>
>あと計算中、大量のデータが発生し、そのデータを使ってさらに計算するとき
>その発生したデータをセルにおくのと、配列に格納するのとではどちらが
>処理が早いのでしょうか。
新規ブックの標準モジュールに
'===============================================================
Sub test()
Dim st As Double
Dim idx As Long, jdx As Long
'*****************************************************************
' 配列使用
'*****************************************************************
Application.ScreenUpdating = False
Dim marray As Variant
Range("a:b").ClearContents
st = [now()]
marray = Range("a:b").Value
For idx = 1 To 2
For jdx = 1 To 65536
marray(jdx, idx) = idx * 2 + jdx
Next
Next
Range("a:b").Value = marray
Application.ScreenUpdating = True
MsgBox Application.Text([now()] - st, "hh:mm:ss.00")
'*****************************************************************
' 配列使用しない
'*****************************************************************
Application.ScreenUpdating = False
Range("a:b").ClearContents
st = [now()]
For idx = 1 To 2
For jdx = 1 To 65536
Cells(jdx, idx).Value = idx * 2 + jdx
Next
Next
Application.ScreenUpdating = True
MsgBox Application.Text([now()] - st, "hh:mm:ss.00")
End Sub
上記のコードを実行していただければ、
原則としては、結論がでると思います。
|
|