[過去ログ] VBAなんでも質問スレ Part2 [転載禁止]©2ch.net (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
735
(1): 2019/03/20(水)16:11 ID:VkiUMgxP(1) AAS
>>733
横からだけど、どう面倒になるの?
736
(1): 2019/03/20(水)19:48 ID:lxQ2zmLg(1) AAS
>>735
セルの編集したときに壊れてた
737
(1): 2019/03/20(水)21:06 ID:ad3N4bFR(1) AAS
名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる
738: 2019/03/21(木)01:35 ID:XMapNPTs(1) AAS
なんで正規表現?
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない
739: 2019/03/21(木)07:27 ID:u3u8nbsq(1/2) AAS
>>736
それおま環だろ
740: 2019/03/21(木)07:34 ID:u3u8nbsq(2/2) AAS
>>737
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う
741
(3): 2019/03/22(金)17:57 ID:DJ7JSKt5(1/4) AAS
会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな?
742
(2): 2019/03/22(金)18:35 ID:HaipTOms(1/7) AAS
>>741
VBAはマルチスレッド非対応だから無理
743: 2019/03/22(金)19:06 ID:DJ7JSKt5(2/4) AAS
>>742
そりゃないよ、かあちゃん
744
(1): 2019/03/22(金)19:28 ID:s6oj+Xdm(1) AAS
>>741
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。

1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす

たぶん、こんな感じでできたはず。
745: 2019/03/22(金)19:35 ID:DJ7JSKt5(3/4) AAS
>>744
ありがとうございます。
しかし、もし50個URLがあれば50個新しくExcel自体を起動しないといけないのですか?
そんなことしたら激重になってしまうように思うのですが。
746
(1): 2019/03/22(金)19:38 ID:ls5du2vw(1/2) AAS
複数のInternetExplorer.Applicationのインスタンス立ち上げれば行けんじゃないか
747
(1): 2019/03/22(金)19:57 ID:HaipTOms(2/7) AAS
>>746
今それができないって会話をしてたところだけど理解してる?
748
(1): 2019/03/22(金)20:04 ID:ls5du2vw(2/2) AAS
>>747
どこでそれが出来ないって話をしてる?
749: 2019/03/22(金)20:19 ID:HaipTOms(3/7) AAS
>>748
>>742
750
(1): 2019/03/22(金)20:49 ID:n3e2TSgf(1) AAS
>>741
フレームを50個並べたページのHTMLをローカルで作って開けば一気に読み込んでくれる
751
(3): 2019/03/22(金)21:25 ID:uvzdlIQp(1) AAS
なんか勘違いしてるやつがいるけど、VBAがマルチスレッドじゃないことと、IEを複数開くのはまったく別のことだからな

IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる
IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ
752
(2): 2019/03/22(金)22:10 ID:HaipTOms(4/7) AAS
>>751
そのプロセスを制御するVBAがシングルスレッドだろ
753
(1): 2019/03/22(金)22:13 ID:HaipTOms(5/7) AAS
>>751
あ、開けば終わりと勘違いしてる?
754: 2019/03/22(金)22:13 ID:LAgBLCyu(1) AAS
IEにタブをいくつも開いてもらって、みんな読み込んだところでおもむろに順番に処理すればいいってことだろ。
755: 2019/03/22(金)22:15 ID:CAtaruvO(1) AAS
>>752
VBAはシングルスレッドだが、IEでの読み込みは同時並行的にやってくれるんじゃねえの?
756: 2019/03/22(金)22:38 ID:DJ7JSKt5(4/4) AAS
>>750

>>751
その具体的な方法をコードで例示する形で教えていただきたいのでござるよ。

いまだと
Do While readyState < 4
Do Events
Loop
の待ちを50個のURLで1つ1つ順番にやってて
1つのURLを読んでデータ取って閉じる、というのをやるのが社内ネットワークが遅いため(データベースからの読み込みも含まれるからの)1つあたり1分近くかかってる。
だから異常に時間がかかる。
一気に全部同時にやれないかなと。
757: 2019/03/22(金)22:40 ID:tgov+uRX(1) AAS
そんなもんそれこそ流行りのRPAでやればいいのでは
758: 2019/03/22(金)22:40 ID:HaipTOms(6/7) AAS
できるっていうくせにコードは出てこないのね
759: 2019/03/22(金)22:57 ID:HaipTOms(7/7) AAS
そもそも回線が細いのはプログラムでどうこうできないから上司を説得して諦めてもらうしかない
760: 2019/03/23(土)01:14 ID:BU4e6Kdq(1) AAS
趣味でやってるんじゃなかったら
適当なダウンロードソフト使ったほうが良いんじゃない
761
(3): 2019/03/23(土)12:00 ID:36Js1rz1(1) AA×

762: 2019/03/23(土)15:33 ID:BqJUz3fJ(1) AAS
>>761
ありがとうございます。
試してみます。
最初のFor Nextループがものすごく時間がかかりそうで楽しみです。
あと先日は説明の簡略化のためにシンプルに書いたけど
実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。
763: 2019/03/23(土)19:47 ID:h2FSWEPH(1) AAS
>>761
Exit For抜けてますよ
フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います

あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。
764: 2019/03/24(日)00:51 ID:gZMjxNOF(1/2) AAS
>>752
まさかIEオブジェクトの読み込み動作がVBAのスレッドで処理されてると思ってるのか?
>>753
終わりじゃないので考慮点はある

コード書こうかと思ったけど、>>761さんが書いてるからまあいいか
読み込み完了の検出とかどうするか悩みどころではある
イベントハンドラの動的設定か、せめてWithEventsが配列にも宣言出来ればなぁ

まあ50も多重化してもオーバーヘッドかかるだけで高速化しない気がするから
数個固定で持たしてイベントハンドリングするのが現実的かもしれん
1-
あと 238 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.026s