|
▼よろずや さん:
おはようございます。久しぶりですね!!
>実験に当たって、オブジェクトのメモリサイズばかり気にしてますが、
>何かの機能を呼び出せばその機能を実現するためのDLLが呼び出されます。
>(既にメモリ上にあればそれを使います)
>さらに、DLLがワークエリアとして使うメモリもあります。
>(必要量の数倍の領域を順繰りに使ったり、使用済みの領域を返却することもあります)
>それらの挙動は複雑ですので数回の実行では本当の事は分かりません。
↑、これは、
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28448;id=excel
の「実験2だけでは、ADOの繰り返し処理が確実に安全か否かは
わからない」
ということでしょうか?
それはそうだと思いますし、私も思い当たるふしもあります。
例えば、Workbook.Open()で
繰り返し、同一のブックを呼び出し、閉じるを行った場合、
Sub main()
Dim flno As Long
Dim idx As Long
Dim rbk As Workbook
flno = FreeFile()
Open ThisWorkbook.Path & "\memlog.csv" For Output As #flno
Print #flno, "NO,使用メモリー,空きメモリー,トータル"
For idx = 1 To 5000
Set rbk = Workbooks.Open(ThisWorkbook.Path & "\readbk.xls")
rbk.Close False
With Application
Print #flno, idx & "," & .MemoryUsed & "," & .MemoryFree & "," & .MemoryTotal
End With
Next idx
Close #flno
End Sub
これ実は、ログファイルの結果を見ると使用メモリーは増えていません。
が繰り返し処理の動作が目視でわかるくらい鈍くなり、
最後はメモリー不足というエラーを起こします。
(Win98 & Excel2000(SP-3)でしか試していませんが)
よって、よろずや さんがおっしゃっている
「挙動は複雑ですので数回の実行では本当の事は分かりません」
とおりだと思います。
(ちなみにこれ、ループ中にDoevents入れることで回避できると思っていましたが、
今朝はテストできませんでした。)
「実験2だけでは、ADOの繰り返し処理が確実に安全か否かは
わからない」
は更なる実験や経験が必要かもしれません。
でも、実験2でもメモリー管理に問題があるとしたら、
ExcelでADO(Excelブック)の使用に???が付いてしまいますが・・。
ただ、私が投稿した実験1と実験2とでは、
使用メモリの動向は明らかに違っています
(Excel2002 Sp-3 Excel2002sp-3において)。
EXCEL_VBA中の下さんが「処理が重くなって」
とおっしゃった大きな原因ではないかという仮説は成り立ちます。
後は、前述のように
>・マクロと対象データが入っているブックを分けること。
>・ADOで処理している間は対象ブックを開かない
等の仕様で
EXCEL_VBA中の下さんが「処理が重くなって」
という現象が回避できるかということだと思います。
そして実験2については、私ももう少し考えてもます。
ご指摘、ありがとうございます。
|
|