CoCoのYDブログ

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

embotが可愛すぎる件について

こんにちは

今回は雑談です。

 

イーフローという会社が本日プログラミング教育用ダンボールロボットを販売したそうです。

 
外装のダンボールには切れこみが入っており、子供でも簡単に組み立てられそうです。内容にサーボモータが2個とブザーが1個、LEDが2個なのであまり自由度はなさそうですが、子供の教育にはもってこいかなぁと
(自由度が欲しければArduinoでプログラミングしたら広がるし)
ダンボールなので色を塗ったり、新しいダンボールで武器を持たせることができます。
 

www.youtube.comd¥

動画の内容を見るとタブレットでプログラミングができるみたいです。

プログラミングの画面も簡単そうなのでお子さんと一緒に動かすことができて楽しめますね。

気になるお値段は¥4800円とリーズナブルな点も良いですね。

 

今回はこの辺で

(プログラムの勉強がなかなか追いつかない訳じゃry)

 

 

【VBA】T●UTAYAさんでの商品検索

こんにちは

今回はVBAで商品を検索するプログラムを作成してみましょう。

検索するサイトはT●UTAYAさん

有名ですよね。

最近はAmazonPrimeに浮気しておりますが、CDを借りるときは利用させていただいています。

 

サンプルプログラム

Sub 検索()
    Dim ie As InternetExplorer
    Dim textInput As HTMLInputElement
    Dim form As HTMLFormElement

    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.navigate "http://store-tsutaya.tsite.jp/index.html/"
    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop

    Set textInput = ie.document.getElementById("searchText")
    textInput.Value = "君の名は"
   
    Set form = ie.document.forms("kSearch")
    form.submit
End Sub

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

2~3行目:変数の宣言

4行目:変数formをHTMLFormElement型で宣言します

5行目:なし

6~11行目:省略します。URLが変更されてるので注意

12行目:なし

13行目:IDに"searchText"が入ったドキュメントを格納します

14行目:格納されたドキュメントの値を"君の名は"に設定します

15行目:なし

16行目:IDに"kSearch"が使われたフォームを格納します。

17行目:フォームを送信します

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

 

解説

今回はHTMLFormElement型を使用しています。

これはフォームをオブジェクトに格納するために使用しています。

下のはソースコードです。

f:id:takataka2743:20180912221646j:plain

<form id="kSearch" ~となっているため

Set form = ie.document.forms("kSearch")

でフォームを格納しております。

フォームの格納はgetElement~としては使わないんですね

そして、foem.submitでフォームの送信です。

 

ちなみに私は君の名は。がすきで4回ほど観ましたね。

入れ替わり自体はよくある話でしたが、その後の展開が予想外でしたw

 

(検索結果にAVが紛れ込んでいるのも予想外でした。)

 

 

IEのテキストボックスを編集する

こんにちは

9月中旬に入り涼しくなってきましたね。

昨夜は寒いぐらいですw

 

さて、今回はIEのテキストボックスの内容です。

テキストボックスといえば、GoogleYahoo!の検索を行う際に入力するところですね。

ここを自在に入力できれば、大量のデータを検索でき、検索結果を取得できると思います。

今回はそのテキストボックスの入力と値の取得についてやってみましょう。

 

サンプルプログラム

Sub useTextbox()
    Dim ie As InternetExplorer
    Dim textInput As HTMLInputElement
    Dim textOutput As HTMLInputElement

    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.navigate "http://book.impress.co.jp/appended/3384/4-2.html"
    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop

    Set textInput = ie.document.getElementById("Text1")
    MsgBox textInput.Value

    Set textOutput = ie.document.getElementById("Text2")
    textOutput.Value = "VBAからの書き込み"
End Sub

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

2行目:変数の宣言

3,4行目:HTMLInputElement型として変数を宣言

5行目:なし

6行目:変数ieにInternetExplorer.Applicationをセット

7行目:IEを表示

8行目:ページに接続

9~11行目:ページを開くまで待機

12行目:なし

13行目:DOMを使ってId"Test1"のドキュメントを取得

14行目:取得したドキュメントからValueの項目をMsgBoxで表示

15行目:なし

16行目:"Text2"のドキュメントを取得

17行目:"Test2"のValueの項目を変更

18行目:終了

解説

 HTML文章はpタグやtableタグなどあらゆる構成文章から成り立っており、この中から捜査対象のテキストボックスを特定するためには、Inputタグがもつ属性に注目してみましょう。

 プログラム内のサイトにアクセスしてソースを表示すると次の箇所が存在します。

取得用:<input id="Text1" type="text" value="テスト">
出力用:<input id="Text2" type="text" value="">

 今回のプログラムはこの情報をプログラムで編集するといった内容です。

 

HTMLInputElementとは

 テキストボックスへの参照を格納するための変数とのことです。

<input ~>がこのオブジェクトに格納されます。

 

getElementByIdとは

 HTMLInputElementのオブジェクトに指定されたIDを使用しているドキュメントを格納するといったところでしょうか。

 

今回は格納した"Text1"の値の表示と"Text2"の値の書き換えを行っていることが分かります。

 

 

 

DOMってなに?

こんにちは~

IE関連のページを探ると毎回表示されるDOMという単語

DOM?ジェットストリームアタックのことですかね?

 

DOMとは

 DOMとは(Document Object Model)の略称で構造化された文章の各要素をオブジェクトとしてプログラムから扱えるようにしたものだそうです。

 HTMLのソースをオブジェクト形式にしたってところですかね?

 DOMがあるおかげでプログラムからHTMLを操作できるらしいです。

 

 HTMLはウェブページを構成するためのプログラムのようなものです。そしてIEなどのブラウザがそれを分かりやすい形に変換しています。今見ているこのページもHTMLブラウザが変換して表示しているものですね。

 

サンプルプログラム

Sub GetByDOM()
    Dim ie As InternetExplorer

    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.navigate "http://book.impress.co.jp/appended/3384/4-1.html"
    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop

    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

    MsgBox htdoc.getElementsByTagName("LI")(1).innerText
End Sub

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

2行目:変数ieをInternet\explorer型で宣言

3行目:なし

4行目:ieにInternetExplorer.Applicationをセット

5行目:IEを表示

6行目:このページを開く

7~9行目:ページが開き終わるまで待機

10行目:なし

11行目:変数htdocをieページのDOMをセット

12行目:箇条書きの2番目の項目をMsgBoxで表示

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

 

こんな感じですね

f:id:takataka2743:20180910212459p:plain

ちなみに("LI")の後の括弧の中を0にすると1行目、2にすると3行目が表示され、当然ながら3にするとエラーが表示されます。

 

DOMは名前のとおりドキュメント形式で取得できるようですね。

IEのページがセットされたドキュメント=DOM かな

取得ができたのなら入力もできるはずです!

【VBA】IE画面の表示/非表示

こんにちは

少しメモ程度の情報ですが、後々見返したときに役に立つと思いますのでまとめます。

 

今回学習するのはIE画面にあるアドレスバー等の表示/非表示の切り替えです。

表示/非表示するにあたって作業が必要になるため、その手順をまとめていけたらなと思います。

 

最初の手順

メニューバーの表示/非表示を行いたいため、メニューバーをあらかじめ表示する必要があるそうです。アドレスバーやステータスバーはそのままで大丈夫です。

1.IEを起動

2.タブの隣(何も無いところを右クリック)

3.メニューバーをクリック

これでOKです。すでにチェックが入っている場合は無視してください。

f:id:takataka2743:20180909214035p:plain

 

サンプルプログラム

Sub ShowBars()

    Dim ie As InternetExplorer

    Set ie = CreateObject("InternetExplorer.Application")

    ie.Visible = True

    ie.AddressBar = False
    ie.AddressBar = True

    ie.Toolbar = False
    ie.Toolbar = True

    ie.MenuBar = False
    ie.MenuBar = True

    ie.StatusBar = False
    ie.StatusBar = True

End Sub

 今回切り替えるのは以下の4つです

  • AddressBar(アドレスバー)
  • Toolbar(ツールバー)
  • MenuBar(メニューバー)
  • StatusBar(ステータスバー)

IEオブジェクト.各プロパティ = True/Falseで表示/非表示を切り替えます。

f:id:takataka2743:20180909220401p:plain

ちなみにToolbarがFalseの場合、AddressBarやMenuBarがTrueであっても非表示のままなので注意が必要です。

 

f:id:takataka2743:20180909220551p:plain

また、ツールバーを一度非表示にするとタブが非表示のままになってしまいます。

IE11と相性が悪いのですかね?

 

今回は簡単にまとめさせていただきました。

本当にメモ程度ですねw

【VBA】IEのポップアップの出現検知

こんにちは

IEのポップアップが発生するかを検知するプログラムを作成していたのですが、どうも動作しない、エラーが発生するという状態でした。

調べてみるとIE9以降はGetLastActivePopup関数でポップアップが出現しているか検知することはできない模様。使用している参考書が古いこともあってここで1時間ほど悩んでいました。

 

GetLastActivePopupとは

GetLastActivePopup(オブジェクト名.hWnd)として使ういポップアップが表示されると戻り値が変わるそうです。今のバージョンとは異なるためあまり調べる気にならないですね。

 

ちなみに.hWndプロパティってなんだろ?

Hwndプロパティは、Excel ウィンドウの最上位レベルのウィンドウ ハンドルを示す長整数型 (Long) の値を返します。値の取得のみ可能です

www.vba-ie.net

 こちらのサイト様によると最上位レベルのウィンドウとありますね。

たしか、IE9以降は最上位レベルのウィンドウがIEではなくなったとか・・・色々調べましたが、検知できそうなものは発見できず

 

これにはお手上げですね。

 

 

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

こんにちは

今回は先日のIE取得のプログラムにOn Errorを足すことで判定対象となるプロパティをオブジェクトが保有しているかどうかに関わらず利用できます。

 

どういうことかというと

[オブジェクト名].Visible = Trueで表示したばかりのIEにはタイトルがない状態です。そこで前回使用したプログラムを実行するとエラーが発生してしまいます。今回はそれを防いだプログラムとなります。

 

サンプルプログラム

Sub test()

    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
        strTemp = ""

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

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

End Sub

 1~8行目:前回と同様

9行目:変数strTemp の初期化(空白に戻すだけ)

10行目:なし

11行目:On Error Resume Next

説明してないところですが、エラーが発生しても無視して次に行きなさいという命令です。

12行目:前回同様strTemp にタイトルを代入しています

13行目:11行目で発生したエラー無視の終わりを示しています。

13行目以降えらーが発生した場合はエラーとして表示されます。

14行目:タイトルにAmazonが含まれているかの判定

15行目~前回同様

 

こんな感じですね。

まあタイトルがない場合なんて発生しにくいとは思いますが、こっちのほうが安定して動作すると思います。