[[20211027130524]] 『疑似並列処理』(レイ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『疑似並列処理』(レイ)

時間のかかる処理を含むマクロがあり、マクロの実行中もシートを編集できるようにするため、時間のかかる部分だけを別のブックに移して疑似的に並列処理したいと考えています。
メインとサブのふたつのマクロブックを用意して、メインのほうから

 Dim subApp As Excel.Application
 Set subApp = CreateObject("Excel.Application") 
 subApp.Workbooks.Open 別のブックの名前

というように別インスタンスで開いたサブのブックに時間のかかる部分の作業を投げる感じです。
メインのほうでサブのブックを操作するにはsubAppでアプリケーションを指定できますが、逆にサブのほうでメインのブックを操作したい場合にはどのような方法があるでしょうか。

< 使用 Excel:unknown、使用 OS:Windows10 >


 >マクロの実行中もシートを編集できるようにするため
 ↑だけだったら、ループ内にDoEvents入れるだけで解決しないですか。

(tkit) 2021/10/27(水) 13:50


tkit様

紛らわしい書き方ですみません。シートの編集も手作業ではなく自動化されたものです。
マクロの機能が1〜10あるとすると、機能1は処理時間が長いので、その実行中でも機能2〜10を自由に利用できるようにしたいというイメージです。
(レイ) 2021/10/27(水) 14:07


 >↑だけだったら、ループ内にDoEvents入れるだけで解決しないですか。
 編集するとマクロが止まりますね。
 VBScriptで疑似マルチスレッドにするか、他のExcel以外のアプリで処理するか
 ですかね。

 >時間のかかる部分だけを別のブックに移して疑似的に並列処理したい
 どの程度の時間なんでしょう?
 私なら、まず、ここを可能な限り高速化しますけど。

(tkit) 2021/10/27(水) 14:10


 >機能1は処理時間が長いので、その実行中でも機能2〜10を自由に利用できるようにしたい
 ご存知かと思いますが、マクロは2重起動(という言い方が正しいか分かりませんが)出来ません。
 検討されている案もダメだったと思います。

 もし、データ編集的なものであれば、
 データを配列にして、VBSに渡してマクロ終わり
 VBSで編集、テキスト保存、終了メッセージ出力
 マクロでテキスト読み込み、貼り付け
 みたいなイメージなら、いけそうです。

(tkit) 2021/10/27(水) 14:20


tkit様

別プロセスで起動したからと言って並列処理できるわけではないのですね…。
きちんと調べないまま思いつきで質問してしまいました、すみません。

最初から詳しく書けばよかったのですが、作成しているのはACCESSとの連携アプリで、時間がかかっているのは単純にデータベースが置いてあるサーバーが重いからなので、処理自体の高速化は難しそうです。(待ち時間はだいたい30秒ぐらいです。ローカルに落としたファイルからの取得ならば1秒もかかりません)

VBScriptは知らないので少し勉強してみます。
ありがとうございました。
(レイ) 2021/10/27(水) 14:31


 >別プロセスで起動したからと言って並列処理できるわけではないのですね…。

 私の環境(MicroSoft365)でテストした限りでは、
 別々に動いているようでしたけども・・

(半平太) 2021/10/27(水) 21:07


 ↑
 検証方法がおかしいかも知れない。ちょっと自信なくなった。

(半平太) 2021/10/27(水) 21:09


半平太さん
> 別々に動いているようでしたけども・・

自身のブックを操作するならいけると思うけど、
マクロが動いている別ブックの操作はどうだろう。
もし、出来たら危険な気がします。

試してないので分からないですが。

レイさん
> 逆にサブのほうでメインのブックを操作したい場合にはどのような方法があるでしょうか。

GetObject関数で既に開いているエクセルのインスタンスを取得できるので、それで試してみてはどうでしょう。
(hatena) 2021/10/27(水) 21:20


 >マクロが動いている別ブックの操作はどうだろう。

 こっちで自在に操作と言うことじゃないです
 (できるかも知れないですが、そこまで首を突っ込んでないです)
 取敢えず、こっちは、別インスタンスのエクセルでブックを開くだけです。

 そして、あっちのブックのOpenイベントで、あっちがやりたいマクロを起動したってことです。

(半平太) 2021/10/27(水) 21:28


下記で並列処理にチャレンジしてますね。

https://www.excel-chunchun.com/entry/2019/03/27/005233

https://excel-ubara.com/vba_class/VBA_CLASS_06.html
(hatena) 2021/10/27(水) 21:30


半平太 様
hatena 様

回答ありがとうございます。
GetObject関数で取得できるのですね。調べてもなかなか出てこなかったので助かりました。
参考URLにある別ブックのイベントを補足することで処理をスイッチするやり方も目から鱗でした。
自宅にPCがないのですぐに検証はできないのですが後ほど試してみようと思います。

(レイ) 2021/10/28(木) 05:23


 >私の環境(MicroSoft365)でテストした限りでは、別々に動いているようでしたけども・・
 私の検証が悪かったですね。

 ただ、現状の問題(ACCESSの応答)を解決するために
 Excelだけで編集のマルチスレッド化するのは少々危険かなぁと
 思いました。

 1つのマクロブックだけで実現するとしたら、
 私の考えは↓にするかな、と。

 機能1-1
 1.VBAで、VBSのコードを文字列で記述して、適当なところに保存
 2.保存したVBSを起動(VBA自体はここで終わる)

 VBSの処理
 1.ACCESSの処理
   VBSでのACCESS操作参考
   https://garafu.blogspot.com/2018/09/vbscript-access.html
 2.あらかじめ決められたところに、処理結果のデータをcsv等のテキストで保存
 3.実行結果をMsgBoxで出力する
 4.自身を消す

 機能1-2
 1.結果テキストファイルが無ければ終了
 2.結果テキストファイルを読み込み、貼り付け
 3.結果テキストファイル消去

(tkit) 2021/10/28(木) 11:03


 > こっちで自在に操作と言うことじゃないです
 > (できるかも知れないですが、そこまで首を突っ込んでないです)

 ThisWorkbookモジュールにPublic属性のメソッドとかを書き込んでおけば
 CallByNameで自在に操作出来そう。

 レイさんが具体的にどんなコードを使っているのか(使いたいのか)分からないので、
 実地検証までは出来ませんけども。

(半平太) 2021/10/30(土) 16:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.