VBAを使った質問ならなんでもござれ
本来の対象であるオフィスアプリを操作する以外の話もOK
ゲーム作り、Webアクセス、外部アプリの操作
COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど
VBAで実行するものであればなんでも質問してください
VBAを開発環境としていろいろ作っちゃいましょう
前スレ
VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/
関連スレ
Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/
Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/
VBプログラマ質問スレ(Ver.6.0 まで) part64
http://peace.2ch.net/test/read.cgi/tech/1393069842/
Excel総合相談所 118 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1430352555/
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2015/05/21(木) 10:52:44.71ID:KLv0vQmm681デフォルトの名無しさん
2018/12/27(木) 09:18:35.23ID:psUgzr4+682デフォルトの名無しさん
2018/12/27(木) 09:19:34.30ID:lhYnw8ev >>675
最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。
ちゃんと省略せずにWorkbookやWorksheetから書くようにする。
しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。
以下はスマホ上で書いてるんで動くかは不明です。
最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。
ちゃんと省略せずにWorkbookやWorksheetから書くようにする。
しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。
以下はスマホ上で書いてるんで動くかは不明です。
683デフォルトの名無しさん
2018/12/27(木) 09:20:24.73ID:lhYnw8ev Option Explicit
Sub practice()
Dim i As Long
Dim fullPath As String
Dim wb As Workbook
'Anothersheetじゃ分かりにくいんでopnShtに変更。
Dim opnSht As Worksheet
'追加シートは変数に受けないの?
Dim addSht As Worksheet
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
fullPass = Thisworkbook.Worksheets("Sheet1").Range("B3").Value
'B3に出鱈目書いて動かしたらどうなるんだろう?
Set wb = Workbooks.Open(fullPath)
Set opnSht = wb.Worksheets("カピバラ情報")
With Thisworkbook
Set addSht = .WorkSheets.Add( After:=.WorkSheets("Sheet1"))
End With
'Range("A1").Selectって何の為に有るの?
'iの初期値を一番最初に書いてたけど、初めて見たとき何だか分からんかった。
'使う直前に関連処理と一緒にまとめた方が分かり易いよね。
i=4
Do While opnSht.Cells(5, i).Value <> ""
i = i + 1
Loop
'元のCall wb.Closeなどという書き方をしたことが無いのでいつもの自分の書き方に変更。
wb.Close False
End Sub
Sub practice()
Dim i As Long
Dim fullPath As String
Dim wb As Workbook
'Anothersheetじゃ分かりにくいんでopnShtに変更。
Dim opnSht As Worksheet
'追加シートは変数に受けないの?
Dim addSht As Worksheet
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
fullPass = Thisworkbook.Worksheets("Sheet1").Range("B3").Value
'B3に出鱈目書いて動かしたらどうなるんだろう?
Set wb = Workbooks.Open(fullPath)
Set opnSht = wb.Worksheets("カピバラ情報")
With Thisworkbook
Set addSht = .WorkSheets.Add( After:=.WorkSheets("Sheet1"))
End With
'Range("A1").Selectって何の為に有るの?
'iの初期値を一番最初に書いてたけど、初めて見たとき何だか分からんかった。
'使う直前に関連処理と一緒にまとめた方が分かり易いよね。
i=4
Do While opnSht.Cells(5, i).Value <> ""
i = i + 1
Loop
'元のCall wb.Closeなどという書き方をしたことが無いのでいつもの自分の書き方に変更。
wb.Close False
End Sub
684デフォルトの名無しさん
2018/12/27(木) 09:22:53.65ID:lhYnw8ev685デフォルトの名無しさん
2018/12/27(木) 09:26:03.58ID:lhYnw8ev 早速間違いだ。
fullPassと書いてる所が一ヶ所ある。
fullPathに直しておいてね。
fullPassと書いてる所が一ヶ所ある。
fullPathに直しておいてね。
686デフォルトの名無しさん
2018/12/27(木) 11:21:46.87ID:coxr7jtk687デフォルトの名無しさん
2018/12/27(木) 11:57:21.88ID:psUgzr4+688デフォルトの名無しさん
2018/12/27(木) 12:23:02.37ID:psUgzr4+ 少し言葉足らずでした。
iのカウント(空白行までループ)は上手く出来ているので、現マクロ有効ブックの新シートに取得情報を
書き込めていないようです。
iのカウント(空白行までループ)は上手く出来ているので、現マクロ有効ブックの新シートに取得情報を
書き込めていないようです。
689デフォルトの名無しさん
2018/12/27(木) 12:57:12.54ID:lhYnw8ev >>688
うん?
Do〜Loopの中はiのカウントアップしてるだけなので、あなたが省略した(と勝手に思ってるんだけど)コードが動いていないということ?
念のためにいうと、元々のコードには情報を取得するコードが全く無いからこのコードだけじゃ取り込めないのは当たり前だよね。
うん?
Do〜Loopの中はiのカウントアップしてるだけなので、あなたが省略した(と勝手に思ってるんだけど)コードが動いていないということ?
念のためにいうと、元々のコードには情報を取得するコードが全く無いからこのコードだけじゃ取り込めないのは当たり前だよね。
690デフォルトの名無しさん
2018/12/27(木) 13:47:48.84ID:psUgzr4+ すいません、
不覚に気づき、
dim j as long
j = 1
を追加し、ループを
Do While opnSht.Cells(5, i).Value <> ""
addSht.cells(j,1) = opnSht.Cells(i, 5)
j = i
i = i + 1
Loop
にして上手くいきました、ありがとうございます。
不覚に気づき、
dim j as long
j = 1
を追加し、ループを
Do While opnSht.Cells(5, i).Value <> ""
addSht.cells(j,1) = opnSht.Cells(i, 5)
j = i
i = i + 1
Loop
にして上手くいきました、ありがとうございます。
691デフォルトの名無しさん
2018/12/27(木) 13:57:20.08ID:psUgzr4+ 細かい修正として
j = i
i = i + 1
の部分も
i = i + 1
j = i - ○
のようにして、
無駄にできてしまう空白もなくしました。
お付き合いしてくださった方、
ありがとうございました。
j = i
i = i + 1
の部分も
i = i + 1
j = i - ○
のようにして、
無駄にできてしまう空白もなくしました。
お付き合いしてくださった方、
ありがとうございました。
692デフォルトの名無しさん
2019/01/03(木) 04:15:42.29ID:aAVkqECP 質問です
ワークシート上にすでに引かれている複雑な枠線をコードとしてどうにか変換というか取得できる方法はないでしょうか…
ワークシート上にすでに引かれている複雑な枠線をコードとしてどうにか変換というか取得できる方法はないでしょうか…
693デフォルトの名無しさん
2019/01/03(木) 04:35:53.91ID:Em9anKIf >>692
描くのの逆をするだけじゃ?
描くのの逆をするだけじゃ?
694デフォルトの名無しさん
2019/01/03(木) 13:29:44.69ID:aAVkqECP695デフォルトの名無しさん
2019/01/03(木) 14:57:12.35ID:9QrYctZ6 何をしたいのか書いてよ
罫線の設定状況を知りたいだけならRange.Borders見なよとしか言えないし
https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.borders
罫線の設定状況を知りたいだけならRange.Borders見なよとしか言えないし
https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.borders
696デフォルトの名無しさん
2019/01/03(木) 15:15:01.64ID:Em9anKIf >>694
罫線を描く動作は理解できてる?
マクロ記録で簡単に調べられますよ。
例えば、2行2列選んで、縦横斜め全てに実線入れて
記録されたものを見ればどのような構造で描かれているのか
分かります。
記録の際は、xl〜の定数でよいですが、取得の際は数値で
返ってくるので注意。
調べたければオブジェクトブラウザで調べてもよいですが、
イミディエイトで、?xlThin みたいに簡単に確認する方法も
あります。
でも、取得して使うなら数値のままでもOKです。
ここまではOK?
罫線を描く動作は理解できてる?
マクロ記録で簡単に調べられますよ。
例えば、2行2列選んで、縦横斜め全てに実線入れて
記録されたものを見ればどのような構造で描かれているのか
分かります。
記録の際は、xl〜の定数でよいですが、取得の際は数値で
返ってくるので注意。
調べたければオブジェクトブラウザで調べてもよいですが、
イミディエイトで、?xlThin みたいに簡単に確認する方法も
あります。
でも、取得して使うなら数値のままでもOKです。
ここまではOK?
697デフォルトの名無しさん
2019/01/03(木) 16:26:50.99ID:+aY40et6698デフォルトの名無しさん
2019/01/03(木) 16:38:04.35ID:CdG5H8Qg699デフォルトの名無しさん
2019/01/03(木) 17:30:36.94ID:Em9anKIf >>697
シート保護で十分みたいですね。
もし何らかの理由で保護できないのであれば、
同フォーマットの隠しシートから書式貼り付けした方が早そう。
セル結合もあるし、1セルずつ罫線情報取得とか効率悪すぎ。
シート保護で十分みたいですね。
もし何らかの理由で保護できないのであれば、
同フォーマットの隠しシートから書式貼り付けした方が早そう。
セル結合もあるし、1セルずつ罫線情報取得とか効率悪すぎ。
700デフォルトの名無しさん
2019/01/03(木) 22:01:21.27ID:aAVkqECP >>698
>>699
それがわかりながらあらゆる所(不規則)を動かさないといけない時があったりで、保護だと都合が悪かったんです
フォーマット自体を大幅に変更できればもっと色々と簡単にできるのですが、それも他のおばあちゃんたちが前の方が良かった〜なんて必ず言うので見た目を崩すことはできません
担当のおばあちゃんorおばさんが変われば書式貼り付けのための範囲選択も上手くできないだろうから(全選択など知りません)また誰かが黙って長時間四苦八苦する事になってしまいます
無駄にすべて最初からやろうとしたりも平気であります
平均年齢49才の職場なので仕方ないんです
誰にも聞かずに戻したい部分を戻せるような、とーーってもわかりやすい説明付きのボタンをユーザーフォーム上にでもいくつか作ってあげたいと思っています
崩してしまうパターンはだいたい把握できているので、それが最善かなと…
>>699
それがわかりながらあらゆる所(不規則)を動かさないといけない時があったりで、保護だと都合が悪かったんです
フォーマット自体を大幅に変更できればもっと色々と簡単にできるのですが、それも他のおばあちゃんたちが前の方が良かった〜なんて必ず言うので見た目を崩すことはできません
担当のおばあちゃんorおばさんが変われば書式貼り付けのための範囲選択も上手くできないだろうから(全選択など知りません)また誰かが黙って長時間四苦八苦する事になってしまいます
無駄にすべて最初からやろうとしたりも平気であります
平均年齢49才の職場なので仕方ないんです
誰にも聞かずに戻したい部分を戻せるような、とーーってもわかりやすい説明付きのボタンをユーザーフォーム上にでもいくつか作ってあげたいと思っています
崩してしまうパターンはだいたい把握できているので、それが最善かなと…
701デフォルトの名無しさん
2019/01/04(金) 02:06:01.37ID:+nkelZ7z >>700
いや、だから隠しシートから自動的に書式修復をかければという意味で言うたのですが、、
トリガーはファイルオープンでも、ボタンでも。
試しにやってみたけど、罫線やセル結合は問題なく修復できるみたい。
入力規則とかは引き継げないみたいなので別にケアする必要があるかも。
行挿入、列挿入とかされて座標がかわるようなことされないならこれで十分では?
自分がよくやるのは、表のエリア毎に範囲名をつけて、そのエリア単位で最初に表組みした
ときと同じ要領で表作成を記録していき、コードを整理して修復マクロにします。
これなら起点となるセルが壊されなければ行挿入、列挿入にもある程度柔軟に対応
できるし、式や入力規則の修復も追加できる。
まぁ、利用者は作成者の想定を軽く超えてきますけどね。
いや、だから隠しシートから自動的に書式修復をかければという意味で言うたのですが、、
トリガーはファイルオープンでも、ボタンでも。
試しにやってみたけど、罫線やセル結合は問題なく修復できるみたい。
入力規則とかは引き継げないみたいなので別にケアする必要があるかも。
行挿入、列挿入とかされて座標がかわるようなことされないならこれで十分では?
自分がよくやるのは、表のエリア毎に範囲名をつけて、そのエリア単位で最初に表組みした
ときと同じ要領で表作成を記録していき、コードを整理して修復マクロにします。
これなら起点となるセルが壊されなければ行挿入、列挿入にもある程度柔軟に対応
できるし、式や入力規則の修復も追加できる。
まぁ、利用者は作成者の想定を軽く超えてきますけどね。
702デフォルトの名無しさん
2019/01/04(金) 08:59:12.57ID:jYRqvj54703デフォルトの名無しさん
2019/01/19(土) 20:28:43.04ID:gUifgf+0 ディム a アズ インテジャー
コンスト b アズ バリアント = ファルス
この読み方はあってますか?
コンスト b アズ バリアント = ファルス
この読み方はあってますか?
704デフォルトの名無しさん
2019/01/19(土) 20:32:43.51ID:b1memYXI さいごフォルス
705デフォルトの名無しさん
2019/01/20(日) 08:43:51.62ID:KJwN8fo6 マジか!
自信なくなってきたわ。
フォー イーチ 〇 イン、スターコンブ、ブイビーナロウ、コンカット、
ナンバーフォーマットローカル、ドゥ ホワイル、イズナメリック、
デカー ファンクション セットウインドウロング リブ "ユーザー32" エリアス、
バイバル 〇 アズ ブーラン、アプリケーション.ハウンド、オプション エクスプリシト。
自信なくなってきたわ。
フォー イーチ 〇 イン、スターコンブ、ブイビーナロウ、コンカット、
ナンバーフォーマットローカル、ドゥ ホワイル、イズナメリック、
デカー ファンクション セットウインドウロング リブ "ユーザー32" エリアス、
バイバル 〇 アズ ブーラン、アプリケーション.ハウンド、オプション エクスプリシト。
706デフォルトの名無しさん
2019/01/20(日) 09:19:09.77ID:1t0h4eLG numeric ニューメリック
alias エイリアス
boolean ブーリアン
alias エイリアス
boolean ブーリアン
707デフォルトの名無しさん
2019/01/20(日) 09:40:31.66ID:brNktcWU ディクレィア
708デフォルトの名無しさん
2019/01/20(日) 12:50:34.64ID:gJkAP+bh ぶーりーんっておもってた
709デフォルトの名無しさん
2019/01/20(日) 14:02:45.95ID:1t0h4eLG 「デカー」ってなんのことだ?
710デフォルトの名無しさん
2019/01/21(月) 06:06:27.68ID:FqoKwBp9 ぶーりん ってよんでた
711デフォルトの名無しさん
2019/01/21(月) 06:58:21.81ID:NbFzEAOW712デフォルトの名無しさん
2019/01/21(月) 08:09:02.73ID:jhC9vbHJ713デフォルトの名無しさん
2019/01/21(月) 14:53:02.35ID:SqTYfLos バイバリュー
714デフォルトの名無しさん
2019/01/31(木) 16:04:06.71ID:f4/Ws+Wz パワポでExcelのVBAにある
Application.OnUndo
みたいなことって出来ない?
Application.OnUndo
みたいなことって出来ない?
715デフォルトの名無しさん
2019/01/31(木) 23:51:12.55ID:eWv6zdmK Application.CommandBars.ExecuteMso "Undo"
716デフォルトの名無しさん
2019/02/01(金) 00:00:16.48ID:BWIWaKpf undoをフックできるか?って質問の気がするが
717デフォルトの名無しさん
2019/02/01(金) 15:41:12.07ID:lbEDOgk3718デフォルトの名無しさん
2019/02/01(金) 19:24:08.72ID:69So7CMb 質問スレでいつも思うんだけど、どんな状況でそれが必要なの?
Excelで出来るんなら、逆にExcelをパワポっぽく見せるという手もあるんじゃないの?
Excelで出来るんなら、逆にExcelをパワポっぽく見せるという手もあるんじゃないの?
719デフォルトの名無しさん
2019/02/02(土) 00:14:40.30ID:hkITps2T 勉強もかねてパワポのアドイン作ってるのよ
だからExcelじゃなくてパワポで出来なきゃ意味がない
その機能自体が必須で欲しい訳ではないから出来ないなら出来ないで諦める
だからExcelじゃなくてパワポで出来なきゃ意味がない
その機能自体が必須で欲しい訳ではないから出来ないなら出来ないで諦める
720デフォルトの名無しさん
2019/02/08(金) 13:11:59.73ID:WrxcLohJ 何か斬新な使い方って無い?
ワードでファミコンみたいな。
ワードでファミコンみたいな。
721デフォルトの名無しさん
2019/02/09(土) 00:13:31.38ID:nXE2v5Lv Functionで値を返すのと、ByRefで返すの、どう使い分けたらいいのか、わからなくなってきた。
どっちでも返せる状況なら、どっちがいい?
どっちでも返せる状況なら、どっちがいい?
722デフォルトの名無しさん
2019/02/09(土) 00:37:08.95ID:gPze9fmT 他人とか将来の自分が読みやすいようにFunctionで
723デフォルトの名無しさん
2019/02/09(土) 00:41:30.67ID:ThSbhyi3 処理によるとしか
724デフォルトの名無しさん
2019/02/09(土) 04:25:25.62ID:6oInKB58 Function一択
ByRefは古い書き方で互換性のために残してる
これから作るプログラムには使うべきじゃない
ByRefは古い書き方で互換性のために残してる
これから作るプログラムには使うべきじゃない
725デフォルトの名無しさん
2019/02/09(土) 09:13:25.95ID:NnmcfWng726デフォルトの名無しさん
2019/02/09(土) 09:25:22.06ID:ThSbhyi3 ByRefが互換性維持のために存在するという話は聞いたことがないぞ
727デフォルトの名無しさん
2019/02/27(水) 18:52:45.21ID:0gstYK5t sortのcustomorderって、セル値を入れられたりはするのでしょうか?
複数のセル値を優先順位としてデータを並び替えるマクロを作成したのですが動作が遅いので改善出来ればと考えています。(forとifで判定する手法をとっています)
よろしくお願いします
複数のセル値を優先順位としてデータを並び替えるマクロを作成したのですが動作が遅いので改善出来ればと考えています。(forとifで判定する手法をとっています)
よろしくお願いします
728デフォルトの名無しさん
2019/03/02(土) 08:39:42.60ID:PK2Geudt 標準のソート機能で出来ないことでもやるの?
駄目ならSQL使うとか。
駄目ならSQL使うとか。
729デフォルトの名無しさん
2019/03/19(火) 09:29:22.78ID:3/8oXV0g VBAがどっとNet対応
キターーーー!
キターーーー!
730デフォルトの名無しさん
2019/03/19(火) 10:26:45.09ID:NT4YoXBH Select from…
懐かしいな
懐かしいな
731デフォルトの名無しさん
2019/03/19(火) 11:16:03.50ID:7F9Wq7Fv >>729
?
?
732デフォルトの名無しさん
2019/03/19(火) 22:45:44.06ID:i2FNQUrb さて、名前付き範囲ってVBA@Excelで使えないんだろうか。
もし使えたとして、実行時間はどうなのだろうか。
色々と謎が多い。
もし使えたとして、実行時間はどうなのだろうか。
色々と謎が多い。
733デフォルトの名無しさん
2019/03/19(火) 23:22:30.00ID:/asoePaH >>732
それ使うと後でエラー見つけるのめんんどくさくなる
それ使うと後でエラー見つけるのめんんどくさくなる
734デフォルトの名無しさん
2019/03/20(水) 00:38:39.23ID:vmDq6MjZ735デフォルトの名無しさん
2019/03/20(水) 16:11:53.05ID:VkiUMgxP >>733
横からだけど、どう面倒になるの?
横からだけど、どう面倒になるの?
736デフォルトの名無しさん
2019/03/20(水) 19:48:02.99ID:lxQ2zmLg >>735
セルの編集したときに壊れてた
セルの編集したときに壊れてた
737デフォルトの名無しさん
2019/03/20(水) 21:06:17.96ID:ad3N4bFR 名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる
738デフォルトの名無しさん
2019/03/21(木) 01:35:24.94ID:XMapNPTs なんで正規表現?
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない
739デフォルトの名無しさん
2019/03/21(木) 07:27:32.08ID:u3u8nbsq >>736
それおま環だろ
それおま環だろ
740デフォルトの名無しさん
2019/03/21(木) 07:34:08.81ID:u3u8nbsq >>737
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う
741デフォルトの名無しさん
2019/03/22(金) 17:57:33.45ID:DJ7JSKt5 会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな?
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな?
742デフォルトの名無しさん
2019/03/22(金) 18:35:53.24ID:HaipTOms >>741
VBAはマルチスレッド非対応だから無理
VBAはマルチスレッド非対応だから無理
743デフォルトの名無しさん
2019/03/22(金) 19:06:27.17ID:DJ7JSKt5 >>742
そりゃないよ、かあちゃん
そりゃないよ、かあちゃん
744デフォルトの名無しさん
2019/03/22(金) 19:28:02.41ID:s6oj+Xdm >>741
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。
1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす
たぶん、こんな感じでできたはず。
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。
1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす
たぶん、こんな感じでできたはず。
745デフォルトの名無しさん
2019/03/22(金) 19:35:54.55ID:DJ7JSKt5746デフォルトの名無しさん
2019/03/22(金) 19:38:23.65ID:ls5du2vw 複数のInternetExplorer.Applicationのインスタンス立ち上げれば行けんじゃないか
747デフォルトの名無しさん
2019/03/22(金) 19:57:22.45ID:HaipTOms >>746
今それができないって会話をしてたところだけど理解してる?
今それができないって会話をしてたところだけど理解してる?
748デフォルトの名無しさん
2019/03/22(金) 20:04:27.42ID:ls5du2vw >>747
どこでそれが出来ないって話をしてる?
どこでそれが出来ないって話をしてる?
749デフォルトの名無しさん
2019/03/22(金) 20:19:56.99ID:HaipTOms750デフォルトの名無しさん
2019/03/22(金) 20:49:35.12ID:n3e2TSgf >>741
フレームを50個並べたページのHTMLをローカルで作って開けば一気に読み込んでくれる
フレームを50個並べたページのHTMLをローカルで作って開けば一気に読み込んでくれる
751デフォルトの名無しさん
2019/03/22(金) 21:25:13.65ID:uvzdlIQp なんか勘違いしてるやつがいるけど、VBAがマルチスレッドじゃないことと、IEを複数開くのはまったく別のことだからな
IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる
IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ
IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる
IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ
752デフォルトの名無しさん
2019/03/22(金) 22:10:54.82ID:HaipTOms >>751
そのプロセスを制御するVBAがシングルスレッドだろ
そのプロセスを制御するVBAがシングルスレッドだろ
753デフォルトの名無しさん
2019/03/22(金) 22:13:33.32ID:HaipTOms >>751
あ、開けば終わりと勘違いしてる?
あ、開けば終わりと勘違いしてる?
754デフォルトの名無しさん
2019/03/22(金) 22:13:49.76ID:LAgBLCyu IEにタブをいくつも開いてもらって、みんな読み込んだところでおもむろに順番に処理すればいいってことだろ。
755デフォルトの名無しさん
2019/03/22(金) 22:15:47.88ID:CAtaruvO >>752
VBAはシングルスレッドだが、IEでの読み込みは同時並行的にやってくれるんじゃねえの?
VBAはシングルスレッドだが、IEでの読み込みは同時並行的にやってくれるんじゃねえの?
756デフォルトの名無しさん
2019/03/22(金) 22:38:21.07ID:DJ7JSKt5757デフォルトの名無しさん
2019/03/22(金) 22:40:55.80ID:tgov+uRX そんなもんそれこそ流行りのRPAでやればいいのでは
758デフォルトの名無しさん
2019/03/22(金) 22:40:56.05ID:HaipTOms できるっていうくせにコードは出てこないのね
759デフォルトの名無しさん
2019/03/22(金) 22:57:51.11ID:HaipTOms そもそも回線が細いのはプログラムでどうこうできないから上司を説得して諦めてもらうしかない
760デフォルトの名無しさん
2019/03/23(土) 01:14:24.21ID:BU4e6Kdq 趣味でやってるんじゃなかったら
適当なダウンロードソフト使ったほうが良いんじゃない
適当なダウンロードソフト使ったほうが良いんじゃない
761デフォルトの名無しさん
2019/03/23(土) 12:00:24.62ID: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
もう少し効率を上げるなら、読み込めたページからさっさと処理してもいいし
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
762デフォルトの名無しさん
2019/03/23(土) 15:33:38.79ID:BqJUz3fJ >>761
ありがとうございます。
試してみます。
最初のFor Nextループがものすごく時間がかかりそうで楽しみです。
あと先日は説明の簡略化のためにシンプルに書いたけど
実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。
ありがとうございます。
試してみます。
最初のFor Nextループがものすごく時間がかかりそうで楽しみです。
あと先日は説明の簡略化のためにシンプルに書いたけど
実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。
763デフォルトの名無しさん
2019/03/23(土) 19:47:18.63ID:h2FSWEPH >>761
Exit For抜けてますよ
フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います
あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。
Exit For抜けてますよ
フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います
あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。
764デフォルトの名無しさん
2019/03/24(日) 00:51:51.95ID:gZMjxNOF765デフォルトの名無しさん
2019/03/24(日) 01:34:57.18ID:Y3S3b5Ai この場合Do Loopを抜ける条件が全ページの完了だから、Exit Forはあってもなくても結果というかスピードは変わらないね
さっさと抜けたところで、またForループに戻るだけだし
個人的には「pg - 1」が何回も出てくるのが美しくないなあとか、ForとDoの順番を逆にした方がコンパクトになりそうだなあとか
さっさと抜けたところで、またForループに戻るだけだし
個人的には「pg - 1」が何回も出てくるのが美しくないなあとか、ForとDoの順番を逆にした方がコンパクトになりそうだなあとか
766デフォルトの名無しさん
2019/03/24(日) 01:38:23.22ID:Y3S3b5Ai 一括処理なら、この方がコンパクト
まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど
For i = 0 To pg-1
Do
Loop Until ie(i).readyState >= 4
Next
まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど
For i = 0 To pg-1
Do
Loop Until ie(i).readyState >= 4
Next
767デフォルトの名無しさん
2019/03/24(日) 08:29:39.64ID:myNgr9GS >>765
> 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか
C言語とかに慣れてるんだろう
VBA的には
ReDim ie(1 To pg)
ReDim url(1 To pg)
For i = 1 To pg
だろうね
可能であればieとurlをTypeで纏めてそれを配列にした方が見易い
> 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか
C言語とかに慣れてるんだろう
VBA的には
ReDim ie(1 To pg)
ReDim url(1 To pg)
For i = 1 To pg
だろうね
可能であればieとurlをTypeで纏めてそれを配列にした方が見易い
768デフォルトの名無しさん
2019/03/24(日) 08:58:33.34ID:Mw3X0nZC >>766
ははは、これは笑った。確かにこれが単純明快でコンパクト w
ははは、これは笑った。確かにこれが単純明快でコンパクト w
769デフォルトの名無しさん
2019/03/24(日) 10:28:46.47ID:3PVCt58k >>766
それだとサイズのでかいページで待ちが発生する
Do
For i
If ie(i)準備完了 And i.処理フラグFalse then
処理
処理フラグTrue
カウント
End if
Next
カウント=50 exit
Loop
それだとサイズのでかいページで待ちが発生する
Do
For i
If ie(i)準備完了 And i.処理フラグFalse then
処理
処理フラグTrue
カウント
End if
Next
カウント=50 exit
Loop
770デフォルトの名無しさん
2019/03/24(日) 10:33:07.42ID:Mw3X0nZC >>769
投げてからの待ちだからいいんじゃねえの?
俺はやったことないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ
で全部取ってから次の処理なら問題ない
でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの
だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは
ばたばたと進んで終了、と理解している
投げてからの待ちだからいいんじゃねえの?
俺はやったことないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ
で全部取ってから次の処理なら問題ない
でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの
だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは
ばたばたと進んで終了、と理解している
771デフォルトの名無しさん
2019/03/24(日) 10:52:55.88ID:Mw3X0nZC772デフォルトの名無しさん
2019/03/24(日) 10:56:37.24ID:OZ1kvGmt IEはマイクロソフトも使うなって言ってるのに
VBAって不便だよね
VBAって不便だよね
773デフォルトの名無しさん
2019/03/24(日) 11:58:25.29ID:yYEn14s6 IE使えなくなったら、どうやってブラウザ制御するの?
UIAutomation面倒くさいかから、
UIAutomation面倒くさいかから、
774デフォルトの名無しさん
2019/03/24(日) 11:58:47.29ID:yYEn14s6 getElementByしたいんだけど。
775デフォルトの名無しさん
2019/03/24(日) 12:34:48.16ID:4ve/ST91 IE使えなくなったらってもう使ってる人なんていない
セキュリティに甘いとこは使えるのか?
セキュリティに甘いとこは使えるのか?
776デフォルトの名無しさん
2019/03/24(日) 13:28:35.85ID:Y3S3b5Ai ちゃんと動くのか試してみた
たしかにIEが複数開いて、平行処理でページを取ってくるね
VBAのシングルスレッドとか完全に無関係やん
たしかにIEが複数開いて、平行処理でページを取ってくるね
VBAのシングルスレッドとか完全に無関係やん
777デフォルトの名無しさん
2019/03/24(日) 13:33:22.28ID:gDjNFFGJ >>776
まだそこ?
まだそこ?
778デフォルトの名無しさん
2019/03/24(日) 13:36:50.26ID:PYh3zpOu 大昔からあるファイルシステムだって非同期読み書きできる
1000倍遅いネットワークで出来ないはずがないだろうが
1000倍遅いネットワークで出来ないはずがないだろうが
779デフォルトの名無しさん
2019/03/24(日) 13:55:48.62ID:gDjNFFGJ >>778
無能管理職かよ
無能管理職かよ
780デフォルトの名無しさん
2019/03/24(日) 14:55:03.02ID:gZMjxNOF■ このスレッドは過去ログ倉庫に格納されています
