« ロトの当せんデータを自動取得する(4) | トップページ | ロトの当せんデータを自動取得する(6) »

ロトの当せんデータを自動取得する(5)

今回は、実際にロト6の月別当せんデータのページからデータを取得して格納する処理です。

この処理では、取得したデータは文字列として保存しています。
ボーナス数字の手前はスペース区切りで、その他はカンマ区切りになっています。
最終的に当せんデータをファイル保存したときにエクセルで見れるようなフォーマットです。

n回(5文字),数字1,数字2,数字3,数字4,数字5,数字6 ボーナス数字

00001,02,08,10,13,27,30 39
00002,01,09,16,20,21,43 05
00003,01,05,15,31,36,38 13
00004,16,18,26,27,34,40 13
00005,09,15,21,23,27,28 43

また、当せんデータの取得のために構造体を作成してワークエリアとして使用しています。

' 当せんデータ用の構造体
Structure LOTODATA
    Dim CountTime As Integer            ' n回
    Dim Data() As Byte                  ' 当せん数字
    Public Sub Initialize()
        CountTime = 0
        ReDim Data(6)                   ' ボーナス数字を含む最大7データ
    End Sub
End Structure

' 過去のデータは最大50回分のデータがまとまっているので、余裕分も含めて51データ分を確保
Public NumWork(50) As LOTODATA

取得したデータの文字列(当せんデータ)はグローバルな pstLoto6Tmp に格納します。
piLoto6Cnt はデータを取得する毎インクリメントされるカウンタです。起動時に0クリアしておきます。

Public pstLoto6Tmp() As String          ' ロト6当せんデータ文字列
Public piLoto6Cnt As Integer            ' ロト6当せんデータ総数

さて、ここからが実際に当せん番号のデータを取得する処理です。
説明を書こうと思ったのですが、かなり強引に処理をしているために細かい説明がうまく書けません。
何をしているかというと、タグとキーワード文字列を探してから当せんデータの文字列を抜き取ります。
そのあとに数値変換して格納する。これの連続です。

'
' 【ロト6月別当せん番号取得処理】
'
' stFile --> ページ名
'
Public Function GetLoto6Number(ByVal stFile As String) As Integer

    Dim i, j, k, nCnt As Integer
    Dim iPos, iP1, iP2, iP3, iP4, iP5 As Integer
    Dim stHtml, stTxt, stTmp As String
    Dim bStart As Boolean
    Dim stBuf As String

    On Error GoTo ErrorHandler

    stHtml = vbNullString

    ' ここでstHtmlにHTTPまたは保存ファイルからページのデータを読み込んでおく

    j = 0

    iPos = InStr(1, stHtml, "回別", CompareMethod.Text)
    If iPos = 0 Then Return 0

    bStart = False
    iPos = InStr(iPos, stHtml, "<TD", CompareMethod.Text)
    Do While (iPos > 0)
        System.Windows.Forms.Application.DoEvents()

        iP1 = InStr(iPos, stHtml, "/TD>", CompareMethod.Text)
        If iP1 > 0 Then
            stTxt = Mid(stHtml, iPos, iP1 - iPos)
            iP2 = InStr(2, stTxt, ">", CompareMethod.Text)
            iP3 = InStr(2, stTxt, "(", CompareMethod.Text)
            If iP2 > 0 Or iP3 > 0 Then
                stTmp = Mid(stTxt, iP2 + 1, Len(stTxt) - iP2)
                If bStart = False Then
                    ' ---------------------------------------------------------
                    ' n回のデータを取得する処理
                    ' ---------------------------------------------------------
                    iP2 = InStr(1, stTmp, "第")
                    iP3 = InStr(1, stTmp, "回")
                    If iP2 > 0 And iP3 > 0 And InStr(1, stTmp, "~") = 0 Then
                        stTmp = Mid(stTmp, iP2 + 1, iP3 - iP2 - 1)
                        NumWork(j).CountTime = CInt(stTmp)
                        nCnt = 0
                        bStart = True
                    End If
                Else
                    ' ---------------------------------------------------------
                    ' 当せんデータ(ボーナス数字含む)を取得する処理
                    ' ---------------------------------------------------------
                    iP2 = InStr(1, stTmp, "年")
                    iP3 = InStr(1, stTmp, "販売")
                    If iP2 = 0 And iP3 = 0 Then
                        iP2 = InStr(1, stTmp, ".")
                        iP3 = InStr(1, stTmp, ".")
                        iP4 = InStr(1, stTmp, "口")
                        iP5 = InStr(1, stTmp, "該当なし")
                        If iP2 = 0 And iP3 = 0 And iP4 = 0 And iP5 = 0 Then
                            iP2 = InStr(1, stTmp, "(")
                            iP3 = InStr(1, stTmp, ")")
                            If iP2 > 0 And iP3 > 0 Then
                                stTmp = Mid(stTmp, iP2 + 1, iP3 - iP2 - 1)
                            End If

                            iP2 = InStr(1, stTmp, "<")
                            If iP2 > 0 Then
                                stTmp = Mid(stTmp, 1, iP2 - 1)
                            End If

                            NumWork(j).Data(nCnt) = CByte(stTmp)
                            nCnt += 1
                            If nCnt >= (6 + 1) Then
                                ' 当せんデータ文字列を作成
                                stBuf = Format(NumWork(j).CountTime, "00000")
                                For k = 0 To 2
                                    stBuf &= "," & Format(NumWork(j).Data(k), "00")
                                Next k
                                For k = 4 To 6
                                    stBuf &= "," & Format(NumWork(j).Data(k), "00")
                                Next k
                                stBuf &= " " & Format(NumWork(j).Data(3), "00")
                                stBuf &= vbCrLf

                                ' 当せんデータ文字列を格納
                                ReDim Preserve pstLoto6Tmp(piLoto6Cnt)
                                pstLoto6Tmp(piLoto6Cnt) = stBuf
                                piLoto6Cnt += 1

                                bStart = False
                                j += 1
                            End If
                        End If
                    End If
                End If
            End If
            iPos = InStr(iP1, stHtml, "<TD", CompareMethod.Text)
        Else
            iPos = InStr(iPos + 4, stHtml, "<TD", CompareMethod.Text)
        End If
    Loop

    Return j

ErrorHandler:
    Call MsgBox(Err.Description, MsgBoxStyle.Critical Or MsgBoxStyle.MsgBoxSetForeground)
    Return -1

End Function

|

« ロトの当せんデータを自動取得する(4) | トップページ | ロトの当せんデータを自動取得する(6) »

ギャンブル」カテゴリの記事

パソコン・インターネット」カテゴリの記事

ロト」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217467/15992513

この記事へのトラックバック一覧です: ロトの当せんデータを自動取得する(5):

« ロトの当せんデータを自動取得する(4) | トップページ | ロトの当せんデータを自動取得する(6) »