「久々にエクセルVBAを使った勉強でもしてみようか」
「技術系のエントリーは久々ですね~」
「タイトルにもある通り、VBAを使ってインターネットの操作をやってみるぞ」
「今回作ったファイルは、上記に格納してある。ブラウザ操作テストver1.0.xlsmのリンクをクリックしたあと、右下に表示されるダウンロードボタンをクリックするんだな」
「ダウンロードしましたよ。」
「では、エクセルを開いてみようか。こんな感じのシートが表示されるはずだ」
「ふむ…なんですか、これは。」
「5ちゃんのページの、該当カテゴリー板における、スレタイのページを検索する機能だ。」
「5ちゃんって…確か、2ちゃんが廃止されて、5ちゃんになったとかいうやつですね。」
「掲示板ホスト、スレ一覧ページ、検索対象スレタイトル(部分一致)、というのがあるだろう
」
「なんか、ありますね。前者2つがURLで、スレタイが日本語ですね。」
「掲示板ホストURLは、スレ一覧URLからでも導出出来るから、別になくてもよかったんだが…まぁいい。今回貼り付けたスレ一覧のURLは、資格カテゴリーのスレ一覧だ。別にどこでも機能するんだが、あくまでサンプルとしてな。」
「で、検索スレタイトル(部分一致)のセルに入れた値に基づいて、その名称を含むタイトルのスレを見つけてページを表示させるのが、今回作ったVBAの機能だな。とりあえず、今回は初級編ということで、簡単な作りになっているが。」
「言葉の説明じゃよくわからないんで、実行して教えてもらえませんか
」
「ぐぬぬ…例えば、以下のような指定で検索実行ボタンを押下したとしよう。」
「ハゲってwwwww」
「すると、スレタイにハゲが入っていて、かつ、1000レスに至っていないスレのページが表示されるわけだ」
「草」
「別に、資格カテゴリーのページじゃなくても、他のカテゴリーでも上手くいくぞ。例えば、漫画カテゴリーのページのURLを使うとしようか」
「これ、一々、掲示板ホストも変えるの面倒ですね…」
「これは失敗だったな…修正してもいいが、面倒だから次回に回すとしよう。」
「とりあえず、これで実行してみると…」
「ちゃんと出ますね。」
「じゃあ、簡単に中身を見てみようか。まずは、エクセルのマクロの設定を見てくれ。」
「参照設定で上記の2機能を追加するんだ。InternetExplolerを使うから、そのためのオブジェクト参照に必要なものだな。」
「参照設定ってなんですかー
あと、マクロの設定ってどうやるんですかー
」
「ググれ
一々全部説明してられるか
」
「ぐぬぬ…」
「で、マクロのコードについては以下になるな。」
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
Re:Re:無題
人にやらせる、笑
指示できればいいんだよ、笑
ブル二郎
2018-07-21 17:25:39
返信する