Excel VBA 質問スレ Part59

■ このスレッドは過去ログ倉庫に格納されています
2019/02/09(土) 15:12:30.70ID:3lTArmdf0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part58
https://mevius.5ch.net/test/read.cgi/tech/1542577644/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
556デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/02/28(木) 13:23:20.67ID:qor22oN3H
柔軟性がある人は出世するからね
2019/02/28(木) 13:59:45.70ID:TjDXn6TQM
>>555
後々のテスト工程考えてるからじゃない?
そこまで考慮しなくても…となる気持ちは分かる
2019/02/28(木) 14:20:36.03ID:x4ZPjfd7M
考慮すべき場面とするべきでない、しても意味がない場面の判断ができないとも言える
559デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/02/28(木) 14:36:57.48ID:qor22oN3H
だから日本は開発が遅いんだよ
アジャイルでやれ
2019/02/28(木) 14:57:38.31ID:7AaSmpPf0
想定される状況なんか結局は本人にしか分からないし、説明すんのもめんどくさい
まあ本人が気付いてないこともあるけど
2019/02/28(木) 17:57:19.76ID:3CdGs56rM
>>555
決めつけで語って指摘されたら逆ギレかよ w
2019/02/28(木) 18:42:40.55ID:jqfgz8pY0
ーーここまで型変換関数なしーー

身内が意味がわかるっていうなら変換関数抜きにしてもいいかもしれない、けどコンテキスト的に関数噛ませたい
2019/02/28(木) 18:45:13.08ID:OctLDBwCx
Debug.Assertも割とよく使う
2019/02/28(木) 21:21:18.29ID:7AaSmpPf0
Variant使わなきゃいい
2019/02/28(木) 22:12:12.40ID:TWIU4lxdM
>>564
いやいやいやいや
ByRef As Variant
の意味論がわかってないだろ
2019/02/28(木) 23:20:59.71ID:JVzuLoidx
Variant型がないとそれはそれで不便
実行時にならないと変数の保持データの参照型やデータ構造が決定できないような関数を定義するときには必須
Object型では限界があるし、多態性とか考えたら特に
2019/03/01(金) 00:53:35.24ID:oijdm3qva
VBAにもInterfaceがあるの知らない人かな
2019/03/01(金) 08:24:19.03ID:KSyELWIpd
だから意識して使うぶんには良いんだよ。
Variant配列で高速化は良くやるだろ。
あるいはあえていろんな型を受け付ける関数を作る場合とか。

俺はInteraceはあまり使わんね。
同じプロパティを持ったクラスを複数作ってグループとして使う場合でもそこまでしなくて良いだろと考える。
2019/03/01(金) 08:58:16.79ID:IB7Yh9y1a
プログラムの基本的な良い習慣を実践すればVariantなんてそう使うことはない
使うとしてもシートIOなど僅かな用途だけだから業務ロジックまで影響することはまずない
570デフォルトの名無しさん (ワッチョイ 9f90-W5e4)
垢版 |
2019/03/01(金) 09:03:46.13ID:BWIoX5Sk0
プロ雑談者どものくだらん蘊蓄語り合いなんぞどうでも良いから質問者の方々は
遠慮なさらずにどうぞ〜
2019/03/01(金) 12:55:03.48ID:3XNO5Z9qM
コードって色々書く場所あると思うんですけど、ある程度共通の切り分けってあるんですか?
フォームにはあまりややこしいものはかかないで標準モジュールを使うとか。
逆にフォームで書けるものは複雑でもそこで終わらせたほうがいいとか。
今迷ってるのはシート1のデータを加工してシート2のデータにマージさせる場合どこに書けばいいんだろうってことです。
そのシートごとに別けるとバラけて解りにくくなるしみたいな感じです。
2019/03/01(金) 13:04:09.15ID:SCR8DJeBM
所詮VBAだしどうでもいいよ
VBAの可読性・保守性を高める唯一の指針があるとしたら、極力VBAを書かないでワークシートの機能を活用することかな
573デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/03/01(金) 13:26:59.89ID:HgS5037SH
>>571
標準モジュールに Sub MergeSheet1To2 とか作ってCallすれば、他人が処理部を見なくても「このボタンを押すとマージされるんだなぁ」と想像ができる。
自分はフォーム内は処理に使うデータのチェックくらいにしてる。
2019/03/01(金) 14:04:11.91ID:+h/xS+gL0
フォームモジュールって細々としたイベントのプロシージャであふれちゃって見にくい
だからできるだけ標準モジュールに切り分けてる
例えばフォーム上の複数のTextBoxに全く同じ入力規則を設けたい時なんかは
TextBox・KeyCode・Shiftを引数とするプロシージャを標準モジュールに書いて使い回ししてる
さっきもそういうの書いてた
2019/03/01(金) 17:47:45.49ID:jYXMQwAma
>>571
シート1 IOクラス
シート2 IOクラス
コンバータークラス
マージサービスクラス
2019/03/01(金) 18:53:01.98ID:KSyELWIpd
>>571
そのフォームで完結させたい時はフォームに全部書く。
汎用的なのは標準モジュール、汎用的でなくてもいろんな所から使い回す場合も標準モジュールだな。
シートモジュールにはシートのイベントプロシージャ以外書かないのが基本だけどそのシートのイベントプロシージャと一緒にしたい理由でシートモジュールに書くこともある。

意味論というか、何処に書くかは内容で決める。その方が後でコード見る時に視認性も良くなる。
2019/03/01(金) 20:10:20.22ID:9ceAGmrya
俺ならスコープで書く場所変えてる
2019/03/01(金) 20:18:09.30ID:S/p2I5Nx0
シート1だけでしか使わない関数はシート1
その関数の中で使う関数で他でも使う汎用関数は標準モジュール
シート1のデータを加工ってあるが、それが将来にでも他のシートでも使いそうならその加工関数は汎用化して
標準モジュール。 シート1でしか使わないのならその加工関数はシート1に書く
579デフォルトの名無しさん (ワッチョイ 9f7c-L+km)
垢版 |
2019/03/01(金) 21:39:17.32ID:41cCIQF20
上級者の人がどう使っているかなんとなく解ったような気がします。とりあえず
【クラスモジュール】汎用性のある関数
【標準モジュール】 大きな処理
【シートモジュール】【フォーム】極力使わないが他と絡まない短いコードなら完結しても良い
という感じで試してみようと思います。
あとは関数名の最後に呼び出しする関数がある場所を付けてみようと思います。
何をやりたいかで構成も変わると思うのでそこらへんも加味しながら試してみます。
参考になりました、ありがとうございます!
2019/03/01(金) 22:34:27.56ID:KieDV9lDM
ここに上級者なんていないぞ
2019/03/01(金) 22:48:58.94ID:eQhW3/JV0
>>579
関数名の最後になにを付けるって?
2019/03/01(金) 23:05:06.38ID:jYXMQwAma
また一人、道に迷ってしまった
やっぱりVBAで勉強するのは非推奨ダナ
2019/03/01(金) 23:30:05.02ID:zWZoP6hm0
>>546
俺もmsgbox。
イミデは、知らないうちにウインドウが消えちゃうから。
プロパティもそう。
何で勝手に消えるんだろ。
2019/03/02(土) 01:21:31.95ID:Po9hNmd9x
>>579
汎用性のある関数を記載する場所だけど、VBAの仕様ではクラスモジュールではなく標準モジュールの方が都合が良いよ
何故なら自作のクラスモジュールに記述した関数を呼び出す場合、その自作クラスのオブジェクトのインスタンスを生成した後にそのオブジェクトのメソッドとして書くという手間が要る
つまりマシンメメモリの無駄食いになるしコーディング量も増える
標準モジュールならば関数名を書くだけで呼べるので余程気楽

適当にググったときに出てくる、OOP原理主義のJavaプログラマあたりが言うところの「汎用性のある関数はクラスに」っていう考え方は、VBAには当てはまらないので注意だよ
2019/03/02(土) 02:50:08.40ID:eoNuxzNL0
>>572
ワークシートなんて可読性最悪じゃん
セルには数式が1つしか書けないし条件付き書式も内容を確認するのが面倒

条件付き書式が設定されてる範囲を視覚化する方法ってないよな?俺が知らないだけ?
2019/03/02(土) 03:08:30.41ID:vHLv5v7t0
>>585
数式タブ→数式の表示
2019/03/02(土) 09:24:48.87ID:Po9hNmd9x
>>572
>>585
可読性を高める唯一の方針とは言わんが、正直下手に変数にブックレベル以上の参照スコープを持たせて値やオブジェクトを操作するくらいならワークシートの機能を使った方がよくねって場面はいくらでもあるな
エラーとかでプログラムが停止したときにセル値と違って変数に格納された参照ポインタは揮発するし
2019/03/02(土) 09:34:34.03ID:heck9gfNa
ワークシート関数の何が良いかというと副作用がないことだよ
ぶっちゃけ重要なのはそこだけ
それ以外ではセル内にだらだら式を書くと醜いなどデメリットしかない

なのでVBAで普通に副作用がない関数を書けばいい
副作用のない関数ならVBAからもセル内式からも使いやすい
しかもセル内式と違って見やすく管理しやすい
2019/03/02(土) 09:47:47.22ID:Po9hNmd9x
VBAの方が見やすくて管理しやすくてワークシート関数は見にくいって図式が成り立つかどうかは正直処理を書くやつのスキル次第だけどな

ワークシート関数は必ず内部スコープが()で括られるリスト形式だから、処理構造が簡潔に可視化できるメリットがあるとも言えるわけだし
2019/03/02(土) 10:15:37.68ID:VydunwR60
自分は>>572とほぼ正反対のやり方でやってきた
シートは使い捨てのデータとちょっとした設定情報を置いたり、あとは結果を出力する場所としてしか使わないな。
使い捨てのは別だけど、ツールとして繰り返し使うブックのシートに関数はほぼ書いてない。
2019/03/02(土) 10:26:10.19ID:heck9gfNa
>>589
セル内数式はネスト入るとすぐに醜くなるじゃん
それに式に名前をつけて管理できないのもメンテナンス性を悪化させてる
2019/03/02(土) 10:34:03.78ID:1SfH4HCRa
>>591
式に名前を付けたければ単一値ならセルに名前付けりゃいいし、ベクトルならテーブルにしてカラム名付けりゃいい
VBAで関数自作してもいい
VBAの中でループぶん回すよりは遥かに見通し良いわ
2019/03/02(土) 10:46:06.68ID:heck9gfNa
>>592
そもそもセル名前自体が管理しにくいので論外
セル名と数式の関係性がパッと見てわからないし
セル名と数式がひも付けられて管理されてると言われなきゃ後任が気付かない
VBA関数ならこの関数名はこの定義って誰でも一目でわかる

本来の出力でない余計なカラムはノイズになって邪魔
名前で管理したい項目が増えたらノイズだらけになってなにを説明したい表なのかわからなくなる
2019/03/02(土) 10:57:15.96ID:ZJ+HN4z+0
visual studioに慣れ切ってしまってるのでVBAエディタがマジで苦手・・・
2019/03/02(土) 11:26:41.59ID:PSsyx6QoM
>>593
VBAでワークシート関数を作るのは否定しないよ
最悪なのはワークシート関数(VBA含む)でできることをVBA内でループ回す馬鹿
2019/03/02(土) 11:40:34.50ID:heck9gfNa
>>595
こ文脈でループを回すの意味がわからないしどっから出てきて何を意味してるんだ?
2019/03/02(土) 13:55:25.27ID:WupyvY1Q0
話変わるがセルのコピーとか移動したときに条件付き書式が壊れてやたら重くなって直すの苦労したことある
2019/03/02(土) 15:18:36.62ID:EfeqCtIS0
お前らまず、
ワークシートの機能を活用する
というのをどういうことかちゃんと合わせてから話してくれるか
2019/03/02(土) 18:22:41.70ID:BmvnLX83x
>>598
ワークシートの機能ってのはワークシートの機能一般のことでしかないだろ
ワークシートの特定の機能を想定して話をしてるんじゃない
ワークシートの機能を使えば事足りる処理をわざわざVBAのスクラッチでやろうとするのは車輪の再発明の極みだという話
2019/03/02(土) 19:24:09.91ID:PK2Geudt0
ワークシートって言いすぎww
Withでまとめたくなってきたわ。
2019/03/02(土) 19:30:50.79ID:6n8BrDHBH
With ワークシート
.の機能ってのは
.の機能一般のことでしかないだろ
.の特定の機能を想定して話をしてるんじゃない
.の機能を使えば事足りる処理をわざわざVBAのスクラッチでやろうとするのは車輪の再発明の極みだという話
End With
2019/03/02(土) 20:23:41.79ID:VydunwR60
ワークシートの機能って単独のワークシート関数で実現できることなの?
それをVBAでやるのは確かに馬鹿らしい。
そうじゃないならVBAのほうがいいな。
2019/03/03(日) 01:17:47.50ID:5kU0Dorz0
>599
だからワークシートの機能一般ってなんのことを言ってるの?
セルの計算式?
計算式用のワークシート関数?
Application.WorksheetFunction?
2019/03/03(日) 03:16:39.28ID:1gVEOeax0
VBA以外のExcelで出来ること全てだろ
理解力低過ぎないか?
2019/03/03(日) 11:57:08.93ID:XBWTxj+a0
なんでVBAを外すのか分からない
このスレにいる連中ならワークシートにはイベントも含まれるという感覚の方が普通でしょ
2019/03/03(日) 12:44:05.38ID:87SKey7q0
シートを方眼紙だと思っている人の視点での機能一般だろう。
ここの人たちは、クラスモジュールの1つくらいの感覚かもしれんが。
607デフォルトの名無しさん (ワッチョイ 377c-vuRV)
垢版 |
2019/03/03(日) 14:18:18.29ID:ilhG1tLW0
そこはかとなく臭うというか湧き出るダサさが嫌い
2019/03/03(日) 18:57:15.36ID:dGd12yAna
EXCELの全ての機能のうちVBAを除いた残りってことじゃね
2019/03/03(日) 19:26:33.74ID:2dKZwCIHx
エクセルのオブジェクトモデルでメソッドが提供されてるような機能をわざわざVBAでスクラッチするなって意味もあるんじゃね
ListObjectオブジェクト(テーブル)の存在や機能を知らずに、同一列内のセル数式ほコピーの機能を自作するような話だろ
2019/03/03(日) 20:55:07.59ID:C10iXUczM
初心者です。わかる方いましたらお教えください。

IE.Visible = False
として、
IE.Quitが何らかの理由で実行されなかったり、それを書かなかった場合
どうなってしまうんでしょうか…?
バックグラウンドでずっとフワフワといるんでしょうか?
見方もよくわからないタスクマネージャーで見てみるとアプリケーションとしてはたぶん起動されていませんでした…
IE.Visible = Falseとした場合はもしかして特に閉じる指示が必要ないのでしょうか…?
2019/03/03(日) 21:00:52.17ID:sl8Y8jOC0
>>610
バックグラウンドでずっと動き続ける、が正解

ちゃんと起動してないのはコードがおかしいかタスクマネージャの見方がおかしい
そこをTrueに変えるだけでちゃんとIEのウィンドウが表示されるか確認
2019/03/03(日) 21:44:32.70ID:C10iXUczM
>>611
Trueに変えるだけで表示はされたので、タスクマネージャーの見方がおかしかったようです
ちゃんとバックグラウンドなんとかの欄では起動されていました
ありがとうございました…
2019/03/04(月) 09:46:01.18ID:TvaJY4yu0
関数使うかVBA使うかも内容で決める。
関数だと物凄く重くなることがある。
Sumproductとかを多用した場合とか、複数シートの集計を1日の集計としてさらに1ヶ月分の集計するとか。
自動計算を切れば良いんだけど、運用で微妙だね。
それに昔、銀行の仕事で大量のデ―タとSumproductのせいで1回の計算でさえいつまでたっても終わらないことがあった。
その時はVBAに書いたら5秒で終わった。
2019/03/04(月) 10:53:05.90ID:RuY9YBtCM
ワークシート関数を関数と表現するのってUSBメモリをUSBと呼ぶのと同様にアレな感じ
2019/03/04(月) 10:55:32.34ID:TFGUk6BN0
その違和感を持てる知識がない頭が残念な人なんだろ
616デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/03/04(月) 11:15:22.83ID:gwy/L6iPH
WorksheetFunctionプロパティで呼ぶもの(sumとかvlookupとか)がワークシート関数
VBAでしか使えないもの(CIntとかInstrとか)がVBA関数
上記と自作関数をまとめて関数
2019/03/04(月) 11:25:35.49ID:vFn2j9Kt0
>VBA関数
標準関数だろう
エクセルの場合はVBA標準関数とでも言うべきか

>自作関数
ユーザー定義関数という名称がある

まぁ俺は関数としか呼ばんけどな、ハハハ
vbaでワークシート関数使う時はそう呼ぶ
618デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/03/04(月) 11:45:46.92ID:gwy/L6iPH
>>617
2019/03/04(月) 14:30:16.31ID:TvaJY4yu0
関数とVBAと対比させてるのに勘違いする奴がいるとはとても思えないが。
いたらそいつはアホだよ。
2019/03/04(月) 14:32:37.46ID:TFGUk6BN0
>>619
馬鹿が恥の上塗りに来ましたよ、と
2019/03/04(月) 14:57:43.98ID:TvaJY4yu0
>>620
あらら、アホが恥の上塗りに来たよw
2019/03/04(月) 15:02:35.15ID:vFn2j9Kt0
vbaだし何でもええやろ
どうせ大事に至ることはない、争う程の事ではない
2019/03/04(月) 15:28:20.01ID:TFGUk6BN0
>>621
馬鹿はVBAに関数がないと思っているのか?
馬鹿は早く死ねよ
2019/03/04(月) 16:20:08.03ID:RuY9YBtCM
「文脈上USBメモリのことであるとわかるときはUSBでいい」

「そもそもそんな呼び方普段からするなよ」
2019/03/04(月) 18:20:48.65ID:FDpjfwBmM
わかるかどうか判断するのは読み手側だからな
書く側が勝手に略すのは読ませる気がないんだろう
2019/03/04(月) 23:23:23.24ID:dF1M3atd0
そういえばCD-ROM2をロムって呼んでたやついたな

これSUPER CD-ROM2だから
2019/03/05(火) 00:24:00.61ID:YDI1bFmR0
ID:TvaJY4yu0みたいな馬鹿がメンテできなくなるVBAを作る
2019/03/05(火) 00:37:29.46ID:yUBkGE+g0
jsのAPI使える人いる?
使い方がサッパリ分からない

https://docs.microsoft.com/ja-jp/office/dev/add-ins/excel/excel-add-ins-advanced-concepts
https://docs.microsoft.com/ja-jp/office/dev/add-ins/reference/overview/excel-add-ins-reference-overview
629デフォルトの名無しさん (アウアウエー Sadf-vuRV)
垢版 |
2019/03/05(火) 03:34:27.88ID:VDry4yCPa
馬鹿には無理
2019/03/05(火) 05:56:45.90ID:pou1Iepn0
>>628
見てきたけど、なんかすげえめんどくさそう。出来ることも見新しいことってほとんどないじゃん
普通のWin32APIとかやったことあるのか。そっち勉強した方が遥かにまし。 VBAでもやれるから
2019/03/05(火) 07:48:42.24ID:VSxyPtP8a
いやMacとかOffice Onlineで使えることに意味があるんだろ
まあOffice Online使うくらいならGSuite使うという企業が殆どだろうけどw
2019/03/05(火) 08:12:27.21ID:yUBkGE+g0
>>628
はこういう事だった
誰も使ってないのね
https://qiita.com/y__na_ka_ya_ma/items/2575e79248978ff7828d

>>629
自己紹介乙

>>630-631
もちろんやれることは同じ
jsで書ける事自体がメリット
googleSpreadsheetのマクロを移植する時に使える
一生に一回もないと思うけどな
2019/03/05(火) 08:56:53.06ID:K5flI6jox
Win32APIとOffice JavaScriptAPIどっちを勧めるかと聞かれたら今なら後者かな
後者の案件あるのか知らんが
2019/03/05(火) 12:20:11.68ID:IGhfqt8ja
そもそも全くの別物を比較してどうすんねん
2019/03/05(火) 12:44:55.98ID:bZMGULjeF
>>623
日本語が理解出来ないようだな。
VBAと関数を対比させているんだからここで関数と言ってるのは"VBAの関数"のことでは無いと解釈するのがまともな日本人だ。


>>624
???
それは日本語として変だ。
USBメモリはUSBでは無い。
VBAの関数は関数ではある。
そもそもの例が適当でないわけだ。

>>625
文脈や、やり取りでVBAの関数なのかワークシート関数なのかを判断する必要があるのは>>66>>142>>172も一緒だ。
お前らと違って普通の日本人は文脈ややり取りから判断出来てるんだよ。
>>614のようなことを言い出すのはお前らのような頓珍漢な奴らだけだよ。
2019/03/05(火) 12:47:21.71ID:bZMGULjeF
>>142>>186>>448
も文脈で判断するな。
2019/03/05(火) 12:51:32.81ID:bZMGULjeF
>>634
正にその通り。
Win32APIではじめて出来ることがjsで出来るなら分かるけどね。
2019/03/05(火) 13:01:00.32ID:yUBkGE+g0
>>634
あぁやっぱりそうだよね
知識不足かと思って調べてしまったわ
2019/03/05(火) 13:14:26.63ID:YDI1bFmR0
ID:bZMGULjeF

マジモンのアスペルガーのキチガイ
2019/03/05(火) 13:18:51.34ID:yUBkGE+g0
jsアドインもう少しぐらい使われてるのかと思ったけど、
誰も使ってないようで安心した
641デフォルトの名無しさん (ワッチョイ 377c-nl/e)
垢版 |
2019/03/05(火) 13:32:20.37ID:YOwkwz810
Excel Python API とかも Excel.js Office.js とかと同じ扱いになる悪寒
2019/03/05(火) 13:36:30.59ID:yUBkGE+g0
>>641
ゲェッ
vbaはこの手軽さが最強の武器なのに、VSからアドイン作成とかあまりに残念すぎる
2019/03/05(火) 20:23:23.29ID:ruLmgCaM0
>>639
これだからアホは困る。
お前、出版社にはクレーム入れるなよw

https://www.amazon.co.jp/gp/aw/s/ref=nb_sb_noss?k=Excel+関数
2019/03/05(火) 20:34:12.08ID:ruLmgCaM0
URLエンコードしてなかったな。

https://www.amazon.co.jp/gp/aw/s/ref=nb_sb_noss?k=Excel+%e9%96%a2%e6%95%b0
2019/03/05(火) 20:39:11.81ID:yUBkGE+g0
逆引き系辞典はネットあると本当に使わない
2019/03/05(火) 21:11:49.71ID:WmyrgrGT0
会社で異動になった人が作ったマクロの稀に出るバグを直そうと頑張っています。
ちょっと怪しいかなと思ったプロシージャがあるので見にくく長いと思うのですが見て頂けませんか?
勉強しながらの初心者です。

Sub wait(IE As InternetExplorer)
Const リトライ = 2
Dim IEDOC As HTMLDocument
Dim ReCount As Long,i As Long

Do
«略»
Set IEDOC = IE.Document
«略»
Loop While IEDOC Is Nothing

If IEDOC.frames.Length < リトライ Then
ReCount = リトライ
Else
ReCount = IEDOC.frames.Length
End If

For i = 0 To ReCount
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Next
End Sub
このあとすぐに書き込みに参ります
2019/03/05(火) 21:26:50.63ID:WmyrgrGT0
オレンジの部分がIE.Busy = Trueという風に教科書通りになっていないのですがこれで大丈夫なのでしょうか
上手いことちゃんとなっているか調べようとやってみましたが私には難しかったです

そして水色の部分なのですが、フレーム数を取得してその数だけ念の為回しておくという感じでしょうか
フレームがいくつかあると取得のたびにIE.BusyがTrue,Falseに切り替わると聞いたのでそのためで合っていますか
それよりもさっき調べて出てきた

'完全にドキュメントが読み込まれるまで待機する
Do Until IE.document.ReadyState = "complete"
DoEvents
Loop
ではダメなのでしょうか、別物でしょうか

ざっとみておかしい部分はありますか?
図々しくすみません

https://i.imgur.com/DQxGNB5.jpg
2019/03/05(火) 21:32:38.87ID:WmyrgrGT0
どういうマクロかと言うと、IEを開いてリンクボタンをいくつか押して文字を引っ張ってきてIEを閉じるというのを何度か繰り返すものです。
リンク先を正しく閉じられていないまま次の回転に入っていることが稀にあるのです
2019/03/05(火) 21:58:09.97ID:yUBkGE+g0
>>646
別物だな

>>646はvbaオブジェクトのプロパティ
WebBrowserControl.ReadyState
https://docs.microsoft.com/ja-jp/office/vba/api/access.webbrowsercontrol.readystate

>>647はwebのapi
Document.readyState
https://developer.mozilla.org/ja/docs/Web/API/Document/readyState

どっちが信用できるかは分からない
どちらにしてもIEオブジェクトがどこまでwebの技術に対応してるか分からない。難しい

かなり雑な解決策としては、
>リンク先を正しく閉じられていないまま次の回転に入っている
とりあえず必ず開いていると仮定して、最初に閉じる処理を噛ませばいいだけな気もする

あと個人的にだけど、untilはあんまり好きじゃない。「否定の否定」が出て来ないように注意した方が良い。あれは読みづらくなる
とりあえず応急処置として、併用してみてはどうかな。うまくいくかどうかはわからない

Do While IE.Busy Or _
IE.readyState <> READYSTATE_COMPLETE Or _
IE.document.readyState <> "complete"
DoEvents
Loop
2019/03/05(火) 23:41:58.62ID:b71Efr460
IE11からreadystateもbusyも使えなくなったとかどこかで見た
利用出来ないという意味ではなくて使い物にならないという意味で

なので移動後に表示されるタブ見つけたら、とか移動後に表示される文字列を見つけたらという条件で対処してるわ
2019/03/05(火) 23:46:48.59ID:yUBkGE+g0
ここでもIEかよ・・・
2019/03/05(火) 23:57:28.83ID:AE45wcOz0
逮捕されないように気をつけろ
2019/03/06(水) 00:08:19.97ID:qZfNBEKA0
>>646
・ IE.Busy = Trueという風に教科書通りになっていない
「if A then B」自体が既に「AがTrueならB」っていう意味だから、更に「= True」は冗長

・ フレーム数を取得してその数だけ念の為回しておくという感じでしょうか
作者はそのつもりだったんだろうけど、Whileの条件が真になった瞬間に全ループが終わるだろうから無意味
その後何かがFalseになってもEnd Subになる

・完全にドキュメントが読み込まれるまで待機する
偶にIEの受信が終わってもDocumentが読み込み終わってない時があるから、付けたほうがいい
フレームの件も、フレーム毎にdocument.ReadyStateを待つことで解決できる(ことが多い)

>>649
VBAは短絡評価出来ないから、IE.documentが取得できないとreadyStateプロパティが見れずに参照エラーが起きるよ
先にIEを待ってから、安全策としてdocument.readyStateも確認すると安定してDOMが使える
2019/03/06(水) 00:12:35.24ID:M8vFX/4l0
csvを読み込む手法はいくつかありますが以下のような場合どの方法が最適でしょうか
1行1レコードになっていない(セル内改行あり)
csvが複数ありそれをすべて読み込んで集計処理がしたい
普段はデータインポートやopenで1行づつ読み込んでいましたが1行≠1レコードだと難しいのかと考えています
2019/03/06(水) 00:17:18.56ID:0oqXehnm0
>>649
長文でわかりにくい環境にも関わらず教えて下さってありがとうございます
参考にして、これから開きたいリンク先のウィンドウタイトルと同じタイトルを持ったウィンドウがすでにあれば閉じるという風に書いてみます
下の方に書いてくれたコードも試してみます
本当にありがとうございました
また下らない質問者したらすみません

>>650
会社のパソコンが古いのでしばらくは大丈夫そうです
ですが重要なことなので覚えておきますありがとうございます
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況