【EXCEL VBA】Excelのマルチスレッド(マルチプロセス)サンプルを発見

http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html

http://www.excelhero.com/blog/2010/05/multi-threaded-vba-update.html

ここのブログのWebスクレイピングのサンプルがマルチ処理の参考になったのでメモ

サンプルコードはここのブログの文中にあるリンクからダウンロードした。

ソースを見ると、マルチ処理を実現する手法としては、

ポイント①Excel VBAからVBscriptを生成する。(ここでマルチ処理用に複数個のscriptを生成)

ポイント②生成されたVBscriptは処理実行後の結果をExcelシートにコピーする。

といったロジックになっている。(マルチプロセス)

このへんがキモ!

他にも、隠しフォームの周期監視処理((JavascriptのsetIntervalの応用)で処理完了数(状態)をチェックしていたり、名前付きセルをうまく使っていたり、IEやMSXML2を使った場合のサンプルコードもあったり、非常に参考になることが多かった。ブログの名前に偽りがないさすがExcelヒーロー

ポイント①Excel VBAからVBscriptを生成する。(複数個)

Swarm_Method => CreateVBScriptAgentAndLaunch より

     ‘ Run VBScript file
    Set wshShell = CreateObject("Wscript.Shell")
    wshShell.Run """" & sFileName & """"

ポイント②生成されたVBscriptは処理実行後の結果をExcelシートにコピーする。

※サンプルを実行すると生成されるコード(SwarmAgent_xx.vbs)より抜粋

Set oXL = GetObject(, "Excel.Application")

‘ Write results to Excel sheet

oXL.workbooks("multithreaded_vba_excelhero.com_experimental.xls").sheets("Demo").Range("$E$80:$L$80") = vResults

ちなみに、ここでダウンロードできるサンプルはExcel2013(64bit)ではすぐ動かなかった。

Sleep にPtrSafeがなくエラーになったので、PtrSafe を追記した。

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

マルチ処理のためにCreatethread/Createprocess等で苦労するより、VBAでできる範囲で頑張る感じが、無理が少なくて良い感じがする。

コメント

タイトルとURLをコピーしました