CoCoのYDブログ

心に思い浮かんだことを少し掘り下げ発信します

【VBA】Webページのタイトルを指定してIEを取得する

こんにちは

IEについて理解を深めるため、今回はShellについて勉強していきましょう。

 

Shellとは

 人間の命令をプログラムに伝える機能です。

なんのこっちゃ。

Windowsの代表的なShellプログラムとしてはエクスプローラーが該当するようです。

エクスプローラーのアドレスバーに「C:\」と入力しEnterを押すとCドライブの中身を表示します。同様に「notepad」と入力しEnterを押すとメモ帳を開きます。

このようにエクスプローラーが解釈してOSに命令を与えています。

 

サンプルプログラム

Sub SearchIE()

    Dim colSh As Object
    Dim win As Object
    Dim strTemp As String
    Dim objIE As Object
    Set colSh = CreateObject("Shell.Application")
    For Each win In colSh.Windows

        If TypeName(win.document) = "HTMLDocument" Then

            If InStr(win.document.Title, "Amazon") > 0 Then
                Set objIE = win
                Exit For
            End If
        End If
    Next

    If objIE Is Nothing Then
        MsgBox "探しているIEはありません"
    Else
        MsgBox objIE.document.Title & "がありました"
    End If

End Sub

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行目:プロシージャの終了

 

実際にIEAmazonを開いてから実行してみましょう。

f:id:takataka2743:20180907232309p:plain

ちゃんと表示されましたね

 

これは色々と応用できそうです。

【VBA】画面移動の間処理を待つ方法

こんにちは

今回は前回の続きです。

IEにて画面の表示中にテキストの表示を行うとエラーが発生するため少し時間をあける必要があるというお話しでした。

ではIEが読み込み中の間は処理をしないという条件を追加したらどうなるのでしょうか?

 

Busyプロパティを使用する

Sub WaitTest()
    Dim ie As InternetExplorer

    Set ie = CreateObject("InternetExplorer.Application")

    ie.Visible = True
    ie.navigate "https://ydcoco.hatenablog.com/"

    Do While ie.Busy
        Debug.Print ie.Busy
        DoEvents
    Loop
    MsgBox ie.document.body.innerText

End Sub

 前回のプログラムにDo \whileをつけてみました。

条件がie.BusyなのでIEがビジー状態の間ループするというプログラムです。

 

これなら問題なく読み込みが完了してから処理を行ってくれるはず・・・とすんなり行かないんです。

 

Busyプロパティで監視しているのはIEがビジー状態かどうかです。

ジー状態が終わったからといって読み込みが完全に終了したとは限りません。

 

 ReadyStateプロパティ

Sub WaitTest()
    Dim ie As InternetExplorer

    Set ie = CreateObject("InternetExplorer.Application")

    ie.Visible = True
    ie.navigate "https://ydcoco.hatenablog.com/"

    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        Debug.Print ie.Busy & ":" & ie.readyState
        DoEvents
    Loop
    MsgBox ie.document.body.innerText

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)
Sub WaitTest()
    Dim ie As InternetExplorer

    Set ie = CreateObject("InternetExplorer.Application")

    ie.Visible = True
    ie.navigate "https://ydcoco.hatenablog.com/"

    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        Debug.Print ie.Busy & ":" & ie.readyState
        DoEvents
    Loop

    Sleep 500

    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        Debug.Print ie.Busy & ":" & ie.readyState
        DoEvents
    Loop

    MsgBox ie.document.body.innerText

End Sub

 Sleep はms単位で処理を止めることができるらしいので試しに0.5sの遅れにしてみました。実際に何秒が適切なのかは分からないです。PCのスペックによるだろうし。

Sleepで遅延させたから読み込み状態の確認が再度入って完了といった処理ですね。本当に長かったです。

 

 

【VBA】ページ表示も待つことが必要

こんにちは

昨日Kindleで本を買い、鬼の形相で読み漁ってる次第でございます。

知らない知識、情報がこんなに簡単に手に入るなんていい時代になりました。

さて、序の序までしか読んでいないのですが、IEでページを表示したら少し待たないとエラーが発生するようです。

 

 サンプルプログラム

Sub WaitTest()
Dim ie As InternetExplorer

Set ie = CreateObject("InternetExplorer.Application")

ie.Visible = True
ie.navigate "https://ydcoco.hatenablog.com/"

MsgBox ie.document.body.innerText

End Sub

 こんな感じですかね

1行目:プロシージャー開始

2行目:変数ieをInternetExplorer型で宣言

3行目:なし

4行目:ieオブジェクトにInternetExplorer.Applicationを設定

5行目:なし

6行目:IEを表示

7行目:当ブログのURLを設定

8行目:なし

9行目:当ブログのテキストをMsgBoxで表示

10行目:なし

11行目:プロシージャの終了

 

これで実行を行うとエラーが発生します。

f:id:takataka2743:20180905213008p:plain

これはページが完全に開ききっていないにも拘らず、テキストととしてページを出力しようとしているかららしいです。

 

試しに8行目にブレークポイントを設定してみましょう

下の画像の赤丸部分をクリックしてみましょう。

同じような赤丸が表示されると思います。

f:id:takataka2743:20180905213321p:plain

この状態でプログラムを実行すると下の画像のようになります。

f:id:takataka2743:20180905213647p:plain

これはこの行の命令を処理する前で停まっている状態ですね。

この状態で[F5]か[F8]を押してみましょう。

するとこのページのテキストが表示されます。

うん、文字が多いんで閉じちゃってくださいw

 

どうやったら安定して表示できるか

毎回ページが表示されるタイミングでブレークポイントを設定したら時間が掛かるしユーザーに配布なんてできませんね。

ならどうしたらよいか・・・

 

といったところで続きは次回に回します。

Kindleさんマジ便利

こんにちは

今回はプログラミングはお休みです。

現在2018/09/04 21時 台風が通過してやっと一息です。

仕事が定時に終わったんでIEの勉強を行っていたのですが、どのサイトに行ってもプログラムは書いてあるものの詳細がなくて仕方なく本を購入しようと思った次第です。

とはいえ外出するにもこの時間だし、雨風は強い状態。

台風が過ぎ去ってすぐなのでAmazonで注文しても届くのは遅くなるだろうと思っていたのですが、Kindleの存在に気がつきました。

 

俺、Kindle持っていたんだなぁと

とはいえKindleの画面は小さく白黒で読みにくいんですよね。

そこで今回はこいつの紹介です。

f:id:takataka2743:20180904215218j:plain

Kindle for PC (Windows) [ダウンロード]

リンクの貼り方これでよかったかしら?w

 

これは便利なものでカラーで表示されるしディスプレイに表示されるため、文字も大きく表示されます。

f:id:takataka2743:20180904214712p:plain

読みやすいですね。

これを先に知っておけばKindleいらないじゃん・・・

さらにうれしいのは値引きされている商品が多いこと

f:id:takataka2743:20180904214823j:plain

上の本を買うのに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)を操作する

こんにちは

今回はVBAIE(InternetExplorer)を操作してみようと思います。

VBAIE操作っていけるんですね。

よく副業のサイトでIEを使ったデータの収集とかありましたが・・・

 

では早速プログラムのほうを

の前に、ライブラリを追加する必要があります。

前回同様VBEの[ツール]-[参照設定]から

Microsoft HTML Object Library

Microsoft Internet Controls

これらを追加します。

f:id:takataka2743:20180902193125p:plain

ここでやっとプログラムですね。

 というわけで以下のプログラムを用意しました。(見たことあるー)

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.[ツール]から[参照設定]を起動

f:id:takataka2743:20180901210317j:plain

3.追加したいライブラリにチェックを入れてOK

 ってライブラリ多いですね!20個ぐらいだと思ってましたw

 自分はIEを使えるようにしたいので[Microsoft Internet Controls]を追加します。

f:id:takataka2743:20180901210747j:plain

 

以上で追加できたようですね。

次から色々と動かしていくぞ~