・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でできる範囲で頑張る感じが、無理が少なくて良い感じがする。
コメント