[過去ログ]
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net (1002レス)
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1432173164/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
743: デフォルトの名無しさん [] 2019/03/22(金) 19:06:27.17 ID:DJ7JSKt5 >>742 そりゃないよ、かあちゃん http://mevius.5ch.net/test/read.cgi/tech/1432173164/743
744: デフォルトの名無しさん [sage] 2019/03/22(金) 19:28:02.41 ID:s6oj+Xdm >>741 VBAでマルチスレッドは基本的に出来ないと考えるべき。 物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。 で、マルチスレッドは出来ないけどマルチプロセスは出来る。 1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る 2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。 3.ブックを保存する。 4.メインプロシージャを動かす たぶん、こんな感じでできたはず。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/744
745: デフォルトの名無しさん [] 2019/03/22(金) 19:35:54.55 ID:DJ7JSKt5 >>744 ありがとうございます。 しかし、もし50個URLがあれば50個新しくExcel自体を起動しないといけないのですか? そんなことしたら激重になってしまうように思うのですが。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/745
746: デフォルトの名無しさん [sage] 2019/03/22(金) 19:38:23.65 ID:ls5du2vw 複数のInternetExplorer.Applicationのインスタンス立ち上げれば行けんじゃないか http://mevius.5ch.net/test/read.cgi/tech/1432173164/746
747: デフォルトの名無しさん [sage] 2019/03/22(金) 19:57:22.45 ID:HaipTOms >>746 今それができないって会話をしてたところだけど理解してる? http://mevius.5ch.net/test/read.cgi/tech/1432173164/747
748: デフォルトの名無しさん [sage] 2019/03/22(金) 20:04:27.42 ID:ls5du2vw >>747 どこでそれが出来ないって話をしてる? http://mevius.5ch.net/test/read.cgi/tech/1432173164/748
749: デフォルトの名無しさん [sage] 2019/03/22(金) 20:19:56.99 ID:HaipTOms >>748 >>742 http://mevius.5ch.net/test/read.cgi/tech/1432173164/749
750: デフォルトの名無しさん [sage] 2019/03/22(金) 20:49:35.12 ID:n3e2TSgf >>741 フレームを50個並べたページのHTMLをローカルで作って開けば一気に読み込んでくれる http://mevius.5ch.net/test/read.cgi/tech/1432173164/750
751: デフォルトの名無しさん [sage] 2019/03/22(金) 21:25:13.65 ID:uvzdlIQp なんか勘違いしてるやつがいるけど、VBAがマルチスレッドじゃないことと、IEを複数開くのはまったく別のことだからな IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ http://mevius.5ch.net/test/read.cgi/tech/1432173164/751
752: デフォルトの名無しさん [sage] 2019/03/22(金) 22:10:54.82 ID:HaipTOms >>751 そのプロセスを制御するVBAがシングルスレッドだろ http://mevius.5ch.net/test/read.cgi/tech/1432173164/752
753: デフォルトの名無しさん [sage] 2019/03/22(金) 22:13:33.32 ID:HaipTOms >>751 あ、開けば終わりと勘違いしてる? http://mevius.5ch.net/test/read.cgi/tech/1432173164/753
754: デフォルトの名無しさん [sage] 2019/03/22(金) 22:13:49.76 ID:LAgBLCyu IEにタブをいくつも開いてもらって、みんな読み込んだところでおもむろに順番に処理すればいいってことだろ。 http://mevius.5ch.net/test/read.cgi/tech/1432173164/754
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 230 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.012s