【VBA】Webページのタイトルを指定してIEを取得する
こんにちは
IEについて理解を深めるため、今回はShellについて勉強していきましょう。
Shellとは
人間の命令をプログラムに伝える機能です。
なんのこっちゃ。
Windowsの代表的なShellプログラムとしてはエクスプローラーが該当するようです。
エクスプローラーのアドレスバーに「C:\」と入力しEnterを押すとCドライブの中身を表示します。同様に「notepad」と入力しEnterを押すとメモ帳を開きます。
このようにエクスプローラーが解釈してOSに命令を与えています。
サンプルプログラム
Sub SearchIE() Dim colSh As Object |
1行目:プロシージャの開始
2行目:起動中のすべてのShellWindowを格納する変数
3行目:ShellWindowsを格納する変数
4行目:取得したタイトルを保存するための変数
5行目:目的のIEを取得するための変数
6行目:開いているすべてのShellWindowを変数colShに格納
7行目:For EachでShellWindowをひとつずつ見ていく
8行目:なし
9行目:取り出したWindowがHTMLドキュメントかどうかの判定
10行目:なし
11行目:タイトルバーにAmazonが含まれているかの判定
12行目:条件にあったオブジェクトを格納
13行目:ループから抜け出す
14~17行目:省略
18行目:該当するWebページが見つからない場合
19行目:"探しているIEはありません"と表示
20行目:Else処理
21行目:条件にあったオブジェクトのタイトルを表示
22行目:If関数の終了
23行目:なし
24行目:プロシージャの終了
ちゃんと表示されましたね
これは色々と応用できそうです。
【VBA】画面移動の間処理を待つ方法
こんにちは
今回は前回の続きです。
IEにて画面の表示中にテキストの表示を行うとエラーが発生するため少し時間をあける必要があるというお話しでした。
ではIEが読み込み中の間は処理をしないという条件を追加したらどうなるのでしょうか?
Busyプロパティを使用する
Sub WaitTest() Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True Do While ie.Busy End Sub |
前回のプログラムにDo \whileをつけてみました。
条件がie.BusyなのでIEがビジー状態の間ループするというプログラムです。
これなら問題なく読み込みが完了してから処理を行ってくれるはず・・・とすんなり行かないんです。
Busyプロパティで監視しているのはIEがビジー状態かどうかです。
ビジー状態が終わったからといって読み込みが完全に終了したとは限りません。
ReadyStateプロパティ
Sub WaitTest() Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE End Sub |
While の条件を変更してみました。
readyStateとは
オブジェクトの読み込み状態を数値として表すものです。
定数 | 戻り値 | 説明 |
---|---|---|
READYSTATE_UNINITIALIZED | 0 | 未完了状態 |
READYSTATE_LOADING | 1 | IEオブジェクトのロード中 |
READYSTATE_LOADED | 2 |
IEオブジェクトのロード完了 ただし、操作不可能 |
READYSTATE_INTERACTIVE | 3 | IEオブジェクトの操作可能状態 |
READYSTATE_COMPLETE | 4 | IEオブジェクトの全データ読み込み完了 |
ie.readyState < READYSTATE_COMPLETEは
IEオブジェクトが全データを読み込み終わるまでループを行って欲しいためつけられていることがわかります。
Sleep
ページを全部終わってもJavaScriptを多用するページでは再読み込みが行われる場合があるそうです。
そこでSleep関数を使用して少し時間を空けてから、再び読み込み状態の確認を行うと確実らしいです。長いわ!w
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE End Sub |
Sleep はms単位で処理を止めることができるらしいので試しに0.5sの遅れにしてみました。実際に何秒が適切なのかは分からないです。PCのスペックによるだろうし。
Sleepで遅延させたから読み込み状態の確認が再度入って完了といった処理ですね。本当に長かったです。
【VBA】ページ表示も待つことが必要
こんにちは
昨日Kindleで本を買い、鬼の形相で読み漁ってる次第でございます。
知らない知識、情報がこんなに簡単に手に入るなんていい時代になりました。
さて、序の序までしか読んでいないのですが、IEでページを表示したら少し待たないとエラーが発生するようです。
サンプルプログラム
Sub WaitTest() |
こんな感じですかね
1行目:プロシージャー開始
2行目:変数ieをInternetExplorer型で宣言
3行目:なし
4行目:ieオブジェクトにInternetExplorer.Applicationを設定
5行目:なし
6行目:IEを表示
7行目:当ブログのURLを設定
8行目:なし
9行目:当ブログのテキストをMsgBoxで表示
10行目:なし
11行目:プロシージャの終了
これで実行を行うとエラーが発生します。
これはページが完全に開ききっていないにも拘らず、テキストととしてページを出力しようとしているかららしいです。
試しに8行目にブレークポイントを設定してみましょう
下の画像の赤丸部分をクリックしてみましょう。
同じような赤丸が表示されると思います。
この状態でプログラムを実行すると下の画像のようになります。
これはこの行の命令を処理する前で停まっている状態ですね。
この状態で[F5]か[F8]を押してみましょう。
するとこのページのテキストが表示されます。
うん、文字が多いんで閉じちゃってくださいw
どうやったら安定して表示できるか
毎回ページが表示されるタイミングでブレークポイントを設定したら時間が掛かるしユーザーに配布なんてできませんね。
ならどうしたらよいか・・・
といったところで続きは次回に回します。
Kindleさんマジ便利
こんにちは
今回はプログラミングはお休みです。
現在2018/09/04 21時 台風が通過してやっと一息です。
仕事が定時に終わったんでIEの勉強を行っていたのですが、どのサイトに行ってもプログラムは書いてあるものの詳細がなくて仕方なく本を購入しようと思った次第です。
とはいえ外出するにもこの時間だし、雨風は強い状態。
台風が過ぎ去ってすぐなのでAmazonで注文しても届くのは遅くなるだろうと思っていたのですが、Kindleの存在に気がつきました。
俺、Kindle持っていたんだなぁと
とはいえKindleの画面は小さく白黒で読みにくいんですよね。
そこで今回はこいつの紹介です。
Kindle for PC (Windows) [ダウンロード]
リンクの貼り方これでよかったかしら?w
これは便利なものでカラーで表示されるしディスプレイに表示されるため、文字も大きく表示されます。
読みやすいですね。
これを先に知っておけばKindleいらないじゃん・・・
さらにうれしいのは値引きされている商品が多いこと
上の本を買うのに30%OFFは大きいですね。
まあこれは販売されてから少し時間がたっているからなんですがw
ダウンロードに時間はあまり掛からないので直ぐに読むことも可能です。
たまにセールもあり、本を格安で購入できるので本当に便利です。
ちなみにプライム会員だと無料で読める本もあるのですが、内容は無い様なものですね
Lineに登録~、メルマガを登録~とかでまともな本は少ない印象です。
というわけでちょっとの間勉強してきます。
【VBA】For Eachって何?
こんにちは
今日はFor Eachについて学んでいきます。
IE?まだ勉強中でして、しばらくお待ちを。
For Each ってなに?
私も結構調べててよく出てくるんですよね。
でも実際にどんな動作をするのか分からないため、今回調べた次第であります。
どうやら配列やコレクションの数だけForと同様に処理を繰り返すみたいですね。
Sub test1() Dim 配列() 配列 = Array(1, 2, 3, 4, 5) For Each i In 配列 MsgBox i Next i End Sub |
今回はこんな感じで
配列にArray関数で文字を5個入力して
For Each ~In で5回繰り返しています。
各配列の中身はVariant型の変数iが配列の中身を返している感じです。
Sub test2() Dim 配列() 配列 = Array(1, 2, 3, 4, 5) For i = 0 To UBound(配列) MsgBox 配列(i) Next i End Sub |
似たような感じでUBoundがありますね。
これは配列の最大の要素数数を数字に変換しています。
最小はLBoundですね。
Sub test3() For Each i In Worksheets MsgBox i.Name Next i End Sub |
配列以外にもワークシートでも代用できるようですね。
これは便利ですね。If i.Name="Sheets1" Then というように特定のシートに対して処理を行うこともできます。
今回はこの辺で失礼します。
【VBA】VBAでIE(InternetExplorer)を操作する
こんにちは
今回はVBAでIE(InternetExplorer)を操作してみようと思います。
よく副業のサイトでIEを使ったデータの収集とかありましたが・・・
では早速プログラムのほうを
の前に、ライブラリを追加する必要があります。
前回同様VBEの[ツール]-[参照設定]から
・Microsoft HTML Object Library
・Microsoft Internet Controls
これらを追加します。
ここでやっとプログラムですね。
というわけで以下のプログラムを用意しました。(見たことあるー)
Sub test() Dim object As InternetExplorer Set object = CreateObject("InternetExplorer.Application") object.Visible = True object.navigate "https://www.amazon.co.jp" End Sub |
まず2行目から、Dim object As InternetExplorer
objectをInternetExplorerの型として宣言してますね。
ライブラリを追加しないとできない処理ですね。
3行目、Set object = CreateObject("InternetExplorer.Application")
CreateObjectでプログラムをインスタンス化した状態で返すらしいです。(何言ってんだコイツって顔で見ないでw)
このオブジェクトにこのアプリケーションを使うわーって意味らしいです。(多分!
4行目、object.Visible = True
これは分かりますよ、オブジェクトを表示しなさいという意味です。このオブジェクトにはIEがすでに入っているため、IEを表示させなさいという命令になっています。
5行目、object.navigate "https://www.amazon.co.jp"
これはURLの変更という意味ですね。
なんとなくAmazonにしてみました。便利ですよね。
今回はこんなところにしておきましょう。
ではまた
【VBA】外部ライブラリってなに?
こんにちは
今回は外部ライブラリについて勉強しつつ、説明できたらなと思います。
(IE)Internet Explorerを使ったプログラムを作成するにあたって欲しい知識だったのでこの機会に学習しておこうかと思います。
外部ライブラリってなに?
今回色を変えてみました。ちょっとおしゃれでしょ?w
外部ライブラリとはVBAの機能を拡張するためのものらしいです。
Excelアドインとも呼ぶらしいですね。
VBAではできなかった機能を追加するため幅広い動作が可能になりますね。(MinecraftでいうMODみたいなものか)
ライブラリの追加方法
さてどうやって追加するのか見てみましょう
1.VBEを起動
2.[ツール]から[参照設定]を起動
3.追加したいライブラリにチェックを入れてOK
ってライブラリ多いですね!20個ぐらいだと思ってましたw
自分はIEを使えるようにしたいので[Microsoft Internet Controls]を追加します。
以上で追加できたようですね。
次から色々と動かしていくぞ~