[トップページ] / [サンプル一覧へ]

2009-05-27 ソースをMDBに保存 と ブログへ登録

今回は、自作関数のソースをHTMLファイルから取得して、
そのソースをプログにアップ、そんな処理に挑戦してみます。
まぁ、いつものようにドタバタしてます。
最新情報と作成履歴は→[更新履歴と最新を表示]

今回のサンプルファイル:[up_blog_0527.zip]←サンプルのMDBとxlsが入ってます。。


バックナンバーのリンクを取り出す。

まず、メールマガジンのバックナンバー リンク情報を取り出します。
セルのB3 に
[http://www.ken3.org/cgi-bin/group/vba_ie_backno.asp]
とバックナンバーのURLをセットします。

.Navigate "URL文字列" で URL表示後、
いつものように、読み込み完了を
.ReadyState が READYSTATE_COMPLETE (4の完了以外)
Or .Busy = True
で、判断します。

次は、リンク情報の取出しです。
Document.Links から リンクの情報を取り出します。
Document.Links.Length で リンクの数がわかるので、
0から始まるループの終わりを Document.Links.Length - 1 で求めています。

次に中身ですが、単純なリンクを書くと、A タグのアンカーテキストとURLです。
HTMLのソースが、
[<a href="http://www.ken3.org/">Ken3 三流君Top</a>]
だったら、
.InnerTEXT で Ken3 三流君Top アンカーテキストを取り出せます。
.href で 、リンク先 http://www.ken3.org/ を取り出せます。

まぁ、ソースと実行結果を見てもらったほうがハヤイかなぁ。
下記、ソースと実行結果です。
'参照設定 Microsoft Internet Controls(Microsoft Browser Helpers)
'Microsoft HTML Object Library の 2つを忘れずに

'参照設定の方法は、 http://www.ken3.org/cgi-bin/group/vba_ie_object.asp をみてください。

Sub URLを取得する()
    'B3に格納されている、目的のURLを表示して、リンク情報を書き出す。

    Dim objIE     As InternetExplorer
    Dim strURL    As String
    Dim i         As Integer
    Dim nYLINE As Integer

    'データエリアを削除する。
    Rows("10:9999").Delete Shift:=xlUp

    'IEのオブジェクトを作成する
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    
    'ページを開く(.Navigateで表示する。)
    strURL = Range("B3")      'URL代入
    objIE.Navigate "" & strURL    'アドレスを渡し表示する
    
    '読み込み完了となるまで、ループする。
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy
        DoEvents
    Wend
    
    Debug.Print objIE.Document.Title
    Debug.Print objIE.Document.URL

    'リンクを探す
    'リンク数分まわす A列にアンカーテキスト B列にURLを書く
    nYLINE = 10  '10行目からせっとするので
    For i = 0 To objIE.Document.Links.Length - 1
        Cells(nYLINE, "A") = "'" & objIE.Document.Links(i).innerText 'テキスト
        Cells(nYLINE, "B") = "'" & objIE.Document.Links(i).href      'URL
        nYLINE = nYLINE + 1 'セット位置を+1する
    Next i
    
    objIE.Quit   'IEを閉じる

End Sub
テストの動作結果:IE操作 Document.Links から リンクの情報を取り出します

※ソースコードと実行結果を合わせてみてくださいね。

B列のURLを開き、TDタグとPREタグを判断して、MDB へ 登録する

取り出す ファイルの一覧ができたら、1つ1つURLを開き、ソースを取り出し、MDBへ保存します。
ポイントは、読み込み後、 Set objTD = objIE.Document.all.tags("TD") 'TDのタグを抜く。(集める) で、TDの集合を作ります。
すると、配列的に使えるので、
For n = 0 To objTD.Length - 1 で ループを作り、
If Left(objTD(n).innerHTML, 5) = "<PRE>" Then 'TDの内側が PREで始まっているか?
チェックします。
PREだったら、
objTD(n).innerHTML が HTMLなので、
strHTML = strHTML & "<h3>'" & Format(x, "000") & "番目のソースコード</h3><HR>" & vbCrLf
strHTML = strHTML & objTD(n).innerHTML & "<HR>" & vbCrLf
でセット、同様に、objTD(n).innerText が タグ無しのテキストなので、
strTEXT = strTEXT & Format(x, "000") & "番目のソースコード" & vbCrLf
strTEXT = strTEXT & vbCrLf & objTD(n).innerText & vbCrLf & vbCrLf
としました。

データの流れ、データ遷移図、イメージ図

↑なんか、よけい、わからないか・・・
下記のソースと実行結果を見てください。
'参照設定 Microsoft Internet Controls(Microsoft Browser Helpers)
'Microsoft HTML Object Library の 2つを忘れずに

'参照設定の方法は、 http://www.ken3.org/cgi-bin/group/vba_ie_object.asp をみてください。

Sub DB_UPDATE()  'MDBへソースを登録する。
    'B列のURLを開き、ソースを取得して(TDとPREのタグを見て)
    'MDBファイルへ書き込む。

    'IEのオブジェクトを作成する
    Dim objIE As InternetExplorer
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    objIE.GoHome

    Dim strTITLE As String
    Dim DB   As DAO.Database   'DAOです。
    Dim TB   As DAO.Recordset  'DAOです。
    Dim nCNT As Integer
    Dim strSQL As String
    Dim objTD As Object
    Dim n As Integer
    Dim x As Integer
    Dim strHTML As String
    Dim strTEXT As String
    
    'DBを開く ここでは、DAOを使用しました。
    Set DB = OpenDatabase(ThisWorkbook.Path & "\VBACODE.mdb")

    For nYLINE = 10 To 9999  '10行目からループ。
        strTITLE = Left(Trim(Cells(nYLINE, "A")), 80)
        If Len(strTITLE) = 0 Then Exit For  'A列のタイトルが無くなったら抜ける。
        DoEvents
        
        'SQLを作成する
        strSQL = "Select * From T_CODE Where [タイトル]='" & Replace(strTITLE, "'", "''") & "'"
        Set TB = DB.OpenRecordset(strSQL)
        
        nCNT = TB.RecordCount
        If nCNT = 0 Then  'データ無し 0の時 URLを表示してチェックする追加する
            'URLを表示する
            objIE.Navigate Cells(nYLINE, "B")
            While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy
                DoEvents
            Wend
    
            '手抜きで待つ(オブジェクトの展開時間を待つ)動画を見やすくするため。普通はいらない
            Application.Wait Time:=Now + TimeValue("00:00:03")  '3秒間 ボーっとする
            
            'DBに書き込む
            TB.AddNew
    
            'IEページデータを取り込む
            TB![Title] = objIE.Document.Title  '読み込んだページのタイトルをセットする。
            Set objTD = objIE.Document.all.tags("TD")  'TDのタグを抜く。(集める)
            
            strHTML = ""  '初期化する
            x = 0   'ソースコードのカウンター(html内に複数のソースコードがあるので、)
            For n = 0 To objTD.Length - 1  '集めたTDタグを全て見たいので頭からまわす。
                If Left(objTD(n).innerHTML, 5) = "<PRE>" Then 'TDの内側が PREで始まっているか?
                    x = x + 1
                    strHTML = strHTML & "<h3>'" & Format(x, "000") & "番目のソースコード</h3><HR>" & vbCrLf
                    strHTML = strHTML & objTD(n).innerHTML & "<HR>" & vbCrLf
                    
                    strTEXT = strTEXT & Format(x, "000") & "番目のソースコード" & vbCrLf
                    strTEXT = strTEXT & vbCrLf & objTD(n).innerText & vbCrLf & vbCrLf
                    
                End If
            Next n
            If strHTML = "" Then
                strHTML = "ソースがみつからない"
                strTEXT = "ソースがみつからない"
            End If
            TB![HTMLCODE] = strHTML  'データのセット HTMLテキストをメモ型へ
            TB![TEXTCODE] = strTEXT

            TB![URL] = Trim(Cells(nYLINE, "B"))
            TB![タイトル] = strTITLE
            TB![区分] = Range("H3")
            
            TB.Update   '忘れずに更新する。
            Cells(nYLINE, "E") = "追加したよ"
            Cells(nYLINE, "E").Select
        Else
            '
            Cells(nYLINE, "F") = "既にDBに存在したよ"
        End If
        TB.Close
        
        '手抜きで待つ 動画撮影用、普通は要らないよ。。。
        Application.Wait Time:=Now + TimeValue("00:00:03")  '3秒間 ボーっとする

    Next

    '後始末
    DB.Close

    Cells(10, "A").Select
    objIE.Quit   'IEを閉じる

End Sub
テストの動作結果:IE操作 B列のURLを開き、TDタグとPREタグを判断して、MDB へ 登録する

※ソースコードと実行結果を合わせてみてくださいね。

Access の フォームから ブログの入力フォーム(Webページ)へ転記する

処理の流れ的には
0.新規にIEのオブジェクトを作る。
1.登録用のページを表示後、
2.タイトルをセット
3.編集をHTMLモードにする、
4.本文をセット
5.保存ボタンを押す
6.使ったIEを閉じる(.Quitする)
そんな感じで、作ってみました。※ソースコードと実行結果を合わせてみてください。

0.新規にIEのオブジェクトを作る。
Set objIE = CreateObject("InternetExplorer.application")
で作り、
objIE.Visible = True
で見えるようにして、

1.登録用のページを表示
objIE.Navigate "https://app.blog.ocn.ne.jp/t/app/weblog/post?blog_id=ブログの番号"
ブログの投稿ページを表示(ログイン状態保持で呼びました ログイン後にプログラム実行)
※本当の全自動なら、ログイン処理も必要だけど、今回は連続投稿のみでご勘弁を。

2.タイトルをセット
objIE.Document.all("title").Value = "テスト後 消す : " & Me.TITLE.Value
素直に、ドキュメント全体(Document.all)に"title"に対して、値をセットしました。
(名前・IDを使用して、オブジェクトに値をセット)

3.編集をHTMLモードにする、
HTMLのアンカーリンクに名前が付いていたので、
objIE.Document.all("button-edit-html").Click 'モードをHTMLにしたいので
と、"button-edit-html"を.Clickで押してみました。

4.本文をセット
'まぎらわしいけど、テキストエリアの名前がtextのオブジェクトにデータをセットする
objIE.Document.all("text").Value = テキスト値 で セットしてみました。
※名前がたまたま"text"なだけです。注意してください。

5.保存ボタンを押す
Submitのボタンが、確認と保存の2つあるので、Forms(番号 or "名前・ID").Submit が効かないので、
保存のボタンを探し、.Clickで押してみました。
Set objINPUT = objIE.Document.all.tags("INPUT") 'INPUTのタグを抜く、allから集める
For n = 0 To objINPUT.length - 1 '抜いた数ループする。
If objINPUT(n).Value = "保存" Then '保存のボタンを Valueで判断する。
objINPUT(n).Click '見つけたので、クリックする
こんな感じで、INPUTのタグから、保存の値を探し、押してみました。

6.使ったIEを閉じる(.Quitする)
'登録用に開いたobjIEを閉じる。
objIE.Quit
'Set objIE = Nothing '← 開放しないでメモリリークをテストする(ぉぃぉぃ)
'↑連続実行するとエラーになる・・・なんとかしないと。。。

そして、レコードがなくなるまで、0〜6の手順を手抜きで繰り返すと、
If Me.NewRecord = True Then '新しいレコードか?データなくなったか?
で、フォームの登録データが無くなるまでループさせたけど、
実行時エラー '462' : リモートサーバーが無いか、使用できる状態ではありません。

※連続実行すると、上記エラーになってしまったり。。。う〜ん、調整が必要ですね。
下記のソース、バグ付きなので、参考程度に。。。

'参照設定 Microsoft Internet Controls(Microsoft Browser Helpers)
'Microsoft HTML Object Library の 2つを忘れずに

'参照設定の方法は、 http://www.ken3.org/cgi-bin/group/vba_ie_object.asp をみてください。


Option Compare Database
Option Explicit

Private Sub コマンド10_Click() 'OCNのブログに登録するテスト

    Dim objIE As InternetExplorer
    Dim time10 As Date

    'IEのオブジェクトを作成する
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    'objIE.GoHome

    'URLを表示する OCNブログの場合、↓自分のBlog_idにしてね。
    objIE.Navigate "https://app.blog.ocn.ne.jp/t/app/weblog/post?blog_id=ブログの番号"
    DoEvents

    '表示を待つ
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy
        DoEvents
    Wend
    
    time10 = DateAdd("s", 5, Now) '動画用に5秒待ち
    While Now < time10
        DoEvents
    Wend

    'タイトルをセット
    objIE.Document.all("title").Value = "テスト後 消す : " & Me.TITLE.Value
    time10 = DateAdd("s", 2, Now) '動画用に2秒待ち
    While Now < time10
        DoEvents
    Wend

    
    'HTMLをクリック
    objIE.Document.all("button-edit-html").Click  'モードをHTMLにしたいので、
    DoEvents
    
    '表示を待つ モードの切り替わりを待つ
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy
        DoEvents
    Wend

    time10 = DateAdd("s", 5, Now) '動画用に5秒待ち
    While Now < time10
        DoEvents
    Wend

    '文章をセットする。
    Dim strHTML As String
    Dim n As Integer
    
    'セットする文章を作る。
    strHTML = "テスト スグに消す。"
    strHTML = strHTML & "↓解説と詳細は↓メルマガ全体を読む↓<br>" & vbCrLf
    strHTML = strHTML & "<a Href='" & Me.URL & "'>" & vbCrLf
    strHTML = strHTML & Me.TITLE.Value & "<br>" & vbCrLf
    strHTML = strHTML & Me.URL & "</a><br>" & vbCrLf
    strHTML = strHTML & "↑を見てください。<br>" & vbCrLf
    strHTML = strHTML & "<HR>" & vbCrLf

    'まぎらわしいけど、テキストエリアの名前がtextのオブジェクトにデータをセットする
    objIE.Document.all("text").Value = strHTML & vbCrLf & Me.HTMLCODE & vbCrLf & "<HR>" & strHTML

    time10 = DateAdd("s", 3, Now) '動画用に3秒待ち
    While Now < time10
        DoEvents
    Wend

    'データがセットできたので、保存のボタンを押す
    '<input type="submit" value="保存"
    Dim objINPUT As Object
    
    Set objINPUT = objIE.Document.all.tags("INPUT") 'INPUTのタグを抜く、allから集める。
    For n = 0 To objINPUT.length - 1  '抜いた数ループする。
        If objINPUT(n).Value = "保存" Then  '保存のボタンを Valueで判断する。
            objINPUT(n).Click   '見つけたので、クリックする
            DoEvents
            Exit For
        End If
    Next n
    
    time10 = DateAdd("s", 5, Now) '動画用に5秒待ち
    While Now < time10
        DoEvents
    Wend
    
    '登録画面の切り替わりを待つ
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy
        DoEvents
    Wend
    
    time10 = DateAdd("s", 5, Now) '動画用に5秒待ち
    While Now < time10
        DoEvents
    Wend
    
    '次が トラックバック の更新通知のPingの送信待ち
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy
        DoEvents
    Wend
    
    time10 = DateAdd("s", 5, Now) '動画用に5秒待ち
    While Now < time10
        DoEvents
    Wend

    '登録用に開いたobjIEを閉じる。
    objIE.Quit
    'Set objIE = Nothing   '← 開放しないでメモリリークをテストする(ぉぃぉぃ)
    '↑連続実行するとエラーになる・・・なんとかしないと。。。

    '次のレコードに移動する。
    DoCmd.GoToRecord , , acNext

    time10 = DateAdd("s", 5, Now) '動画用に5秒待ち
    While Now < time10
        DoEvents
    Wend

End Sub


Private Sub コマンド12_Click() '連続登録のテスト。
    Dim n As Integer
    
    For n = 1 To 100   '私の環境だと45〜60の連続実行でエラーが発生します。
        Call コマンド10_Click  '単独登録を呼ぶ
        If Me.NewRecord = True Then  '新しいレコードか?データなくなったか?
            Exit For
        End If
        
    Next
    
    MsgBox "終了しました。"

End Sub

テストの動作結果:IE操作 Access の フォームから ブログの入力フォーム(Webページ)へ転記する

※ソースコードと実行結果を合わせてみてくださいね。

連続実行でエラー

連続実行のエラーとメモリリークっぽい感じを修正しないとなぁ。

実行時エラー '462' : リモートサーバーが無いか、使用できる状態ではありません。


終わりの挨拶

バグも出てるし、修正しないとなぁ・・・・
今回のサンプルファイル:[up_blog_0527.zip]←サンプルのMDBとxlsが入ってます。。

最新情報と作成履歴は→[更新履歴と最新を表示]


ページフッター リンクや広告、質問送信など

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

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

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



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

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

IE関係、VBA関係 の 三流君のホームページの紹介・案内

[IE操作 三流解説のトップページへ 戻る] / [IE操作の三流サンプル一覧へ 戻る]

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

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

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

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]



[トップページへ 戻る] / [サンプル一覧へ 戻る]