[過去ログ]
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net (1002レス)
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1432173164/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
736: デフォルトの名無しさん [sage] 2019/03/20(水) 19:48:02.99 ID:lxQ2zmLg >>735 セルの編集したときに壊れてた http://mevius.5ch.net/test/read.cgi/tech/1432173164/736
737: デフォルトの名無しさん [sage] 2019/03/20(水) 21:06:17.96 ID:ad3N4bFR 名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる http://mevius.5ch.net/test/read.cgi/tech/1432173164/737
738: デフォルトの名無しさん [sage] 2019/03/21(木) 01:35:24.94 ID:XMapNPTs なんで正規表現? 完全一致でいいじゃろ? SortedListなら量に正比例して増えることはない http://mevius.5ch.net/test/read.cgi/tech/1432173164/738
739: デフォルトの名無しさん [sage] 2019/03/21(木) 07:27:32.08 ID:u3u8nbsq >>736 それおま環だろ http://mevius.5ch.net/test/read.cgi/tech/1432173164/739
740: デフォルトの名無しさん [sage] 2019/03/21(木) 07:34:08.81 ID:u3u8nbsq >>737 > 正規表現か何かで逐次マッチ検索してるはずだから なんだその意味不明な思い込みはw 普通に考えてハッシュなりB-Treeなり使ってるだろ そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う http://mevius.5ch.net/test/read.cgi/tech/1432173164/740
741: デフォルトの名無しさん [] 2019/03/22(金) 17:57:33.45 ID:DJ7JSKt5 会社でブラウザの検索結果のページで いっぱいURLのリンク先が表示されるのですが そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。 IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが 1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。 この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな? http://mevius.5ch.net/test/read.cgi/tech/1432173164/741
742: デフォルトの名無しさん [sage] 2019/03/22(金) 18:35:53.24 ID:HaipTOms >>741 VBAはマルチスレッド非対応だから無理 http://mevius.5ch.net/test/read.cgi/tech/1432173164/742
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 237 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s