[過去ログ]
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net (1002レス)
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1432173164/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
755: デフォルトの名無しさん [sage] 2019/03/22(金) 22:15:47.88 ID:CAtaruvO >>752 VBAはシングルスレッドだが、IEでの読み込みは同時並行的にやってくれるんじゃねえの? http://mevius.5ch.net/test/read.cgi/tech/1432173164/755
756: デフォルトの名無しさん [] 2019/03/22(金) 22:38:21.07 ID:DJ7JSKt5 >>750 ? >>751 その具体的な方法をコードで例示する形で教えていただきたいのでござるよ。 いまだと Do While readyState < 4 Do Events Loop の待ちを50個のURLで1つ1つ順番にやってて 1つのURLを読んでデータ取って閉じる、というのをやるのが社内ネットワークが遅いため(データベースからの読み込みも含まれるからの)1つあたり1分近くかかってる。 だから異常に時間がかかる。 一気に全部同時にやれないかなと。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/756
757: デフォルトの名無しさん [sage] 2019/03/22(金) 22:40:55.80 ID:tgov+uRX そんなもんそれこそ流行りのRPAでやればいいのでは http://mevius.5ch.net/test/read.cgi/tech/1432173164/757
758: デフォルトの名無しさん [sage] 2019/03/22(金) 22:40:56.05 ID:HaipTOms できるっていうくせにコードは出てこないのね http://mevius.5ch.net/test/read.cgi/tech/1432173164/758
759: デフォルトの名無しさん [sage] 2019/03/22(金) 22:57:51.11 ID:HaipTOms そもそも回線が細いのはプログラムでどうこうできないから上司を説得して諦めてもらうしかない http://mevius.5ch.net/test/read.cgi/tech/1432173164/759
760: デフォルトの名無しさん [sage] 2019/03/23(土) 01:14:24.21 ID:BU4e6Kdq 趣味でやってるんじゃなかったら 適当なダウンロードソフト使ったほうが良いんじゃない http://mevius.5ch.net/test/read.cgi/tech/1432173164/760
761: デフォルトの名無しさん [sage] 2019/03/23(土) 12:00:24.62 ID:36Js1rz1 動くかどうか試してないけど、こんな感じでいいんじゃない? もう少し効率を上げるなら、読み込めたページからさっさと処理してもいいし Sub test() pg = 50 ' 同時に開きたいページ数 Dim ie() As Object Dim url() As String ReDim ie(pg-1) ReDim url(pg-1) 'ここでURL設定 For i = 0 To pg-1 Set ie(i) = CreateObject("InternetExplorer.Application") ' ie(i).Visible = True '表示しない ie(i).navigate url(i) Next Do flg = True For i = 0 To pg-1 If ie(i).readyState < 4 Then flg = False End If Next Loop Until flg '全ページの読み込み待ち 'ここで読み込んだページを処理 End Sub http://mevius.5ch.net/test/read.cgi/tech/1432173164/761
762: デフォルトの名無しさん [] 2019/03/23(土) 15:33:38.79 ID:BqJUz3fJ >>761 ありがとうございます。 試してみます。 最初のFor Nextループがものすごく時間がかかりそうで楽しみです。 あと先日は説明の簡略化のためにシンプルに書いたけど 実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/762
763: デフォルトの名無しさん [sage] 2019/03/23(土) 19:47:18.63 ID:h2FSWEPH >>761 Exit For抜けてますよ フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/763
764: デフォルトの名無しさん [sage] 2019/03/24(日) 00:51:51.95 ID:gZMjxNOF >>752 まさかIEオブジェクトの読み込み動作がVBAのスレッドで処理されてると思ってるのか? >>753 終わりじゃないので考慮点はある コード書こうかと思ったけど、>>761さんが書いてるからまあいいか 読み込み完了の検出とかどうするか悩みどころではある イベントハンドラの動的設定か、せめてWithEventsが配列にも宣言出来ればなぁ まあ50も多重化してもオーバーヘッドかかるだけで高速化しない気がするから 数個固定で持たしてイベントハンドリングするのが現実的かもしれん http://mevius.5ch.net/test/read.cgi/tech/1432173164/764
765: デフォルトの名無しさん [sage] 2019/03/24(日) 01:34:57.18 ID:Y3S3b5Ai この場合Do Loopを抜ける条件が全ページの完了だから、Exit Forはあってもなくても結果というかスピードは変わらないね さっさと抜けたところで、またForループに戻るだけだし 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか、ForとDoの順番を逆にした方がコンパクトになりそうだなあとか http://mevius.5ch.net/test/read.cgi/tech/1432173164/765
766: デフォルトの名無しさん [sage] 2019/03/24(日) 01:38:23.22 ID:Y3S3b5Ai 一括処理なら、この方がコンパクト まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど For i = 0 To pg-1 Do Loop Until ie(i).readyState >= 4 Next http://mevius.5ch.net/test/read.cgi/tech/1432173164/766
767: デフォルトの名無しさん [sage] 2019/03/24(日) 08:29:39.64 ID:myNgr9GS >>765 > 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか C言語とかに慣れてるんだろう VBA的には ReDim ie(1 To pg) ReDim url(1 To pg) For i = 1 To pg だろうね 可能であればieとurlをTypeで纏めてそれを配列にした方が見易い http://mevius.5ch.net/test/read.cgi/tech/1432173164/767
768: デフォルトの名無しさん [sage] 2019/03/24(日) 08:58:33.34 ID:Mw3X0nZC >>766 ははは、これは笑った。確かにこれが単純明快でコンパクト w http://mevius.5ch.net/test/read.cgi/tech/1432173164/768
769: デフォルトの名無しさん [sage] 2019/03/24(日) 10:28:46.47 ID:3PVCt58k >>766 それだとサイズのでかいページで待ちが発生する Do For i If ie(i)準備完了 And i.処理フラグFalse then 処理 処理フラグTrue カウント End if Next カウント=50 exit Loop http://mevius.5ch.net/test/read.cgi/tech/1432173164/769
770: デフォルトの名無しさん [sage] 2019/03/24(日) 10:33:07.42 ID:Mw3X0nZC >>769 投げてからの待ちだからいいんじゃねえの? 俺はやったことないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ で全部取ってから次の処理なら問題ない でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは ばたばたと進んで終了、と理解している http://mevius.5ch.net/test/read.cgi/tech/1432173164/770
771: デフォルトの名無しさん [sage] 2019/03/24(日) 10:52:55.88 ID:Mw3X0nZC >>769 ああ、すまん。それがわかってる上で待ち時間がもったいない、ということね >>766もそこは注意書きはしているな http://mevius.5ch.net/test/read.cgi/tech/1432173164/771
772: デフォルトの名無しさん [] 2019/03/24(日) 10:56:37.24 ID:OZ1kvGmt IEはマイクロソフトも使うなって言ってるのに VBAって不便だよね http://mevius.5ch.net/test/read.cgi/tech/1432173164/772
773: デフォルトの名無しさん [sage] 2019/03/24(日) 11:58:25.29 ID:yYEn14s6 IE使えなくなったら、どうやってブラウザ制御するの? UIAutomation面倒くさいかから、 http://mevius.5ch.net/test/read.cgi/tech/1432173164/773
774: デフォルトの名無しさん [sage] 2019/03/24(日) 11:58:47.29 ID:yYEn14s6 getElementByしたいんだけど。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/774
775: デフォルトの名無しさん [] 2019/03/24(日) 12:34:48.16 ID:4ve/ST91 IE使えなくなったらってもう使ってる人なんていない セキュリティに甘いとこは使えるのか? http://mevius.5ch.net/test/read.cgi/tech/1432173164/775
776: デフォルトの名無しさん [sage] 2019/03/24(日) 13:28:35.85 ID:Y3S3b5Ai ちゃんと動くのか試してみた たしかにIEが複数開いて、平行処理でページを取ってくるね VBAのシングルスレッドとか完全に無関係やん http://mevius.5ch.net/test/read.cgi/tech/1432173164/776
777: デフォルトの名無しさん [sage] 2019/03/24(日) 13:33:22.28 ID:gDjNFFGJ >>776 まだそこ? http://mevius.5ch.net/test/read.cgi/tech/1432173164/777
778: デフォルトの名無しさん [sage] 2019/03/24(日) 13:36:50.26 ID:PYh3zpOu 大昔からあるファイルシステムだって非同期読み書きできる 1000倍遅いネットワークで出来ないはずがないだろうが http://mevius.5ch.net/test/read.cgi/tech/1432173164/778
779: デフォルトの名無しさん [sage] 2019/03/24(日) 13:55:48.62 ID:gDjNFFGJ >>778 無能管理職かよ http://mevius.5ch.net/test/read.cgi/tech/1432173164/779
780: デフォルトの名無しさん [sage] 2019/03/24(日) 14:55:03.02 ID:gZMjxNOF 現実的には50並列で全ページ完了待ちするのはどうもなぁ あと全力でループまわして完了待ちするのも無反応になるんじゃね とりあえずDoEvents挟もうぜ >>776 スレッド以前に、IEオブジェクトが別プロセスだから アウトプロセスのCOM使うのはVBAで並列やる、おそらく安全で簡単な唯一の方法 まあCOM作る方は大変だがな >>777 OSがサポートしてるだけで、VBAから使えるかどうかとは別の話 VBAで非同期並列やりたければ、基本的にはイベントベースでしかサポートされていない http://mevius.5ch.net/test/read.cgi/tech/1432173164/780
781: デフォルトの名無しさん [sage] 2019/03/24(日) 17:00:18.75 ID:cASdygc2 >>776 これ、1つずつ待つ部分がVBAでマルチにしたいって話だったけどCreateObjectで既に別プロセスだから全部投げてから全部の完了を待つので正解なんだよな。 勘違いしてマルチプロセスでやろうとしちゃったよ。 ついでにApplication.Runで出来なくて、迷ってたんだけど、またまた勘違いでApplication.OnTimeが正解だった。 でもOnTimeって戻り値が取れないんだよな。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/781
782: デフォルトの名無しさん [sage] 2019/03/24(日) 17:02:38.91 ID:cASdygc2 あと、ExcelVBAスレにあるようにInternetExplorer.Applicationじゃなくて別のオブジェクトの方が早いと思うよ。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/782
783: デフォルトの名無しさん [sage] 2019/03/24(日) 17:15:34.95 ID:3PVCt58k 講釈垂れはいいからコードはよ http://mevius.5ch.net/test/read.cgi/tech/1432173164/783
784: デフォルトの名無しさん [sage] 2019/03/24(日) 17:48:52.18 ID:yrUzMInJ とりあえずDoEvents。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/784
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 218 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.010s