[No.50 IE起動 CreateObject("InternetExplorer.application")]
[No.51 Excel Range オブジェクトを使う]
[No.52 InternetExplorer.application .document.body.innerText]
[No.53 文字列を探す、InStr関数の使い方]
[No.54 AccessからExcel開いて、処理終了後に閉じたい]

www.ken3.org(サイト内)から Google を利用して、

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



No.50 2003/01/22
IE起動 CreateObject("InternetExplorer.application")
[ページTOPへ戻る]

<IE起動 CreateObject("InternetExplorer.application")>

こんにちは、三流プログラマーKen3です。 今回は、 IEを起動して、指定したページを表示 ~~~~~~~~~~~~~~を軽く書きたいと思います。 普通に業務でVBAやってるとあまり関係無いので、 へぇ〜、そうなんだぁ程度に、気楽に読んでください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba050.lzh に test050-book.xlsが保存されています。 遊んでみてください。 /* * 1.今回のキッカケ */ HPにアクセスランキングなんて付けると、 なぜか気になってしまう、、、そんな小物の自分に気が付く(笑) パソコン立ち上げたら、メールチェック、危ない質問メールがなかったら、 カウント数を見に行ってしまう。 http://www.ken3.org/cgi-bin/lime/limemgr.cgi ---- 種類別 http://www.ken3.org/cgi-bin/lime2/limemgr.cgi --- バックナンバー別 で、数字を見て、テキストファイルに 07 09 10 14 19 21 M 814 835 842 871 926 944 B 1428 1439 1446 1500 1614 1640 と書き込んで、おっ2時間の間に30人来てるよとか見て書き込んでます。 なんか笑ってしまうよね。 チョット前行った要望アンケートで、 ( http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi?mode=allread&no=31&page=0 ) IEのコントロールなどオブジェクト関係 4 人 7 % と、4人の読者の要望があったので、 今回、IEの起動をやってみたいと思います。 少数意見を拾うって、三流君らしくっていいんだけどさぁ、 VBAもっと詳しく解説しろ 17 人 30 % ↑~~~~~~~~~~~~~~~の大多数の3割の意見には、対応してるの? ギク、、、バックナンバー見なおして、弱いところを補足しなきゃイケナイヤ。 *やってほしい特集あったら、メール・掲示板に書いてください。 /* * 2.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" を作成してます。 その後、 objIE.Visible = True '見えるようにする(お約束) で、プロパティの可視をTrueにして、表示してます。 ←実行画面 /* * 3.指定したURLに飛ぶ */ 無事、起動ができたら、今度は指定したページに飛ばしたいです。 私のメインページ、 http://www.ken3.org/ に飛ばすには、 .Navigate メソッドを使います (全然関係無いけど、ネットスケープNavigator って頭に浮かんだ) Sub ie_go_ken3() Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) '文字列で指定したURLに飛ぶ objIE.Navigate "http://www.ken3.org/" End Sub 使い方は簡単で、 objIE.Navigate "http://www.ken3.org/" と、文字列で飛びたい場所を指定してるたけです。 ←実行画面 /* * 4.HTMLのソースを取り込む */ さて、IE起動、ページの移動、と順調?に来たので、 次は、アクセスカウンターの数値を取りこみたいんだけど、 どうしましょう? う〜ん、、、あまり考えててもしょうがないので、 今回は、HTMLのソースから取ることにします。 HTMLのソースは、埋まっていて、 .document.body.innerHTML で取出せます。 また、補足のポイントがあって、 読みこみ前に.document.body.innerHTMLを参照するとエラーが発生するので、 .Busy プロパティを見て、読み込み中、読み込み完了を判断します。 Sub ie_get_html() Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) 'ランキングのページに飛ぶ objIE.Navigate "http://www.ken3.org/cgi-bin/lime/limemgr.cgi" '表示されるまで待つ、10秒後にエラーを判断する Dim time10 As Date '時刻格納用 time10 = DateAdd("s", 10, Now()) '現在から10秒後を計算 Do While objIE.Busy = True 'ビジー、読み込み中の間 DoEvents If time10 < Now() Then '10秒経過したか? MsgBox "タイムアウトです" Exit Sub End If Loop 'HTMLソースを取出す Dim strHTML As String strHTML = objIE.document.body.innerHTML '変数に代入 MsgBox strHTML 'テスト表示 Debug.Print strHTML 'イミディエイトにも表示 End Sub なんか、いきなり長くなったけど、ポイントは、 Do While objIE.Busy = True 'ビジー、読み込み中の間 で、.Busy = True読み込み中を判断してます。 ずっと読み込み中だとイヤなので、 If time10 < Now() Then '10秒経過したか? MsgBox "タイムアウトです" Exit Sub End If と、10秒後をチェックして、10秒経ったら関数を抜けてます。 strHTML = objIE.document.body.innerHTML '変数に代入 で、ソースを変数に代入して、 MsgBox strHTML 'テスト表示 Debug.Print strHTML 'イミディエイトにも表示 と、確認表示してます。 Debug.Printで、下記のように表示されてます。 <TR> <TH colSpan=2>計</TH> <TD align=right><B>1,073</B></TD> <TD><BR></TD></TR></TBODY></TABLE><BR><BR> <DIV align=right> ここから、計の文字を探して、1,073を取出せば、OKですね。 説明が長くなりそうなので、 計の文字を探して、1,073を取出しは、次回ループとInStr関数にします。 ←デバック画面 /* * 5.おわりの挨拶 */ 今回は、 ・IEの起動 ・指定ページに飛ぶ ・HTMLのソースを取出す でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba050.lzh に test050-book.xlsが保存されています。 IEのコントロールも簡単、ハマるでしょ? また、使い方によっては、いろいろと変な処理もできそうです。 *掲示板荒らしとか自動広告クリックとか、へんな方向に使わないでね。。。 何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.51 2003/01/24
Excel Range オブジェクトを使う
[ページTOPへ戻る]

<Excel Range オブジェクトを使う>

こんにちは、三流プログラマーKen3です。 今回は、 Excel Range オブジェクト ~~~~~~~~~~~~~~を軽く書きたいと思います。 へぇ〜、そうなんだぁ程度に、気楽に読んでください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba051.lzh に test051-book.xlsが保存されています。 遊んでみてください。 /* * 1.今回のキッカケ */ Excelは、表計算ソフトって言われてます。 まぁ、よく聞くフレーズだよね。 Excelでは、 操作の対象が、セルの集合体(範囲)なんてよくあると思うので、 今回は、Rangeオブジェクトについて、軽く書きたいと思います。 おまけで、Excelの表をHTMLにするサンプルを書きました。 テストして、笑ってくださいね。 *今後、やってほしい特集あったら、メール・掲示板に書いてください。 /* * 2.Range とか 言ってるけど? */ Range オブジェクトとか言ってるけど、 単なるセルの集合体なんですよね。 Sub test() Range("a2:d10").Value = "TESTです" Range("a2:d10").Font.Bold = True End Sub ごくごく、簡単な方法は、 Range("a2:d10など範囲の文字列").プロパティorメソッド なんてよくワークシートのSUMで使っている A2:D10と見た目も簡単に書くことが出来ます。 また、 Sub test2() Range(Cells(11, 2), Cells(20, 5)).Value = "ここですよ" Range(Cells(11, 2), Cells(20, 5)).Font.Size = 8 End Sub みたいに、 セルのここからCells(11, 2)、ここまでCells(20, 5)、 と、範囲の指定も出来ます。 /* * 3.Range型として、変数で使用可能です */ 直接、Range("a2:d10")なんて書いてたら、なんか使いにくいですよね。 As Range と Range型を定義して、使用することも出来ます。 Sub test3() Dim myRANGE As Range 'Range型を定義 Set myRANGE = Range("A2:F10") myRANGE.Cells(1, 1) = "XXXX" myRANGE.Cells(1, 1).Font.Size = 16 End Sub Dim myRANGE As Range と、Range型の変数を作成、 値の代入には、Setを使い、 Set myRANGE = Range("A2:F10") みたいな感じで、代入セットします。 面白いのは、myRANGE.Cells(1, 1)みたいに、 その変数内の1行目1列目と使えるとこかなぁ。 /* * 4.応用編、こんな使い方も出来るのかなぁ */ ここまでだと、物足りないので? セルの範囲を選択させ()、 HTMLのテーブルを(ファイルを)作ってみたいと思います。 Sub make_table() 'Application.InputBoxでセルを選択させる Dim objHANI As Range '選択されたセルの集合 Set objHANI = Application.InputBox(prompt:="セルを選択", Type:=8) If IsEmpty(objHANI) Then 'キャンセルが押されたかチェックする MsgBox "キャンセルが押されました" End If 'ファイルをオープンする Dim FNO As Integer 'ファイル番号 Dim strFNAME As String 'ファイル名保存用 FNO = FreeFile '空いてるファイル番号を取出す strFNAME = ThisWorkbook.Path & "\test.html" 'ファイル名を作る Open strFNAME For Output As #FNO 'テキストファイルを新規作成 'HTMLのヘッダーを書く Print #FNO, "<HTML><HEAD><TITLE>" Print #FNO, "テーブル作成" Print #FNO, "</TITLE></HEAD>" Print #FNO, "<BODY>" Print #FNO, "<TABLE border=1>" 'テーブルの開始 '行、列でループを作る Dim y As Integer Dim x As Integer For y = 1 To objHANI.Rows.Count '行のループ Print #FNO, "<TR>"; '行の開始タグ For x = 1 To objHANI.Columns.Count '列のループ 'セルの値を<TD>で囲って出力 Print #FNO, "<TD>" & objHANI.Cells(y, x).Value & "</TD>"; Next x Print #FNO, "</TR>" '行の終了タグ Next y 'HTMLのタグを閉める Print #FNO, "</TABLE>" Print #FNO, "</BODY></HTML>" 'ファイルをクローズする Close #FNO 'おまけでIEを起動して、表示 Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) objIE.Navigate strFNAME '文字列で指定したURLに飛ぶ '終わりの挨拶 MsgBox strFNAME & "を作成しました" End Sub ポイントは、 Dim objHANI As Range '選択されたセルの集合 Set objHANI = Application.InputBox(prompt:="セルを選択", Type:=8) で、セルを選択させて、 その選択された範囲に対して、 '行、列でループを作る Dim y As Integer Dim x As Integer For y = 1 To objHANI.Rows.Count '行のループ Print #FNO, "<TR>"; '行の開始タグ For x = 1 To objHANI.Columns.Count '列のループ 'セルの値を<TD>で囲って出力 Print #FNO, "<TD>" & objHANI.Cells(y, x).Value & "</TD>"; Next x Print #FNO, "</TR>" '行の終了タグ Next y のループで、データを書いてるだけです。 ループ作成で、これは?何?と思うのが、 objHANI.Rows.Countの行カウントと、 ~~~~~~~~~~~ objHANI.Columns.Count列カウントです。 ~~~~~~~~~~~~~~ これは、Rangeオブジェクトが値を持っているので使わせてもらいました。 *A1:E7とかから求めるのは大変だったのでラッキーでした。 あとは、普通に、選択された範囲から objHANI.Cells(y, x).Value と、Cells(y, x)で普通に取出しています。 Range型のプロパティ、メソッドは数多いので、みなさんも探ってみて下さい。 /* * 5.おわりの挨拶 */ Rangeオブジェクト、なんとなく使い方、わかったと思います。 今回は、 ・Rangeオブジェクトって? ・Range型として、変数で使用可能です ・.Rows.Countの行カウントと.Columns.Count列カウント でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba051.lzh に test051-book.xlsが保存されています。 表の入力が得意のExcelで表を入力、 ちょっとしたVBAで表をHTML化することも、 なんか簡単にできそうですね。 *メモ帳、HTML作成派の私も表の部分は使ってみようかなぁ、、  えっ、まだまだ、機能が足りないって?そうですね。  今後、Excel解説とあわせて肉付けしていく予定です。 何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.11 InputBox関数で簡単な値を受け取る] ( http://www.ken3.org/backno/backno_vba03.html#11 を参照) では、 Excel VBA Application.InputBox の解説を少し。 [No.27 テキストファイル処理 ファイルへの書き込み] ( http://www.ken3.org/backno/backno_vba06.html#27 を参照) では、 テキストファイルの作成処理の解説を少し。 [No.44 Cells(257)とCells(2,1)の関係] ( http://www.ken3.org/backno/backno_vba09.html#44 を参照) では、 Cellsを少し。 [No.50 IE起動 CreateObject("InternetExplorer.application")] ( http://www.ken3.org/backno/backno_vba11.html#50 を参照) では、IEの起動方法を書きました。 -------------------- 読者からのお便り紹介 -------------------- In message "Re: やばい0のまま、、、", いちにいさん wrote... >> >で、購読者「0x0000」ってか?(笑) >> >> イヤ&h00です。 >> 16進で書いても0は0かぁ(涙でそう) >VBだから、&Hか。(笑) >400円/月なら、数ヶ月分で参考書とか買えちゃうよね。 >やっぱ、出版素人の物って、業界のプロの物でも、 >手を出しにくいよね。 >あと、形のないデジタルデータって、何か金払いたくない、 >みたいな。(笑) ---- 有料版のメルマガ、予想通り苦戦中。 2003/01/18 三流作者、有料メルマガに挑戦 http://www.ken3.org/backno/backno_guchi29.html#146 で、最悪4・5人なんて書いてたけど、現実はかなり厳しい。 ←読者0の現実画像 まずは、無料版をがんばってから有料版だよね。 話は少し変わって、 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi?mode=allread&no=13&page=0 で、Excel VBAからFTPを使う方法、 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi?mode=allread&no=44&page=0 で、AccessVBAからExcelの書式を設定.. など、質問の掲示板も運営してるので(おいおい)、 時間のあるとき、のぞきに来てください。 *なかなか、掲示板を流行らせるのって大変みたいですね。  おっと、まずは、メルマガ無料読者を増やさなきゃね。

No.52 2003/01/26
InternetExplorer.application .document.body.innerText
[ページTOPへ戻る]

<InternetExplorer.application .document.body.innerText>

こんにちは、三流プログラマーKen3です。 今回は、 InternetExplorer.application オブジェクト の、.document.body.innerText 表示内容を軽く書きたいと思います。 へぇ〜、そうなんだぁ程度に、気楽に読んでください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba052.lzh に test052-book.xlsが保存されています。 遊んでみてください。 /* * 1.今回のキッカケ */ [No.50 IE起動 CreateObject("InternetExplorer.application")] ( http://www.ken3.org/backno/backno_vba11.html#50 を参照) で、 Set objIE = CreateObject("InternetExplorer.application") で、インターネットエクスプローラーのオブジェクトを作り、 strHTML = objIE.document.body.innerHTML '変数に代入 でHTMLのソースを取出す。 <TR> <TH colSpan=2>計</TH> <TD align=right><B>1,073</B></TD> <TD><BR></TD></TR></TBODY></TABLE><BR><BR> ここから、計の文字を探して、1,073を取出せば、OKですね。 と、ここまで、やりました。 テーブルのタグを管理している部分があるか、 チェックして遊んでました。 *今後、やってほしい特集あったら、メール・掲示板に書いてください。 /* * 2.デバッグで止める、ウォッチで中身を見る */ あんまり好きじゃないけど、 ブレークポイントを設定し、デバッグで止めて、オブジェクトを見てみます。 ~~~~~~~~~~~~~~~~ Sub ie_stop() Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) '文字列で指定したURLに飛ぶ objIE.Navigate "http://www.ken3.org/cgi-bin/lime/limemgr.cgi" 'デバックで止める MsgBox "OK?" End Sub この処理の、MsgBox "OK?"の行に設定したいので、 右クリック、設定・解除 -- ブレークポイントを選択し、設定します。 ←参考画面 次に変数を見たいのでウォッチ式を追加します。 追加方法は、 Dim objIE As Object 'IEオブジェクト参照用 など、変数を定義している場所で、 objIEをドラック、右クリックしてウォッチ式の追加を選択します。 ←参考画面 /* * 3.実行して、オブジェクトの中身を探る */ ブレークポイントの設定 変数objIEをウォッチする準備が整ったので、 実行して、変数の中身を探ってみます。 実行すると、ブレークポイントの場所で止まります。 当たり前だろ、そのために設定したんでしょアナタが。 そうでしたね。 ブレークポイントで止まってからは、 飲み会に誘った女の子みたいに逃げないので 落ち着いて中身をチェックしましょう。 (飲み会で、逃げられてるみたいだなぁ、この書き方だと(笑)) ウォッチウインドウの変数名の横+をクリックして中身を探って行きます。 ←参考画面 それにしても、階層が深いです。 テーブル系のオブジェクトを探すが、なかなか見つからない。 (女の子じゃなくって、IEの心の中は複雑なのね、、、) 途中で、innerTextなんてのを見つけたので、 中身を確認するために、となりのイミディエイトウインドウで、 ? objIE.document.body.innerText と中身を聞いてみた(アクセスしてみた。) ←参考画面 ? objIE.document.body.innerText [戻る] アクセス集計一覧 以下は当サイトのアクセス集計です。 リンク部をクリックすると該当ページへジャンプします。 順位項目カウント統計 1VBA系411 25.3% 2総合案内のページ(TOP)302 18.6% 3VBA系バックナンバー目次215 13.2% 4コンビニ166 10.2% 5愚痴系バックナンバー目次138 8.5% 6ASP系のメルマガ122 7.5% 7ASP系バックナンバー目次94 5.8% 8愚痴92 5.7% 9VB.NET(有料版)30 1.8% 10有料版メルマガ(TOP)24 1.5% 11Officeで作る(有料版)15 0.9% 12ASPで作るGame(有料版)14 0.9% 計1,623 と詰まったテキストが表示されました。 こっちのほうが<XXX>とタグが付いてないので、 使い易そうです。(ケースにもよるけどね) 目的のテーブル関係のオブジェクトは見つからなかったのですが、 ネタになりそうな.innerTextプロパティを拾ったので、 中断を解除します(ブレークで止めてた処理を継続し終わらせる) ←参考画面 /* * 4..document.body.innerText で取り出してみた */ さっそく、調べたプロパティ.innerTextを使って、 テキストを抜き出し表示してみました。 Sub ie_get_itext() 'VBA052で解説 Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) 'ランキングのページに飛ぶ objIE.Navigate "http://www.ken3.org/cgi-bin/lime/limemgr.cgi" '表示されるまで待つ、10秒後にエラーを判断する Dim time10 As Date '時刻格納用 time10 = DateAdd("s", 10, Now()) '現在から10秒後を計算 Do While objIE.Busy = True 'ビジー、読み込み中の間 DoEvents If time10 < Now() Then '10秒経過したか? MsgBox "タイムアウトです" Exit Sub End If Loop 'innerTextを取出す Dim strTEXT As String strTEXT = objIE.document.body.innerText '変数に代入 Debug.Print strTEXT 'イミディエイトにも表示 'UserFormを開く(確認用) frmINFO.txtINFO.Value = strTEXT 'HTMLを代入 frmINFO.Show 'フォームを開く End Sub ポイントは、 ~~~~~~~~~~~ Dim strTEXT As String strTEXT = objIE.document.body.innerText '変数に代入 で、変数代入後、 いつものMsgBoxだとツマラナイので、 確認用のユーザーフォームを作成し、 frmINFO.txtINFO.Value = strTEXT 'HTMLを代入 frmINFO.Show 'フォームを開く とフォームに表示してみました。 /* * 5.おわりの挨拶 */ 今回は、 ・プレークポイントを設定、ウォッチ式の追加、変数の中身を探る ・.document.body.innerTextで、IEのテキスト表示データを撮り込む でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba052.lzh に test052-book.xlsが保存されています。 いろいろなWebサイトから、データをExcelやAccessにもって来れそうですね。 何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.50 IE起動 CreateObject("InternetExplorer.application")] ( http://www.ken3.org/backno/backno_vba11.html#50 を参照) では、IEの起動方法を書きました。 [ イミディエイト ウインドウ と Debug.Print ] ( http://www.ken3.org/vba/iwind.html を参照 ) で、イミディエイト ウインドウの説明を少し。 [ プロパティ、メソッドを探る方法 ] ( http://www.ken3.org/vba/excel-help.html を参照 ) で、プロパティ、メソッドを探る方法の説明を少し行いました。 時間があったら、あわせてみて下さい。 -------------------- 読者からのお便り紹介 -------------------- In message "無料のこっちのほうがいい", am/pm最高 さん wrote... >服屋が書く!ACCESS2000・POSレジ自作講座! >けんぞうのマガより筋道がしっかりしている >>バックナンバーは以下から見ることができます。 >>http://www.leasekin.com/rodan/mag2pos/p1_20.htm >脈略の無い、思い付き解説者さんも見習ってみては・・・(^○^) ---- XXX最高はコンビニ系掲示板も見てる読者さんだと予想。 しばらく無かった、ここみて勉強しろ系のメールですね。 http://www.mag2.com/m/0000075580.htm が登録ページで、 私もざっと見てみたけど、 まず、図がキレイ、この図解はわかり易いと思う、丁寧だし、 私のマウスの手書き文字とは雲泥の差、月とすっぽん、 比べると怒られるぐらい丁寧です。 雑誌に載るメルマガはやはり違うなぁと思った。 おいおい、少しは差を埋める努力しろって? *差がありすぎて、チョット追いつけないかなぁ。 ほかにもお奨めメルマガあったら、教えてください。 脈略の無いマイペース、思い付き解説のKen3でした。 ~~~~~~~~↑たしかに、、、、、

No.53 2003/01/28
文字列を探す、InStr関数の使い方
[ページTOPへ戻る]

<文字列を探す、InStr関数の使い方>

こんにちは、三流プログラマーKen3です。 今回は、 文字列を探すInStr関数の使い方 を軽く書きたいと思います。 へぇ〜、そうなんだぁ程度に、気楽に読んでください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba053.lzh に test053-book.xlsが保存されています。 遊んでみてください。 /* * 1.今回のキッカケ */ [No.52 InternetExplorer.application .document.body.innerText] ( http://www.ken3.org/backno/backno_vba11.html#52 を参照) で、.body.innerTextを偶然発見し、HTMLのテキストデータの取得が出来た。 ? objIE.document.body.innerText [戻る] アクセス集計一覧 以下は当サイトのアクセス集計です。 リンク部をクリックすると該当ページへジャンプします。 順位項目カウント統計 1VBA系411 25.3% 2総合案内のページ(TOP)302 18.6% 3VBA系バックナンバー目次215 13.2% 4コンビニ166 10.2% 5愚痴系バックナンバー目次138 8.5% 6ASP系のメルマガ122 7.5% 7ASP系バックナンバー目次94 5.8% 8愚痴92 5.7% 9VB.NET(有料版)30 1.8% 10有料版メルマガ(TOP)24 1.5% 11Officeで作る(有料版)15 0.9% 12ASPで作るGame(有料版)14 0.9% 計1,623 ・ ・ ・ まで、HTML内の文字列を知ることが出来ました。 さてと、取出したいのは最後の 計1,623 ~~~~~~~ なんだよね。 計の文字でも探して見ますか。 /* * 2.文字列を探す関数、InStrを使用してみる */ 文字列を探す関数で、InStr関数があります。 構文 InStr([start, ]string1, string2[, compare]) です。 ? instr("ABCDEFABC", "BC") 2 この検索スタート位置が省略できるのが気になるけど、 Instr(検索開始,検索される文字列,探したい文字列) でOKです。 ? instr(3, "ABCDEFABC", "BC") 8 と、3を検索開始位置に指定することも出来ます。 ? instr("ABCDEFABC", "ZBC") 0 見つからなかった時は、0を返してくれます。 なかなか、使えそうですね。 ←参考画面 /* * 3.最後の「計」を探す */ 'UserFormを開く(確認用) frmINFO.txtINFO.Value = strTEXT 'TEXTを代入 frmINFO.Show 'フォームを開く と、テキストがフォームに代入されているので、 ホームにボタンを作成して、取出してみます。 Private Sub btnSETDATA_Click() 'テキストボックスから計の文字を探して抜き出す Dim nLOC As Integer '計の文字位置 Dim nSTART As Integer '検索開始位置 nLOC = 0 '初期化 nSTART = 1 '検索開始位置 Do While True '無限ループにする nSTART = InStr(nSTART + 1, Me![txtINFO], "計") '計の文字を探す If nSTART = 0 Then '見つからなかったら Exit Do 'ループを抜ける End If nLOC = nSTART '検索位置を保存 Loop If nLOC = 0 Then '1回も見つからなかったら MsgBox "「計」の文字が見つかりませんでした" Exit Sub '関数を途中で抜ける End If '数値に変換して、結果を表示する Dim strWORK As String '計の後ろを取出す Dim nKAZU As Integer '変換した数値を受け取る strWORK = Mid(Me![txtINFO], nLOC + 1, 10) '計の次から10文字取る nKAZU = CInt(strWORK) 'Cintで数値変換 MsgBox "来場者は、" & nKAZU & "です" End Sub 少し、苦労しそうなのが、 計って単語、 ・アクセス集計一覧 ・以下は当サイトのアクセス集計です。 ・順位項目カウント統計 ・計1,623 と、いろいろひっかかりそうなんです。。。 なので、一番最後の計の単語を探すために一工夫してます。 前準備で変数を初期化してます。 nLOC = 0 '初期化 nSTART = 1 '検索開始位置 無限ループを Do While True '無限ループにする で作ってます、~~~必ず条件がTrueになるような変なループです。 次に、文字を探します。 nSTART = InStr(nSTART + 1, Me![txtINFO], "計") '計の文字を探す ポイントは、前回見つけた位置+1(次の文字)から、探します。 If nSTART = 0 Then '見つからなかったら Exit Do 'ループを抜ける End If ここで、見つからなかった時(最後まで探し終わったら)、 Exit Doでループを抜けます。 見つかった時は、位置を保存します。 nLOC = nSTART '検索位置を保存 Loop この処理で、最後に見つかった位置がnLOCに保存されます。 If nLOC = 0 Then '1回も見つからなかったら MsgBox "「計」の文字が見つかりませんでした" Exit Sub '関数を途中で抜ける End If お約束の、1つも見つからなかった時のエラー処理です。 メッセージ表示後、Exit Subで関数を抜けます。 位置がわかったので、 後は、関数を駆使して(笑)、変換するだけです。 '数値に変換して、結果を表示する Dim strWORK As String '計の後ろを取出す Dim nKAZU As Integer '変換した数値を受け取る strWORK = Mid(Me![txtINFO], nLOC + 1, 10) '計の次から10文字取る nKAZU = CInt(strWORK) 'Cintで数値変換 と、あまり気にしないで変換処理を行ってます。 ←参考画面 /* * 4.一番最後なんだから、後ろから探せよ */ できる読者さんの心の声が遠くから聞こえて来たような、 「一番最後なんだから、後ろから探せよボケ」 (ボケまでは、言われないかな(笑)) さてと、得意の脈略無し解説で、余談的に書きますが、 下記のように後ろから探すって考え方もありです。 Private Sub btnP2_Click() Dim n As Integer '文字列の最後から先頭文字まで探る For n = Len(Me![txtINFO]) To 1 Step -1 '計の文字が見つかったかチェックする If Mid(Me![txtINFO], n, 1) = "計" Then Exit For Next n 'データ無しのチェック If n = 1 Then 'カウンタが1(先頭?) MsgBox "「計」の文字が見つかりませんでした" Exit Sub '関数を途中で抜ける End If '数値に変換して、結果を表示する Dim strWORK As String '計の後ろを取出す Dim nKAZU As Integer '変換した数値を受け取る strWORK = Mid(Me![txtINFO], n + 1, 10) '計の次から10文字取る nKAZU = CInt(strWORK) 'Cintで数値変換 MsgBox "来場者は、" & nKAZU & "です" End Sub たまたま、短くなったけど、 '文字列の最後から先頭文字まで探る For n = Len(Me![txtINFO]) To 1 Step -1 文字数をLen関数で数えます、それをnに代入、 Forのループは、1まで、カウンタはStep-1の指定でループ毎に−1される '計の文字が見つかったかチェックする If Mid(Me![txtINFO], n, 1) = "計" Then Exit For 1文字調べて、計ならExit Forでループを抜けます Next n なんて書いたけど、ハヤイ話、文字列の最後から1文字単位で調べてるだけです。 ループで前から調べないで、後ろから調べる方法もあります。 *たまには、ForやStep-1を使いたかったので(笑)強引に作成 その後の処理は、同じです。 /* * 5.おわりの挨拶 */ 今回は、 ・Instr関数で文字列を探す ・For文Step-1で後ろから探す でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba053.lzh に test053-book.xlsが保存されています。 文字列を探すのにも一苦労してました。 人間様の目で判断する能力って凄いんですよね。。。 プログラムも同じ処理でいろいろな書き方もあるし、楽しいですよね。 えっ、だから迷うんだって? いろいろと迷うのも楽しいんですよ(キットそんな日が来ますよ) 違うシンプルな処理を違う人がやってたら、参考にしたり悔しがったり、 自分はもっと簡単でハヤイルーチン作りを目指したり人それぞれ、 プログラミングで楽しんでると思います。 何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.50 IE起動 CreateObject("InternetExplorer.application")] ( http://www.ken3.org/backno/backno_vba11.html#50 を参照) では、IEの起動方法を書きました。 [No.52 InternetExplorer.application .document.body.innerText] ( http://www.ken3.org/backno/backno_vba11.html#52 を参照) では、.document.body.innerTextでHTMLのテキストデータが取れることを少し解説 時間があったら、あわせてみて下さい。 -------------------- 読者からのお便り紹介 -------------------- In message "Internet Explorer オブジェクト", しょうもさん wrote... >[VBAで楽しくプログラミング No.052 ] 2003/01/26 ><InternetExplorer.application .document.body.innerText> >に関するコメントです。 > >> 目的のテーブル関係のオブジェクトは見つからなかったのですが > >テーブル関係のオブジェクトとは言えませんが、テーブルデータを >取り出すのなら >ITHMLElementCollection コレクション >が役立ちそうです。 > >'--------------------------------------------------------------- > Dim objElement As Object > For Each objElement In objIE.Document.all.tags(tagName:="TD") > Debug.Print objElement.innerText > Next >'--------------------------------------------------------------- > >こんなオブジェクト扱ったの今回が初めてなので、正しい記述なのか >否か分かりませんが・・・。 ---- 参考メール、いつもどうもです。 なんか面白そうなコレクションだなぁ。 次回あたりネタに加工して、偉そうに私発見しましたよ、、と発表しようかなぁ。 *えっ、ここに読者からのアドバイス載せたら、バレバレだって?あっそっか(笑) 過去のメルマガでも気がついたことあったら、みなさん気軽にメール下さい。 また、下記のようにネタにしてよ、、、とリクエストメールも気軽に。 In message "ネタにしてください", 茶坊さん wrote... >ナンバープレイスって知ってます? >9x9のマスの中に数字を埋めていく奴です > >http://www.asahi-net.or.jp/~gi5j-uehr/puzzle/ >とか >フリーソフトもいっぱいありますが・・・ > >ken3エクセルで作れませんか? >解説してください ---- なんか面白そう。 ループの解説と表のデータセット、参照など、 サンプルの例として説明したいネタが詰まっているような気がする。 それを読んだ一流読者からのアドバイスか? *またまた、いつもの深読みのし過ぎ(笑) 一流読者アレルギーの三流作者Ken3でした。

No.54 2003/02/08
AccessからExcel開いて、処理終了後に閉じたい
[ページTOPへ戻る]

<AccessからExcel開いて、処理終了後に閉じたい>

こんにちは、三流プログラマーKen3です。 今回は、 AccessからExcel開いて、処理終了後に閉じたい を軽く書きたいと思います。 へぇ〜、そうなんだぁ程度に、気楽に読んでください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba054.lzh に db054-97.mdb, test054-book.xlsが保存されています。 Access側のdb054-97.mdbから、test054-book.xlsを開いて、閉じてます。 遊んでみてください。 /* * 1.今回のキッカケ */ 掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に下記の書き込みがありました。 In message "[BBS :52] アクセスからエクセル", >BBS に以下の投稿がありました。 > >投稿時間:2003/02/05(Wed) 23:15 > >おなまえ:fox1972 >タイトル:アクセスからエクセル >コメント: > >AccessからExcelの「とある」ブックを立ち上げて、そのブックでは >"Workbook_Open()"を用いてとある処理をさせる。その処理が終われ >ばブックを閉じてAccessに戻る...といった、わがままな処理は出来ますか? ---- わがまま?とは思わないけど、最近過保護が増えたのかなぁ? じゃなくって、ありそうな処理ですよね。 /* * 2.簡単に書いたけど、あれ?関数走らない、、、なぜ? */ Access97側で、ブックを開きます。 その後、ブックを閉じて、Excelも終了させます。 '頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:=strXLSFILE '^^^^ 'AUTO_OPENのモジュールが勝手に走る '終わったら、閉じたいんだけど、、、 oApp.ActiveWorkBook.Close SaveChanges:=False oApp.Quit がポイントです。 Access97側サンプルのボタン Option Compare Database Option Explicit Private Sub btnTEST_Click() Dim strXLSFILE As String 'Excelのファイル名格納場所 Dim oApp As Object 'Excelを操作するオブジェクト変数 Dim strMDBPATH As String Dim strWORK As String Dim i As Integer 'カウンター変数 'Accessの起動位置を取得 CurrentDb.NameにD:\xxxx\yyyy\zzz.mdbが入っている strWORK = CurrentDb.Name '後ろから1文字単位で¥を探す For i = Len(strWORK) To 1 Step -1 If Mid(strWORK, i, 1) = "\" Then Exit For '¥だったら抜ける Next i 'D:\xxxx\yyyy\zzz.mdb --> D:\xxxx\yyyy\ にする strMDBPATH = Mid(strWORK, 1, i) 'Excelの元ファイルの名前を作成 D:\xxxx\yyyy\ + TYPE.xls strXLSFILE = strMDBPATH & "Test054-Book.xls" 'ファイルの存在をチェックする If Dir(strXLSFILE) = "" Then MsgBox strXLSFILE & " を 確認して下さい" Exit Sub '途中で抜ける End If Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property oApp.UserControl = True '頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:=strXLSFILE '^^^^ 'AUTO_OPENのモジュールが勝手に走る '終わったら、閉じたいんだけど、、、 oApp.ActiveWorkBook.Close SaveChanges:=False oApp.Quit End Sub Excel97側では、 Workbook_Openにメッセージボックスと、ユーザー関数を呼んでみました。 *ユーザー関数は、自由に書いてくださいね。 Private Sub Workbook_Open() MsgBox "ブックを開きました" Call PUT_DATA '関数を呼ぶ End Sub Sub PUT_DATA() Sheets("Sheet1").Select Range("B4").Select Range("B4").Value = "XXさん大好き" Dim i As Integer For i = 10 To 126 Range("B4").Font.Size = i Next i For i = 126 To 12 Step -1 Range("B4").Font.Size = i Next i End Sub テスト実行、、、 あれ?PUT_DATAの関数が走らない、、、なぜ? 単体でExcelブックを開くと走るのに、、、う〜ん。。。。 /* * 3.小細工で、RUNメソッドに変更 */ Workbook_Openで走らないので、 Excelのユーザー関数を、.RUNメソッドで呼んでみた。 AUTO_OPEN辞めて、自分で関数呼ぶ Option Compare Database Option Explicit Private Sub btnTEST_Click() Dim strXLSFILE As String 'Excelのファイル名格納場所 Dim oApp As Object 'Excelを操作するオブジェクト変数 Dim strMDBPATH As String Dim strWORK As String Dim i As Integer 'カウンター変数 'Accessの起動位置を取得 CurrentDb.NameにD:\xxxx\yyyy\zzz.mdbが入っている strWORK = CurrentDb.Name '後ろから1文字単位で¥を探す For i = Len(strWORK) To 1 Step -1 If Mid(strWORK, i, 1) = "\" Then Exit For '¥だったら抜ける Next i 'D:\xxxx\yyyy\zzz.mdb --> D:\xxxx\yyyy\ にする strMDBPATH = Mid(strWORK, 1, i) 'Excelの元ファイルの名前を作成 D:\xxxx\yyyy\ + TYPE.xls strXLSFILE = strMDBPATH & "Test054-Book.xls" 'ファイルの存在をチェックする If Dir(strXLSFILE) = "" Then MsgBox strXLSFILE & " を 確認して下さい" Exit Sub '途中で抜ける End If Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property oApp.UserControl = True '頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:=strXLSFILE '^^^^ 'AUTO_OPENのモジュールが勝手に走る '関数を自分で呼ぶ oApp.Run "PUT_DATA" '終わったら、閉じたいんだけど、、、 oApp.ActiveWorkBook.Close SaveChanges:=False oApp.Quit End Sub oApp.Run "PUT_DATA"で関数呼ばれて、Excel側の処理は終了。 終わったら、閉じたいから、 oApp.ActiveWorkBook.Close SaveChanges:=False とブックを強制クローズしてから、 oApp.Quit でExcelアプリをサヨナラする。 逃げ手だけど動いたと思います。。。。。 /* * 4.おわりの挨拶 */ 今回は、AccessからExcelアプリの操作で、 ・.Run "モジュール名"でExcelのユーザー関数実行 ・.ActiveWorkBook.Close SaveChanges:=False でブックを強制的に閉じる ・.Quit でアプリケーションを終了 でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba054.lzh に db054-97.mdb, test054-book.xlsが保存されています。 Access側のdb054-97.mdbから、test054-book.xlsを開いて、 処理後に閉じてます。 遊んでみてください。 何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.7 MDBと同フォルダのExcelファイルを開く] ( http://www.ken3.org/backno/backno_vba02.html#7 を参照) では、MDBと同フォルダのExcelファイルを開きました。 [No.48 AccessからExcelブックを開き、書式設定を行う] ( http://www.ken3.org/backno/backno_vba10.html#48 を参照) では、AccessからExcelブックを開いて、書式の設定を行いました。 時間があったら、あわせてみて下さい。 -------------------- 読者からのお便り紹介 -------------------- In message "ネタにしてください", 茶坊さん wrote... >ナンバープレイスって知ってます? >9x9のマスの中に数字を埋めていく奴です > >http://www.asahi-net.or.jp/~gi5j-uehr/puzzle/ >とか >フリーソフトもいっぱいありますが・・・ > >ken3エクセルで作れませんか? >解説してください ---- ヤバイ、まだ手を付けて無いや、、、 In message "outlookを開いてメールを送ることはできますか?", onikoさん wrote... > IEを開いてHPを見るというのがありましたが、 >OUTLOOKを開いてメールを送るにはどうしたら >よろしいでしょうか? > > 宛先はエクセルのどこかのセルに入れておいても >構いません。 > > マガジンで紹介してください。 >急ぎませんのでよろしくお願いいたします。 ---- 急がないって言われると、変わり者だから急ぎたくなるんだよなぁ、、、 OUTLOOKかぁ、久しぶりにイタズラしてみようかなぁ。。。。


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

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

カスタム検索
三流君(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系バックナンバー目次へ移動]