[No.115 Access クエリーでCLngを使用して番号をキレイにする]
[No.116 InternetExplorer操作 Frameと遊ぶ Objectを探る方法]
[No.117 InternetExplorer操作 .Silentを使用したけど....]
[No.118 Microsoft Web Browser コントロールをフォームに貼る]
[No.119 IEを使用して、Web上の表をExcelへ]
www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



No.115 2003/07/31
Access クエリーでCLngを使用して番号をキレイにする
[ページTOPへ戻る]

<Access クエリーでCLngを使用して番号をキレイにする>

どうも、三流プログラマーのKen3です。 今回は、 AccessのクエリーでCLngを使用して 文字列型の番号をキレイにしてから、ソートしてみます。

/* * 1.今回のキッカケ */

メールで下記の質問をもらいました。 ----- >まず、うちは一件一件の案件に対して、番号を振っているのですが >その番号が少し特殊でして、普通最初は >「1」「2」「3」・・・ときますところに >最初に「0」を付けるんです。 >ですから >「01」「02」「03」・・・となるんです。 >「123」の場合には、「0123」となります。 >まぁ、これはこれでいいんですが・・・。 > > >昇順で並び替えをしますと・・・。 >わけの分からないことに・・。 > > >例えば >普通の「5」「24」「32」「123」とあれば、この通りの順番になりますが >うちの特殊な番号の振り方ですと「05」「024」「032」「0123」とな >ります。 >昇順しますと >「0123」「024」「032」「05」 >となってしまうんです・・・。 > > >まぁ、コンピュータの考えてる昇順の意味は分かるんですけど > >私としては、ちゃんと「05」「024」「032」「0123」と並び替えても >らいたいのです。 > > >こんな説明で分かってもらえましたでしょうか? >この数字を、私は「テーブル」の「データ型」のところ「テキスト型」で入力して >しまいました。 >それも一因だったりしますか? ----- 頭0の番号は、よく聞く話ですよね、 それで、 「0123」 「024」 「032」 「05」 の辞書順になってしまうんですね。 (頭0無くても、文字型だと辞書順になってしまいますよね) データ型がテキストじゃないと、 頭に0が付けて記録できないので、それはテキスト型でOKなんだけど、 できたら、数値型で入れておいて、印刷するときだけ0付けたほうが簡単だったかも よくお偉いさんが言うテーブル構造やデータの持ち方ってのは・・ って講義は私には合わないので、置いといて。 今、現実に「0123」「024」「032」「05」とデータが入っているので、 直すと大変だと思います。 なので、ここは、また前回の演算フィールドを使い逃げたいと思います。

/* * 2.CLng関数を使用して、文字列を数値に直しソートする */

「05」「024」「032」「0123」 のテストデータを作ります。 ↑テストデータイメージ 演算フィールドを作成します ^^^^^^^^^^^^^^^^^^^^^^^^^^ 番号2: CLng([番号]) みたいにして、 : CLng([並べ替えたい番号のフィールド]) とすると、 CLng関数で文字列を数値に直してくれます(0が取れて純粋な数値になります) ↑式入力のイメージ 数値に変換された演算フィールド、それを並べ替えると出来ると思います。 ↑並べ替えの結果 で、あとは、 画面やレポートに表示するのは、 いままで同様に元の番号フィールドを使用します。 演算フィールドってのが、意外と便利なんですよ。 あとは、経験を積むと、CLngとかの変換関数の知識が付いて、 それの組み合わせって感じかなぁ。

/* * 3.CLng関数で遊ぶ */

さてと、無事に終わったかな。 手前味噌解説も終わりです、だと、つまらないよね(笑) CLng("001") とか、2バイト文字(漢字)を変換してくれて楽なんだけど、
Sub aaa()

    MsgBox CLng("")

End Sub
をテストすると、 型が一致しないとエラーが表示されます。 ^^^^^^^^^^^^^^ ↑エラー画面 あらら・・・番号が必ず入力されていればいいけど、 実行時エラーで落ちる、キケンなプログラムですね。 回避策は、私みたいな三流プログラマーなら、 頭に0を勝手に付けてしまう(笑) 今回は2バイト文字の 「05」「024」「032」「0123」 なので、「」と何も入っていない時を考えて、 CLng("0" & strXXX) みたいに、勝手に頭0を付ける。 05なら005をCLngで変換するようになる。 IIf(strXXX = "", 0, CLng(strXXX)) と、IIfを使うのもありだし、 Nz,ISXXXXとチェックする方法はイロイロだけど 面倒だから、エラーを発生しないようにしました。 コードを読む側では、なんで0と&するの?になるので、 コードを読みやすくするには、 IIf(strXXX = "", 0, CLng(strXXX)) と strXXXが""なら0を、その他はClngで変換した値を なんてほうがやっていることが一目でわかると思います。 お好きなほうを・・じゃなくって、まわりの空気を読みながら使ってね。 -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ~~~~~~~~~~~~~~~~ オレ様、私は、SE様だ、月給30万以上ボーナス100万を探すのもありだよ。 私にみたいにVBA少しできるぐらいだと仕事無いよ・・・ と軽く言われても匿名なら気にならないし(笑) 逆にこんな簡単な仕事で月給27万貰えるの?って会社もあるし、世の中イロイロ。 http://www.ken3.org/etc/500yen/job.html ------------------------------------------------------------------------ 

/* * 5.終わりの挨拶 */

今回は、 クエリーでCLng関数を使用して、 文字型のフィールドを数値に変換して、並べ替えに使用してみました。 おまけで、変換エラーの話と、逃げ方を書きました。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.116 2003/08/01
InternetExplorer操作 Frameと遊ぶ Objectを探る方法
[ページTOPへ戻る]

<InternetExplorer操作 Frameと遊ぶ Objectを探る方法>

どうも、三流プログラマーのKen3です。 今回は、 InternetExplorerの操作で、Frame関係を探ってみます。 なかなか、相手は強敵でした・・・

/* * 1.今回のキッカケ */

掲示板に下記の質問をもらいました。 ----- >別のFARMEにデータを送りたいのですが >こんなのつくりましたがうまくゆきません > URL = "http://******/" > Set objIE = CreateObject("InternetExplorer.Application") > objIE.Visible = True > objIE.Navigate URL > > objIE.Parent.Document.Forms("Logon").PassWord.Value = "123" > > objIE.Parent.Document.Forms("Logon").PassWord.Value = "123" >がエラーになります?対処法を教えてください。 >よろしくお願い致します。 ----- フレームかぁ、避けていたけど、来ましたね質問が。。。

/* * 2.気分を変えて、参照設定から探ってみます */

汚い手で女の子に触れると嫌がられる? じゃなくって、 いつも、私は手抜きで、AS Objectとやっているので、 なぜExcelもIEも同じAs Objectなのか?と質問 いっぱいもらうので、 今日は、皆さんが好きな、型をキチント指定して作ってみます。 その代わり、参照設定のエラー、バージョン問題があるとイヤなので、 サンプルプログラムのlzhは無しで行きます。 自分で打ち込みながらやったほうが、力になるので(手抜きの言い訳ですが) まず、参照設定を行います。 参照設定では、MicroSoft Internet Contorlsを選択します。 ※あまり関係ないけど、shdocvm.dllを参照していることがわかります。 次に、変数を宣言します。 dim objIE as と打ち込むと、リストから選択できます。 ここで、 Dim objIE As InternetExplorer と選択します。 ↑選択イメージ そんな感じで、いつもの型が不明のObject型から、 As InternetExplorer と 型を指定してみました。 あとは、普通にオブジェクトを作って代入します。 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") まぁ、いつも通りですね。 参照設定をしていると、ここからチト違うのが、 objie.と打ち込むと、プロパティ、メソッドが表示されます。 objIE.Visible = True もコーディングするのが比較的楽です。 さてと、だったら、Excelのように簡単にいくかなぁ・・・ と思ってたら、ガイドしてくれるのもここまでで、 objIE.Document. ここまではOKなのに、 Document.と入力しても何も出てこない。 しかたない、F1押しますか、 あらら、いつものヘルプが出ない・・・ う〜ん、どうしましょう・・・

/* * 3.みなさんはF2のオブジェクトブラウザって使ったことある? */

みなさんはF2のオブジェクトブラウザって使ったことありますか? F2を押します(F1の隣って、あたりまえか) すると、オブジェクトブラウザって画面が表示されると思います。 全てのライブラリから、 SHDocVwを選択します。 すると、 InternetExplorerのメンバーまでは見れるけどその先がまだ見れない・・・ ↑InternetExplorerのメンバーまでたどりついた。 まだ何か足りないのね、参照設定でそれらしき物を再度探す。 と、 MicroSoft HTML Object Labrary なんてのがあるじゃないですか。 ※いままで、見逃してた・・読者の皆さんスミマセン。 ↑やっと探し当てた、MicroSoft HTML Object Labrary 中身を確認してみると、(F2のオブジェクトブラウザで) MSHTMLとライブラリを選択、 クラスは、HTMLDocumentを選択すると、 おっ、よく見かけた.Allなんかも出てくるし、 スクロールすると、 framesなんてメンバーが存在する。 ^^^^^^ これをクリックすると、 Property Frames AS FramesCollection 読み取り専用 HTMLDocumentのメンバ なんて感じの説明とリンクが出てくる。 ↑HTMLDocumentのframesを選択した画面 まだまだ不明なので、 次に、リンク先のFramesCollectionをクリックして探ってみると、 Class FramesCollection MSHTML のメンバ だってぇ? オイオイ、頭に戻ったか?(循環参照か?ヘルプのたらいまわし状態?) でも、FramesCollectionは、 Item と length をメンバーとして持っているのがわかった。 ↑FramesCollectionを選択した画面 Itemは、HTMLを表すのかぁ。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ ※まぁ、よく考えてみれば、フレームの先は、  HTMLのドキュメントなので、  作りはOKなんでしょうね。 index.html でフレーム分割、 a.html と b.asp を表示してれば、 index.htmlのフレーム要素(ITEM)は2個(length)です。  ITEMの中身はHTMLドキュメントって言ってるよ、  そりゃそうか、フレームで分割されていても、  item(0)はa.html item(1)はb.aspなんだから、 フレームのアイテムは、HTMLドキュメントと言ってるのは。  ↑ゴメンなさい、少し文章変ですよね。

/* * 4.フレーム処理に各Objectの型をキチント指定しながら挑戦 */

日本語、私、うまく書けないので、 みなさんと共通に話せると思う、 VBAって言語を混ぜて説明するので、 聞いてくださいね。 オイオイ(笑)単なるソースを紹介って言えよボケ。 簡単なIE関係の型を使った解説を始めます。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ まず、普通のフレーム無しのHTMLから。 http://www.ken3.org/cgi-bin/test/test068.html がログインの処理画面です。 ユーザー名にKen3 パスワードにaaa と入力してみます。 test068.htmlのHTMLソース(途中まで)は、 <html> <head> <title>けんぞうのへんてこな世界へようこそ</title> </head> <body bgcolor=#ffffff text=#000000> <center> <h2>けんぞうのへんてこな世界へようこそ</h2> <br> <table bolder=1> <FORM ACTION="test068-1.asp" METHOD="POST"> USER ID:<INPUT TYPE="text" NAME="userid" SIZE="12"><br> パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"><br> <INPUT TYPE="submit" NAME="btn01" VALUE="ログイン"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> </table><br> <a Href="test068-2.asp" TARGET="_top">新規ユーザー登録</a><br> </center> <br> ・  ・ と USER ID:<INPUT TYPE="text" NAME="userid" SIZE="12"><br> パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"><br> が、入力エリアです。 これに対して、(このHTML入力フォームに対して) 入力処理で下記のプログラムを作りました。 No.105 VBAからIE操作 .document.forms(0).Submit でフォーム送信処理 http://www.ken3.org/backno/backno_vba22.html#105 では、
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test068.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     '項目名を指定して、データをセットする
     objIE.document.all.userid.Value = "Ken3" 'ユーザー名
     objIE.document.all.pass.Value = "aaa"    'パスワード

     'フォームをSubmitする
     objIE.document.forms(0).Submit

End Sub
と、 '項目名を指定して、データをセットする objIE.document.all.userid.Value = "Ken3" 'ユーザー名 objIE.document.all.pass.Value = "aaa" 'パスワード みたいにセットしてました。 これを、 MicroSoft Internet Contorls MicroSoft HTML Object Labrary の 2つ参照設定を行い、 ~~~~~~~~~~~~~~~~~~~~ オブジェクト変数の型をキチント指定して書いてみます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub ie_test()

    Dim objIE    As InternetExplorer   'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test068.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'ドキュメントオブジェクトの代入
    Dim objDOC   As IHTMLDocument      'HTMLドキュメント
    Set objDOC = objIE.Document

    '項目名を指定して、データをセットする
    objDOC.all("userid").Value = "Ken3" 'ユーザー名
    objDOC.all("pass").Value = "aaa"    'パスワード

End Sub
ポイントは、 ~~~~~~~~~~~~ Dim objDOC As IHTMLDocument 'HTMLドキュメント と、 HTMLのドキュメント型にしてから、 ^^^^^^^^^^^^^^^^^^^^ Set objDOC = objIE.Document で、IEのドキュメントを代入しました。 それから、参照は、 objDOC.all("userid") や objDOC.all("pass") のように、項目名で参照してみました。 フォームのコレクションに番号でアクセスするのと、 名前でアクセスするのに似てますね。 次は、フレームのチェック。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ http://www.ken3.org/vba/test116.html に、フレーム用のHTMLを作りました。 <html> <HEAD> <TITLE>三流君 VBAで楽しくプログラミング</TITLE> </HEAD> <frameset COLS="160,*" FRAMEBORDER=1 BORDER=1 FRAMESPACING=0> <frame SRC="http://www.ken3.org/vba/menu-vba.html" NAME="F_MENU"> <frame SRC="http://www.ken3.org/cgi-bin/test/test068.html" NAME="F_RIGHT"> </frameset> </html> フレームの名称は、F_MENUとF_RIGHTで左右に割ってみました。 さてと、フレームは、 Property Frames AS FramesCollection だったっけ? コイツを使用して、
Sub ie_fream()

    Dim objIE    As InternetExplorer   'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/vba/test116.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    
    Dim objFRAME As FramesCollection
    Set objFRAME = objIE.Document.frames  'フレームの代入

    Debug.Print "フレームの数は" & objFRAME.Length

    'ドキュメントオブジェクトの代入
    Dim objDOC   As IHTMLDocument      'HTMLドキュメント
    Set objDOC = objFRAME("F_RIGHT").Document 'フレームのドキュメントをセット
    '↑objFRAME(0).DocumentやDocument(1).Documentもアリです
    'Set objDOC = objFRAME(1).Document 'フレーム(1)をセットでも動きます

    '項目名を指定して、データをセットする
    objDOC.all("userid").Value = "Ken3" 'ユーザー名
    objDOC.all("pass").Value = "aaa"    'パスワード

End Sub
ポイントは、 ~~~~~~~~~~~~ Dim objFRAME As FramesCollection で、 フレーム用のオブジェクト変数を作成して、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Set objFRAME = objIE.Document.frames 'フレームの代入 で、フレームを代入 おまけで、 Debug.Print "フレームの数は" & objFRAME.Length と、.Lengthでフレーム数を表示して、 あとは、 'ドキュメントオブジェクトの代入 Dim objDOC As IHTMLDocument 'HTMLドキュメント HTMLのドキュメントに、 Set objDOC = objFRAME("F_RIGHT").Document 'フレームのドキュメントをセット と "F_RIGHT"とフレーム名称を指定したフレームのドキュメントを代入してます。 objFRAME(0).Document objFRAME(1).Document など、番号で参照も可能です。 ※0から始まり、.Lengthでフレーム数がわかります。 こんな感じで、フレームは、 objIE.Document.frames だったんですね。 いろいろと型を指定して、代入して、遊んでみました。

/* * 5.普通に上からオブジェクトにたどりつけるよ */

型を調べて、いろいろ分割・分解代入したけど、 そんなことしなくても、普通にできちゃったりして・・・ なんか、無理やりオブジェクトブラウザ使って、分解したけど Excelなら、 アプリ・ブック・シート・セルを.でセットみたいに、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IE操作も一気にTOPのObjectからたどってみます。
Sub ie_test_2()

    Dim objIE    As Object '型は何でも来い、得意のObject型

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    'フレームページを表示する
    objIE.Navigate "http://www.ken3.org/vba/test116.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'TOPのオブジェクトから項目まで.で行く(笑)
    objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3"
    objIE.Document.frames("F_RIGHT").Document.all("pass").Value = "aaa"

End Sub
今までの苦労をくつがえす(笑)解説をするのも、 三流プログラマーらしいよね。 objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3" は、 objIE CreateObject("InternetExplorer.application")で作成したオブジェクト から、 .Document ドキュメントオブジェクト .Navigate で表示した test116.html .frames("F_RIGHT") フレームは、F_RIGHTってフレーム名 .Document そのフレームのドキュメントを取得して .all("userid") 項目は"userid"だよ .Value = "Ken3" と .Valueのプロパティにセット・・・ なんだよ、いつものなんでもOK、参照設定やらない君でもできるじゃん(笑) -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ~~~~~~~~~~~~~~~~ オレ様、私は、SE様だ、月給30万以上ボーナス100万を探すのもありだよ。 私にみたいにVBA少しできるぐらいだと仕事無いよ・・・ と軽く言われても匿名なら気にならないし(笑) 逆にこんな簡単な仕事で月給27万貰えるの?って会社もあるし、世の中イロイロ。 http://www.ken3.org/etc/500yen/job.html ------------------------------------------------------------------------ 

/* * 6.終わりの挨拶 */

今回は、 IEの操作で、フレームを探ってみました。 フレーム分割されていても、 1つのフレームはHTML形式のオブジェクトなので、 それを利用して、分解してセットしてみました。 あとは、IEお嬢様の服を一枚一枚脱がす・・・じゃなかった、 調べる方法で、オブジェクトブラウザを使用する方法を少し書いてみました。 不思議なIEお嬢様、まだまだ攻略できそうにないよね。 えっ、Excel姫やAccessお姉さまも攻略して無いダロって? ※う〜ん、実力無くて、なかなか、攻略できなくて。。。。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.117 2003/08/08
InternetExplorer操作 .Silentを使用したけど....
[ページTOPへ戻る]

<InternetExplorer操作 .Silentを使用したけど....>

どうも、三流プログラマーのKen3です。 今回は、 InternetExplorerの操作で、.Silentを使用したけど、 JavaScriptの画面表示が止まらない、止めたい、そんなお話です。 なかなか、相手のIEお嬢様は強敵でした・・・

/* * 1.今回のキッカケ */

掲示板に下記の質問をもらいました。 ----- >IEのSilentをtrueにしても >JavaScriptのalert("あああ")は表示されてしまうの >でしょうか? >alertを表示しないようにするにはどのようにすればいいので >しょうか?教えてください。 ----- silent(無音)かぁ。

/* * 2..Silentプロパティ */

IEの.Silent、調べてみると、 http://msdn.microsoft.com/workshop/browser/webbrowser/reference/properties/silent.asp > Silent Property > Sets or retrieves a value that indicates whether > the object can show dialog boxes. だってさ、これを読者から教えてもらった、 エキサイトの翻訳 http://www.excite.co.jp/world/text/ にかけてみると > オブジェクトがダイアログ・ボックスを示すことができるかどうか示す値を > セットするか検索します。 だって、なんとなく、これでいいような気がするんだけど。。。。 > Dialog boxes and messages can be shown. > Critical errors and security alerts are not supressed. > true Dialog boxes are not shown. も変換すると、 >ダイアログ・ボックスとメッセージは示すことができます。 >重大なエラーおよびセキュリティ警報はsupressedされません。 >真実のダイアログ・ボックスは示されません。 セキュリティなど警告以外は、出来そうなんだけど・・・ ^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 3.実際にやってみる */

掲示板に書くって、よほどのことなんですよね。 あたりまえの話ですが、困っていて、四方八方探したけど出来なかったり。 だから、マニュアルに書いてあるだろ・・できるハズだ!!なんて言わないで、 まてよ?と思いテストしてみる。 http://www.ken3.org/vba/test117.html に下記のHTMLを作成しました。 <BODY> <h1>メッセージ画面が表示されるWebページあるよね</h1> <hr> <script type="text/javascript"> <!-- alert("Helloとかやられると・・・"); // --> </script> <noscript> JavaScriptONでテストしてください。 </noscript> まったく(笑)自動巡回だと困るんだよね・・・(オイオイ) </BODY> と、 alert("Helloとかやられると・・・"); で、画面にメッセージボックスを出してみました。 まずは、 http://www.ken3.org/vba/test117.html でテストすると、おっ、簡単にメッセージ出せますね。 下記のような、巡回プログラムだと、 オイオイ、ずっと.Busy=Trueのままで、ループから抜けれない・・・ 原因は、alertで画面にダイアログが表示されているから、 そこから先に読みに行かない。
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/vba/test117.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     MsgBox "巡回終了"

End Sub
そこで、 .Silent = True コイツの出番でしょ。 ^^^^^^^^^^^^^^^ 下記のように組み込んで実行する・・・結果は、
Sub ie_test_Silent()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)
    
    '.Silentを使ってみた が True/False どちらもダメだった・・・
    objIE.Silent = True   'なんで効かないの?

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/vba/test117.html"
    
    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     MsgBox "巡回終了"

End Sub
実行結果は、同じだった・・・ オイオイ、勘弁してよ・・・ こうなったら、スクリプトをツブシテヤル。 読み込み完了後に、""をセットしてスクリプトを消してやるぞ、 といきがって下記のようにしてみるが・・・ HTMLソースの読み込み完了を .ReadyState で判断後、 objIE.Document.Scripts(0).Text = "" と、スクリプトのオブジェクトをつぶしにかかるが、、、 ダメでした。
Sub ie_test_ReadyState()

    Dim objIE    As InternetExplorer   'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)
    
    '.Silentを使ってみた が True/False どちらもダメだった・・・
    objIE.Silent = True   'なんで効かないの?

    '文字列で指定したURLに飛ぶ
    Debug.Print ".ReadyState=" & objIE.ReadyState
    objIE.Navigate "http://www.ken3.org/vba/test117.html"
    Debug.Print ".ReadyState=" & objIE.ReadyState

    '.ReadyState=1を判断する(ロード中以外になったら抜ける)
    Do While objIE.ReadyState = 1 'READYSTATE_LOAD = 1
        DoEvents
        Debug.Print ".ReadyState=" & objIE.ReadyState
    Loop
    
    Debug.Print objIE.Document.documentElement.outerHTML

    'スクリプトをつぶす(オイオイ)
    objIE.Document.Scripts(0).Text = ""

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     MsgBox "巡回終了"

End Sub
余談:HTMLソースの表示 ^^^^^^^^^^^^^^^^^^^^^ Debug.Print objIE.Document.documentElement.outerHTML と .Document.documentElement.outerHTML で表示できました。 前、.Document.All(0) としてましたが。 まぁ、お好きなほうで。

/* * 4.いい加減、頭にくるが、フト初心に帰ると・・・ */

いい加減、出来なくて、頭にきます。 .Silentなんで効かないんだよ。 ^^^^^^^ 一流読者の心の声:バカな三流プログラマーが吠えてるよ。 ~~~~~~~~~~~~~~~~~ alertって日本語に直してみろよボケ? 警戒だって、、あっ、警告メッセージは.Silentできないのか? それは、あたりまえってこと? JavaScriptの解説ページ、ほとんどが、 メッセージのダイアログ表示をaleatで説明しているけど、 う〜ん・・・ こんにちは と 警告しているサイトが日本には多いのか。 まぁ、ホントに18歳以下禁止です、と警告メッセージしているのもあるけど。

/* * 5.セキュリティの設定 */

あとは、セキュリティの設定でJavaScriptなどをOFFにしてから巡回作業。 そんな感じなんだけど、セキュリティをいじる、そんな簡単なプロパティが無い。 ※あったら、マズイんだけど。。。 -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ~~~~~~~~~~~~~~~~ オレ様、私は、SE様だ、月給30万以上ボーナス100万を探すのもありだよ。 私にみたいにVBA少しできるぐらいだと仕事無いよ・・・ と軽く言われても匿名なら気にならないし(笑) 逆にこんな簡単な仕事で月給27万貰えるの?って会社もあるし、世の中イロイロ。 http://www.ken3.org/etc/500yen/job.html ------------------------------------------------------------------------ 

/* * 6.終わりの挨拶 */

今回は、 IEの操作で、 .Silent = True を探ってみました。 が、かわす代替案も無く、意味無いメルマガになってしまった・・・ 私も作ろうとしている(闇の違法ツール?) ^^^^^^^^^^^^^^^^^^^^ 自動巡回プログラムでは、こんにちはの挨拶メッセージで止まる、 自動データ登録処理では、"登録します"のメッセージでやられそう・・ う〜ん・・・ 不思議なIEお嬢様、まだまだ攻略できそうにないよね。 えっ、Excel姫やAccessお姉さまも攻略して無いダロって? ※う〜ん、実力無くて、なかなか、攻略できなくて。。。。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.118 2003/08/09
Microsoft Web Browser コントロールをフォームに貼る
[ページTOPへ戻る]

<Microsoft Web Browser コントロールをフォームに貼る>

どうも、三流プログラマーのKen3です。 今回は、 Microsoft Web Browser コントロール ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ をフォームに貼って、使用してみます。

/* * 1. フォームにIE コントロールを貼る */

いままで、 インターネットエクスプローラー(IE)を起動するには、
Sub ie_test()
    Dim objIE    As Object  'IEオブジェクト参照用
    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)
End Sub
と、 ExcelやAccessの起動でお世話になっている、 CreateObjectを使用して、 "InternetExplorer.application" を作成して外側にアプリケーションを起動してました。 私が最近気が付いたのですが、 AccessやExcelのフォームに(フォーム内に) ワクを作成して、Web画面を表示したり、管理することが出来ます。 Accessのユーザーフォームを例にして説明します。 まず、Accessのフォーム作成で、 挿入・ActiveXコントロールを選択します。 次に、 Microsoft Web Browser コントロールを選択します。 すると、簡単にコントロールを貼ることが出来ます。

/* * 2.コントロールに対して操作を行う(これまでの操作が可能) */

コントロールをなんとか貼ったら、 次は、操作したいので、 ^^^^^^^^^^^^^^^^^^^^^^ テスト用のボタンを作成し、
Private Sub コマンド1_Click()
    Me![WebBrowser0].GoHome
End Sub
と、初期ページを表示してみます。 WebBrowser0がコントロールの名前で、 それに対して、 普通にプロパティやメソッドを操作できます。 無事に、Accessフォーム内にWebの画面が表示されました。 Me![WebBrowser0].Navigate "表示したいURL" など、IE操作で行ったことと同様に使用可能です。 -【けんぞう!】--------------------------------------------------------- 三流君の、小金稼ぎ、お小遣い稼ぎシリーズ第3弾(稼げないだろコラ!!) 参加無料:予想が当たれば一攫千金?今月はプロ野球のセパ勝敗とホームラン数 http://www.ken3.org/etc/500yen/5050.html ← 100万を当たった人数で山分け 『チッ、大穴横浜の勝利に賭けてるのに当たらない(笑)』(横浜ファン:31歳) ------------------------------------------------------------------------ 

/* * 3.終わりの挨拶 */

なんとか、Accessのフォーム内で、IEの表示ができました。 外側で表示、コントロールするより、 フォーム内に表示されたほうが、 アプリケーションの一部で使っているなぁって気になると思います。 ※気分や見た目って大事ですよね。 こんな感じで、 挿入・ActiveXコントロール Microsoft Web Browser コントロール と コントロールを追加するだけで、 AccessとかOffice系のアプリケーションで、 Webへアクセスするプログラムを組むことが出来ます。 さて、表示が出来たら、データの抜出とか、データのセットですよね。 次回は、Accessと組み合わせて、Webからデータを抜く(保存する)、 そんなことをやってみたいと思います。 次回は、もう少しマシなの作りたいですね。 ※できたら、世に出せるくらいのツールになるといいけど、、、 不思議なIEお嬢様、まだまだ攻略できそうにないよね。 えっ、Excel姫やAccessお姉さまも攻略して無いダロって? ※う〜ん、実力無くて、なかなか、攻略できなくて。。。。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.119 2003/08/10
IEを使用して、Web上の表をExcelへ
[ページTOPへ戻る]

<IEを使用して、Web上の表をExcelへ>

どうも、三流プログラマーのKen3です。 今回は、 IEを使用して、Web上の表をExcelに取り込む処理 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ そんな感じの処理を作成してみたいと思います。 http://www.ken3.org/p/7/office-026.lzh に今回のサンプル保存されてます。 あわせてみてください。

/* * 1. 今回のキッカケ */

メールで下記の質問をもらいました。 ----- >私は、IEのテーブル部分をマウスで範囲選択しコピー、そ >れをExcelに貼り付けています。これで、セルスタイル >のデータになります。 >次に、Excelデータをアクセステーブルに追加貼付け >しています。これら一連の手作業をVBAで自動的にやりた >いのですが、できれば、連続的に例えば同種で複数のページ >を自動的に取り込めたらと思うのですが。 ----- 要望は、Accessのテーブルへだけど、 今回は、途中のIE --> Excelへの落とし込みにチャレンジしてみます。

/* * 2.IE Elementオブジェクト(タグに対応した各要素)を探る */

IEのオブジェクトの要素を探ってみます。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sub ie_test_click()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object
    Dim y As Integer

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/g/index.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     '
     y = 2
     
     '.All のデータをループする
     For Each objTAG In objIE.document.all
        Cells(y, "A") = objTAG.tagName
        Cells(y, "B") = objTAG.innerHTML
        Cells(y, "C") = objTAG.innerTEXT
        Cells(y, "D") = objTAG.outerHTML
        Cells(y, "E") = objTAG.outerTEXT
        y = y + 1
     Next

End Sub
ポイントは、 ~~~~~~~~~~~~ For Each objTAG In objIE.document.all で、.Allまわしてみました。 Cells(y, "A") = objTAG.tagName Cells(y, "B") = objTAG.innerHTML Cells(y, "C") = objTAG.innerTEXT Cells(y, "D") = objTAG.outerHTML Cells(y, "E") = objTAG.outerTEXT で、それぞれ、データをセットしてみました。 Elementオブジェクト(タグに対応した各要素) innerHTML 内部にあるタグ付き文字列 innerText 内部にある文字列のみ outerHTML 外部も含めたタグ付き文字列 outerText 外部も含めた文字列 tagName 対象となっているタグの名前 と、データが取れるので、確認してみてください。 HTMLは、基本のパターンを書くと、 <Font SIZE=+1><I>AAAA</I></Font> と、 タグの開始と終了に挟まれています(囲われてます) For Each objTAG In objIE.document.all で、各タグを取り出してます。 まぁ、 .tagNameがタグの名前なので、FONTとなっていて、 ^^^^^^^^ .innerHTMLは内部にあるタグ付き文字列なので、<I>AAAA</I> ^^^^^^^^^^ .outerHTMLが外部も含めたタグ付き文字列、なんて堅く書いてるけど、 ^^^^^^^^^^そのまんまの、 <Font SIZE=+1><I>AAAA</I></Font> と外側のタグも含めたHTMLの文字列なんですね。 あとは、innerText,outerText は、タグが抜かれたテキストです。 場面によって、使い分けてくださいね。

/* * 3.表のオブジェクト(TABLEタグ)を探る */

作りたいのは、Web上に表示されている表から、 データを取り出したい処理なので、そこら辺を探ってみます。 HTMLの表は、基本のパターンを書くと、 <TABLE> <TR> <TD>XXXXXX</TD> <TD>YYYYYY</TD> <TD>ZZZZZZ</TD> </TR> </TABLE> と、 <TABLE>テーブルのタグから始まり、 <TR>行の開始 <TD>列のデータ(<TH>と見出しをキチント書いている人もありです) の 3つの組み合わせと順番です。 IE Elementオブジェクト(タグに対応した各要素) で、 Elementオブジェクト(タグに対応した各要素) innerHTML 内部にあるタグ付き文字列 innerText 内部にある文字列のみ outerHTML 外部も含めたタグ付き文字列 outerText 外部も含めた文字列 tagName 対象となっているタグの名前 を探ってました。 下記のテストプログラムで、 http://www.ken3.org/cgi-bin/cnt/test.asp で表示される表を探ってみます。
Sub ie_test_click()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object
    Dim y As Integer

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/cnt/test.asp"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop
     
     'データを削除する
    Rows("3:1000").Select
    Selection.Delete Shift:=xlUp
     
     '3行目から書き込む
     y = 3
     
     '.body のデータをループする
     For Each objTAG In objIE.document.body.all
        Cells(y, "A") = objTAG.tagName
        Cells(y, "B") = objTAG.innerHTML
        Cells(y, "C") = objTAG.innerTEXT
        Cells(y, "D") = objTAG.outerHTML
        Cells(y, "E") = objTAG.outerTEXT
        y = y + 1
     Next

End Sub
タグ別にデータを取り出せるが、 これだと、テーブルは見つけられても、セットできない。 う〜ん、、どうしましょう・・・ objIE.document.body.allのアイテム内を探すと、 さらに下の<TABLE>のアイテムを探ると、 ITEM8なんですが、その下にもALLの階層があって、 さらにアイテムを探すと、テーブルの中身が取れます。 Item8は、.all 28個のアイテムを持っていて、 なんて感じで、テーブル内のデータを探れそうです。

/* * 4.階層を深くたどり、Excelへデータを取り込む */

TABLEのタグを見つけたら、 そのITEM内をさらに.Allで探し、テーブルをExcelの表にしてみたいと思います。
Sub ie_make_table_test()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim objTAG   As Object  'TAGのオブジェクトを代入
    Dim y As Integer
    Dim x As Integer
    Dim objTableItem As Object 'TABLE内のITEM検索用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/cnt/test.asp"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop
     
     '.body のデータをループする
     For Each objTAG In objIE.document.body.all
        'テーブルのタグを探す
        If objTAG.tagName = "TABLE" Then
            '新規ブックを追加する
            Workbooks.Add
            'カウンタの初期化
            y = 0 '行カウンタ
            'テーブル内のITEMでループする
            For Each objTableItem In objTAG.all
                If objTableItem.tagName = "TR" Then
                    y = y + 1   '行カウンタを+1
                    x = 1 '列カウンタを1(左端にする)
                End If
                If objTableItem.tagName = "TD" Then
                    'テキストデータをセットする
                    Cells(y, x) = objTableItem.innerText
                    x = x + 1 '列カウンタを+1(次にする)
                End If
            Next
        End If
     Next

End Sub
なんか、ループが深いですが、 ポイントは、 ^^^^^^^^^^^^ For Each objTAG In objIE.document.body.all と、<BODY>内をループで回し、タグ(ITEM)を1つ1つ取り出します。 取り出したタグがTABLEか判断するには、 If objTAG.tagName = "TABLE" Then と、.tagNameで判断してます。 ※TABLEの要素を.document.body.allから見つけます。  見つけ方は、.tagNameとタグの名前がTABLEかで判断してます。 TABLEのITEM(要素、エレメント)を見つけたら、 今度は、そのTABLE内のITEMを1つ1つ取り出します。 For Each objTableItem In objTAG.all objTAG.allがポイントです。 ※objTAGがテーブルのオブジェクトです、  このオブジェクトは、階層構造になっており、  アイテムを複数持ってます。  そのアイテムを取り出すために、 For Each objTableItem In objTAG.all  と記述して、TABLEオブジェクトから要素(TRやTDなど)を取り出します 行の開始が<TR>なので、 If objTableItem.tagName = "TR" Then y = y + 1 '行カウンタを+1 x = 1 '列カウンタを1(左端にする) End If と、行を+1列を開始位置の1にセットします。 <TD>がデータなので、 If objTableItem.tagName = "TD" Then 'テキストデータをセットする Cells(y, x) = objTableItem.innerText x = x + 1 '列カウンタを+1(次にする) End If と普通にデータをセットしてます。 -------------------- 三流君の、小金稼ぎ、お小遣い稼ぎシリーズ3つ(稼げないだろコラ!!) どれも参加無料:松竹梅じゃないけど今私がチャレンジしている3つを紹介 確実に月500ぐらい稼ぎたかったら、 http://www.ken3.org/etc/500yen/index.html のアンケートに答えて謝礼がお薦め、500円でイーバンク、1000円商品券など ※私の実績も画面コピーで載せてます。 次は、まだ当たってないけど(オイオイ)、当ててHPに載せてやると気合入っている プロ野球の勝敗ホームラン数を予想、100万を当たった人数で山分け http://www.ken3.org/etc/500yen/5050.html ← TOTOじゃないけど当たらない 『チッ、大穴横浜の勝利に賭けてるのに当たらない(笑)』(横浜ファン:31歳) ※ファンを抜きにして、勝負しないと当たらないかも・・・ 最後は、いろいろな近未来を予想する、予想.Net http://www.ken3.org/etc/500yen/yosou.html 音楽でXXXはオリコンX位を当てる、新ドラマの視聴率どれが1位、 松井・新庄のニューヨーク対決は○勝○敗など、 自分の得意な分野の問題を選んでコインを賭ける。 ※でも最低1000円分ポイント貯まらないと現金化できない、  現在私は、156円分しかポイント貯まっていない・・・ --------------------

/* * 5.終わりの挨拶 */

今回は、 IEのオブジェクト、ITEMを探るのを兼ねて、 <TABLE>をExcelに取り込んでみました。 http://www.ken3.org/p/7/office-026.lzh に今回のサンプル保存されてます。 あわせてみてください。 最大のポイントは、 みつけた<TABLE>のアイテムからさらにITEMが検索可能だった点です。 まぁ、よくよく、考えてみれば、 <HTML> 〜 </ HTML>と、一番大きなタグ(笑) から、ITEM単位で行っているので、 大分類から中分類、小分類を探る、そんな感じでしたね。 なんか、出来たようなこと、完成したと書いてるけど、 結合セルの処理がまだなのと、右寄せ・中央・左寄せなどの処理、 バックカラーの処理がまだかなぁ。 あっ、あと、表なのに、罫線もつけてないしね・・・ 不思議なIEお嬢様、まだまだ攻略できそうにないよね。 えっ、Excel姫やAccessお姉さまも攻略して無いダロって? ※う〜ん、実力無くて、なかなか、攻略できなくて。。。。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]