いつでも微笑みを。よつ葉のブログ

地元福山を中心に尾道や広島、岡山などの情報、Excel技、格安SIMや写真・カメラなどいろいろ。

【ExcelVBA】マクロ繰り返し処理時に止まってしまう事への対策方法


f:id:fourleaf4:20161009161049j:image

こんばんは!よつ葉です。


WindowsXPのサポート終了に伴い私の会社のPCもWindows7やWindows8に置き換わりました。

必然的にExcelも2007や2010,2013となり、XPで使用していたExcel2003とインターフェースがガラッと変わり、なれるまでは使いにくさを感じていましたが、使ううちに慣れてきました。

仕事上、Excelマクロを使用しての集計をよく使うため、今までXPで使っていたマクロをそのままExcel2007以降で使おうと移行していたのですが、その際に困ったことが起こりました。

複数のデータを開いたり閉じたりの繰り返し処理時に、突然途中で止まってしまいます。エラー等出る訳でも無く、画面更新のみ止まる訳でもなく…。ん?と思いExcel画面をクリックすると、思い出したようにまた動き始めます。Excel2003で動かすとこのようなことは起こらず、Excel2007,Excel2010,Excel2013で動かすと発生します。発生するタイミングはマチマチ。

.xlsのままなのがいけないのかと思い、.xlsm(2007以降形式)に変えて実行も同症状。

夜間処理等が多いため、この途中で止まる現象は非常に厄介でした。


その後いろいろ調べた結果、解決方法が見つかりました。

それは繰り返し処理のところにDoEvents関数を入れる事でした。

DoEvents関数は、発生したイベントがオペレーティングシステムによって処理されるように制御を戻す関数で、処理を実行している場合、ユーザーが行った操作は処理が終了するまでオペレーティングシステムに渡らないため、処理を中断するような場合は、DoEvents関数で一時的にオペレーティングシステムに制御を移し、
イベントの処理を行ってくれます。

正直、はっきりとした理由はあまり分かっていませんが、繰り返し処理は再描画も受け付けない程のスピードで動きコマンド等も受け付けずメモリがいっぱいになってしまう(?)のをDoEvents関数でいったん解放するようなイメージかなと勝手に思っています。


実際にDoEventsを入れる事で途中で処理が止まるのは回避できるようになりました。

ただデメリットとしては、繰り返し処理中に都度オペレーティングシステムに制御を移すので、当然ながら処理にかかる時間は伸びてしまいました。

ただ処理が止まってしまうよりはよっぽどいいので一旦はこれで解決しました。


詳しい原因が分かっていないので、何か分かる方がおられましたらコメント頂ければありがたいです。

 

お付き合いいただきありがとうございました。

以上、よつ葉でした。