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.all(0).innerHTML '変数に代入
MsgBox strHTML 'テスト表示
Debug.Print strHTML 'イミディエイトにも表示
End Sub
Sub ken3_url()
Dim objIE As InternetExplorer
Dim time10 As Date
Dim strURL As String
Dim i As Integer
On Error GoTo EMSG
Rows("13:1000").Select '結果の表示エリアをクリアする
Selection.Delete Shift:=xlUp
Set objIE = CreateObject("InternetExplorer.application")
objIE.GoHome
objIE.Visible = True
Do While objIE.Busy = True '起動まで待つ
DoEvents
Loop
nYLINE = 10 '10行目からチェックスタート
Cells(nYLINE, 1).Select
DoEvents
Cells(nYLINE, 2) = Now() 'テストで時間を代入
strURL = Trim(Cells(nYLINE, 1)) 'URL代入
objIE.Stop '読み込み停止(意味無いけど)
objIE.Navigate "" & strURL 'アドレスを渡し表示する
'読みこみ完了まで待つ
'20秒後を計算して、待つ
time10 = DateAdd("s", 20, Now())
Do While objIE.Busy = True
DoEvents
If time10 < Now() Then
Exit Do
End If
DoEvents
Loop
If objIE.Busy = True Then
Cells(nYLINE, 4) = "読み込みに失敗しました"
MsgBox "読み込みに失敗しました"
End If
'リンクを探す
nYLINE = 13 'セット位置を代入
'リンク数分まわす
For i = 0 To objIE.Document.links.Length - 1
Cells(nYLINE,"A") = "'" & objIE.Document.links(i).outerText
Cells(nYLINE,"B") = "'" & objIE.Document.links(i).href
Cells(nYLINE,"C") = "'" & objIE.Document.links(i).outerHTML
nYLINE = nYLINE + 1 'セット位置を+1する
Next i
objIE.Quit 'IEを閉じる
MsgBox "終了しました"
Exit Sub
EMSG:
Cells(nYLINE, 2) = "ERR"
objIE.Quit '
MsgBox "errが発生しました"
Exit Sub
End Sub
ポイントは、
~~~~~~~~~~~~
objIE.Document.links.Length
でリンクの数を取得できるので、
'リンク数分まわす
For i = 0 To objIE.Document.links.Length - 1
Cells(nYLINE,"A") = "'" & objIE.Document.links(i).outerText
Cells(nYLINE,"B") = "'" & objIE.Document.links(i).href
Cells(nYLINE,"C") = "'" & objIE.Document.links(i).outerHTML
nYLINE = nYLINE + 1 'セット位置を+1する
Next i
で、
objIE.Document.links(i).outerText
objIE.Document.links(i).href
objIE.Document.links(i).outerHTML
をそれぞれセットしてみました。
使えそうなプロパティあったかなぁ?
Sub test()
Dim strMOTO As String
Dim strWork As String
Dim 基準日 As Date
strMOTO = "20000804"
strWork = Mid(strMOTO, 1, 4) & "/" & Mid(strMOTO, 5, 2) & "/" & Mid(strMOTO, 7, 2)
基準日 = CDate(strWork)
MsgBox 基準日
End Sub
こんにちは、三流プログラマーKen3です。
今回は、
オブジェクトやコレクションのループは、
いつものカウンタ添字じゃなく、
For Each In でループさせるです。
/*
* 1.今回のキッカケ
*/
In message "リンク クリック",
しょうもさん wrote...
>[ VBAで楽しくプログラミング No.071 ] 2003/05/06 火曜日 より
>
>> 読者からの要望は、広告自動クリックソフトだったけど
>
>その名の通り、Clickメソッドが使えますよ。
>今回も、IHTMLElementオブジェクトを操っています。
>「Microsoft HTML Object Library」参照設定です。
>
>'-----------
> Dim objElement As IHTMLElement
> Dim strTempText As String
>
> For Each objElement In objIE.Document.all.tags(tagName:="a")
> strTempText = objElement.getAttribute _
> (strAttributeName:="href")
> Debug.Print strTempText
> If InStr(strTempText, "top10") Then
> objElement.Click
> Exit For
> End If
> Next
>'-----------
---
と、サンプルプログラムを読者より送ってもらった。
ありがたいなぁ。
人によってプログラムって書き方いろいろなんだけど、
私の悪いクセで、
For Each XXXX In XXXXX
のループを避ける傾向がある。。。
今回は、これについて、少々自分にお灸をすえる意味で発行します。
※一部の読者に人気かあるIE使った不正なクリック処理は、
また今度ね。興味あるひとは直接メールで送ってね(爆)
/*
* 2.いろいろあるけど、自分にあった方法で、できればOKかなぁ。
*/
ループ処理って、よく聞くのが、
1〜10までのループ
For n=1 To 10
Call 処理(BOX(n))
Next n
なんて感じですよね。
これは、カウンタ変数nを使用して配列の変数を使う場合、
よくみかけるパターンですよね、配列のn番目を参照するって感じで。
オブジェクトやコレクションも配列になっているので、
オブジェクトのn番目を参照して、処理を行うって書き方ができます。
ちょっと前に作った、リンクを書き出す処理
[No.71 IE操作 リンク先を取出す .Document.links(i).href]
http://www.ken3.org/backno/backno_vba15.html#71
では、
'リンク数分まわす
For i = 1 To objIE.Document.links.Length
Cells(nYLINE, "A") = "'" & objIE.Document.links(i).outerText
Cells(nYLINE, "B") = "'" & objIE.Document.links(i).href
Cells(nYLINE, "C") = "'" & objIE.Document.links(i).outerHTML
nYLINE = nYLINE + 1 'セット位置を+1する
Next i
と、
カウンタ変数iを1からobjIE.Document.links.Lengthの数回してました。
チョット、イメージ沸きにくいなぁ。
えっと、シートの名前を全て表示するには、
まずは、シートの数が必要、、
Debug.Print ActiveWorkbook.Sheets.Count
と、アクティブなブックのシートのカウントは?とプロパティを参照。
で、私のいつものパターンだと、
Sub Ken3_TAKO()
Dim n As Integer カウンター変数のnを定義、
For n = 1 To ActiveWorkbook.Sheets.Count
Debug.Print n & "番目のシート名は" & ActiveWorkbook.Sheets(n).Name
Next n
End Sub
Sub CHK_1000(Target As Range)
Target.Interior.ColorIndex = 0 'エリアの背景をクリア
Dim n As Integer
For n = 1 To Target.Count 'ターゲットのカウント分ループ
If Target.Cells(n) < 1000 Then 'n番目の値のチェック
Target.Cells(n).Interior.ColorIndex = 6 'n番目のセルを黄色にする
End If
Next n
End Sub
Sub CHK_1000(Target As Range)
Target.Interior.ColorIndex = 0 'エリアの背景をクリア
Dim objRANGE As Range
For Each objRANGE In Target 'オブジェクトを取り出しながらループ
If objRANGE.Value < 1000 Then '取り出したオブジェクトの値をチェック
objRANGE.Interior.ColorIndex = 6 'セルを黄色にする
End If
Next
End Sub