三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー]
[VBA系 TOP]
[三流君 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でした。
<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でした。
<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でした。
<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でした。
<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でした。
検索して目的の情報を探す。
目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。
ページフッター
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
質問や要望など メッセージを送る(三流君に連絡する)
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
|
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
|
急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。
リンクや広告など
項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多い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系バックナンバー目次へ移動]