グラサン「久々にエクセルVBAを使った勉強でもしてみようか」

 

もぐもぐ「技術系のエントリーは久々ですね~」

 

グラサン「タイトルにもある通り、VBAを使ってインターネットの操作やってみるぞ」

 

GitHubに格納した対象ファイル

 

グラサン「今回作ったファイルは、上記に格納してある。ブラウザ操作テストver1.0.xlsmのリンクをクリックしたあと、右下に表示されるダウンロードボタンをクリックするんだな」

 

 

ニコ「ダウンロードしましたよ。」

 

 

グラサン「では、エクセルを開いてみようか。こんな感じのシートが表示されるはずだ」

 

 

ニコ「ふむ…なんですか、これは。」

 

グラサン5ちゃんのページの、該当カテゴリー板における、スレタイのページを検索する機能だ。」

 

ニコ「5ちゃんって…確か、2ちゃんが廃止されて、5ちゃんになったとかいうやつですね。」

 

グラサン「掲示板ホスト、スレ一覧ページ、検索対象スレタイトル(部分一致)、というのがあるだろうはてなマーク

 

もぐもぐ「なんか、ありますね。前者2つがURLで、スレタイが日本語ですね。」

 

グラサン「掲示板ホストURLは、スレ一覧URLからでも導出出来るから、別になくてもよかったんだが…まぁいい。今回貼り付けたスレ一覧のURLは、資格カテゴリーのスレ一覧だ。別にどこでも機能するんだが、あくまでサンプルとしてな。」

 

 

グラサン「で、検索スレタイトル(部分一致)のセルに入れた値に基づいて、その名称を含むタイトルのスレを見つけてページを表示させるのが、今回作ったVBAの機能だな。とりあえず、今回は初級編ということで、簡単な作りになっているが。」

 

ニコ「言葉の説明じゃよくわからないんで、実行して教えてもらえませんかはてなマークはてなマーク

 

グラサン「ぐぬぬ…例えば、以下のような指定で検索実行ボタンを押下したとしよう。」

 

 

もぐもぐ「ハゲってwwwww」

 

グラサン「すると、スレタイにハゲが入っていて、かつ、1000レスに至っていないスレのページが表示されるわけだ」

 

 

ニコ「草」

 

グラサン「別に、資格カテゴリーのページじゃなくても、他のカテゴリーでも上手くいくぞ。例えば、漫画カテゴリーのページのURLを使うとしようか」

 

 

 

ニコ「これ、一々、掲示板ホストも変えるの面倒ですね…」

 

グラサン「これは失敗だったな…修正してもいいが、面倒だから次回に回すとしよう。」

 

ニコ「とりあえず、これで実行してみると…」

 

 

ニコ「ちゃんと出ますね。」

 

グラサン「じゃあ、簡単に中身を見てみようか。まずは、エクセルのマクロの設定を見てくれ。」

 

 

グラサン「参照設定で上記の2機能を追加するんだ。InternetExplolerを使うから、そのためのオブジェクト参照に必要なものだな。」

 

ニコ「参照設定ってなんですかーはてなマークはてなマークあと、マクロの設定ってどうやるんですかーはてなマークはてなマーク

 

グラサン「ググれ!!!!!!!!むかっむかっむかっ一々全部説明してられるか!!むかっ

 

ニコ「ぐぬぬ…」

 

グラサン「で、マクロのコードについては以下になるな。」

 

 

Option Explicit

Public Sub KeijibanWrite()
    'IEのブラウザを開く
    Dim objIE As InternetExplorer
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    
    'エクセルのセルから設定値取得
    Dim hostUrl As String
    Dim mainBoardUrl As String
    Dim searchTitle As String
    
    hostUrl = Cells(2, 2).Value
    mainBoardUrl = Cells(3, 2).Value
    searchTitle = Cells(4, 2).Value
    
    '該当の掲示板のスレ一覧ページを開く
    objIE.navigate mainBoardUrl
    Call IEWait(objIE)   'IEを待機
    Call WaitFor(3) '3秒停止
    
    'ページソース内検索用の変数
    Dim objtag, objsubmit As Object
    Dim tarStr As String
    '取得文字列内検索用の変数
    Dim RE As Object
    Dim Match As Object
    Dim strPattern As String
    Dim strTmp As String
    Dim baseUrl As String
    Dim moveboardUrl As String
    Set RE = CreateObject("VBScript.RegExp")
    '最短一致で確認
    strPattern = "href="".+?"""
    RE.Pattern = strPattern
    RE.IgnoreCase = True
    
    baseUrl = ""
    
    
    'BASEのURLが設定されていないか確認する→設定されていれば相対パスと組み合わせて利用
    For Each objtag In objIE.document.getElementsByTagName("base")
        tarStr = objtag.outerHTML
        
        If InStr(tarStr, "target=""body""") > 0 Or InStr(tarStr, "target=""_self""") > 0 Then
            Set Match = RE.Execute(tarStr)
            'href=""の文字列以外を取得
            strTmp = Match(0).Value
            Debug.Print ("1:" & strTmp)
            strTmp = Mid(strTmp, 7, InStrRev(strTmp, """") - InStr(strTmp, """") - 1)
            Debug.Print ("2:" & strTmp)
            baseUrl = hostUrl & strTmp
            Exit For
        End If
    Next
    
    For Each objtag In objIE.document.getElementsByTagName("a")
        tarStr = objtag.outerHTML
        '指定したスレタイトルの文字列があり、1000コメントに達していないもの
        If InStr(tarStr, searchTitle) > 0 And InStr(tarStr, "(1000)") = 0 Then
            Set Match = RE.Execute(tarStr)
            'href=""の文字列以外を取得
            strTmp = Match(0).Value
            Debug.Print ("3:" & strTmp)
            strTmp = Mid(strTmp, 7, InStrRev(strTmp, """") - InStr(strTmp, """") - 1)
            Debug.Print ("4:" & strTmp)
            If baseUrl = "" Then
                moveboardUrl = strTmp
            Else
                moveboardUrl = baseUrl & strTmp
            End If
            
            Exit For
        End If
    Next
    
    '該当の掲示板の該当のスレを開く
    objIE.navigate moveboardUrl
    Call IEWait(objIE)   'IEを待機
    Call WaitFor(3) '3秒停止
    
End Sub

'IEを待機する関数
Private Function IEWait(ByRef objIE As Object)
    Do While objIE.Busy = True Or objIE.readyState <> 4
        DoEvents
    Loop
End Function

'指定した秒だけ停止
Private Function WaitFor(ByVal second As Integer)
    Dim futureTime As Date
 
    futureTime = DateAdd("s", second, Now)
 
    While Now < futureTime
        DoEvents
    Wend
End Function

 

ニコ「割と短いですね…」

 

グラサン「コメントでちょくちょく出てくるhref=""とかいうのは、ハイパーリンクのURLのことだな。掲示板のページソースを見て、href=""が含まれる文字列を探しているということだ。そこから、該当のURLを抜き出して、そのページにアクセスしているわけだな。」

 

ニコ「とはいえ、今回のはショボイプログラムだと思いますが…今後どうするつもりですかはてなマークはてなマーク

 

グラサン「目標としては、該当のスレッドに行って、こっちで指定したコメントを、指定したタイミングで書き込ませるようなマクロを組むところまでかな。」

 

ニコ「あ~…それって、botってやつじゃないですか…VBAってスケジューリング実行出来たんでしたっけはてなマークはてなマーク

 

グラサン「…ブログ主の記憶の限りでは、VBAじゃなく、VBSなら定期実行出来たはずだ。まぁそのへんも含め、追々確認するとしよう。」

 

 

・:,。゚・:,。★゚・:,。゚・:,。☆゚・:,。゚・:,。★゚・:,。゚・:,。☆゚・:,。゚・:,。★゚・:,。゚・:,。☆゚・:,。゚・:,。★゚・

ニコ「ちょっとでも、クスっときたら、下のボタンどちらかポチポチ音譜してください。」
にほんブログ村 政治ブログ 政治・社会問題へにほんブログ村 経済ブログ 実体経済へ
*☆*:;;;:*☆*:;;;:*☆*:;;;:*☆*:;;;:*☆*:;;;:*☆*:;;;:*☆*:;;;:*☆*:;;;:*☆*:;;;:*

コメント(3)