解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

インターネットから自動で情報を取ってくる[VBA]入門〜Webサイトを開く〜



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


パソコンが勝手に仕事してくれないかなぁ…と何度思ったことでしょう。

インターネットから自動で情報が取ってこれたら何か出来そうな気がしませんか?

インターネットから情報が取ってこれるなら社内の Web システムなんて自動化出来るようになったも同然です。

社内の Web システムでは下の様な処理があるかと思います。

【社内の Web システムの処理】
・出社、退社
・会議室の予約
・残業申請
・有休申請
・各種承認

これがワンクリックで出来たり、パソコン点けただけで出来る様になったら、とっても効率的だと思います。

まずは Internet Explorer で Web サイトを自動表示させてみます。



動作環境


Windows 7
Excel 2007
Internet Explorer



環境と素材の準備

リンクの記事で VBScriptVBA でアイコン設定などをしたアプリケーションを作成しました。
Excel VBA と VBScript で 自作アイコンとドラッグ&ドロップが出来るアプリケーションを作る - 解析エンジニアの自動化 blog

今回もアプリケーションとして作成します。
詳細な設定、作成方法はリンクの記事を参照ください。

アプリフォルダの作成

デスクトップに『IEOpener』というフォルダを作成し、図1 の様にサブフォルダを作成します。


図1 アプリフォルダの作成


アイコンの作成

シンプルに『 IE 』という文字でアイコンを作りました。


図2 作成したアイコン



プログラム

今回は少し複雑なのですが、VBScript からマクロ有効ブックのマクロを実行する様なアプリケーションにしました。

マクロ有効ブックの ThisWorkbook モジュールの Open イベントハンドラでマクロを実行すればマクロ有効ブック1つで良いのですが、自動で表示させたい Web サイトの追加や編集を行う時にふつうにマクロ有効ブックを起動させると Web サイトが立ち上がってしまうので、あえて複雑にしました。

VBScript ファイル


図3 VBScript ファイル


VBScript ソースコード


'---------------------------------------------------------------------
' 自分自身(この.vbs)のファイルがあるフォルダの親フォルダ取得
'---------------------------------------------------------------------
path = CreateObject("Scripting.FileSystemObject").getParentFolderName(WScript.ScriptFullName)
pos = instrrev(path, "\")
path = mid(path, 1, pos-1)
'msgbox path
 
'-----------------------------
' Excel オブジェクトの作成
'-----------------------------
Set obj = WScript.CreateObject("Excel.Application")
obj.Visible = True
 
'---------------
' Excel を開く
'---------------
obj.Workbooks.Open path & "\SubProgram\IE操作マクロ.xlsm"
 
'--------------
' マクロ実行
'--------------
ret = obj.Application.Run("IE操作マクロ.xlsm!main")
'msgbox ret
 
'-----------------
' Excel を閉じる
'-----------------
obj.Quit
 
'------------------------------
' シェルオブジェクトの生成
'------------------------------
Set objShell = WScript.CreateObject("WScript.Shell")
 
'------------------
' メッセージ表示
'------------------
objShell.PopUp "操作終了", 2
 
'--------------
' メモリ解放
'--------------
Set objShell = Nothing

VBA ファイル


図4 マクロ有効ブック


図5 マクロ有効ブックの中身


VBA ソースコード


' ウィンドウを最前面に持ってくる Win API
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
 
 
 
Public cnt ' Progress サブルーチンで使用
Public statFlag ' 関数の終わりにプログラムの実行状況を把握するために使用するフラグ
 
 
 
' メインサブルーチン
Function main()
   
    statFlag = True
   
    ' シート情報定義
    strSh = "操作画面"
    startRow = 4
    endRow = 38
   
    ' 変数
    str番号 = ""
    strサイト名 = ""
    strURL = ""
    delim = "@@@@@"
   
    ' 処理
    With ThisWorkbook.Worksheets(strSh)
       
        ' 入力状況の認識
        For i1 = startRow To endRow
           
            ' 入力取得
            番号 = .Cells(i1, 2).Value
            サイト名 = .Cells(i1, 3).Value
            URL = .Cells(i1, 4).Value
           
            ' 全て入力されているなら
            If 番号 <> "" And サイト名 <> "" And URL <> "" Then
               
                ' 入力情報の記憶
                If str番号 = "" Then
                    str番号 = 番号: strサイト名 = サイト名: strURL = URL
                Else
                    str番号 = str番号 & delim & 番号: strサイト名 = strサイト名 & delim & サイト名: strURL = strURL & delim & URL
                End If
               
            End If
           
        Next i1
       
        ' 配列化
        arr番号 = Split(str番号, delim)
        arrサイト名 = Split(strサイト名, delim)
        arrURL = Split(strURL, delim)
       
        ' IE オブジェクト配列の作成
        ReDim objIE(UBound(arr番号)) As Object
       
        ' IE 操作
        For i1 = LBound(arr番号) To UBound(arr番号)
           
            ' IE 起動
            Call NewIE(objIE(i1), arrURL(i1))
           
        Next i1
       
    End With
   
    ' IE 同期
    Call SyncIE(objIE)
   
    main = statFlag
   
End Function
 
 
 
' IE を起動するサブルーチン
Sub NewIE(ByRef objIE As Object, ByVal URL)
  
   Set objIE = CreateObject("InternetExplorer.Application") ' IE オブジェクトの生成
  
   objIE.Visible = True                                     ' IE オブジェクトの可視化
  
   objIE.navigate URL                                       ' IEを開く
  
End Sub
 
 
 
' IE と同期を取るサブルーチン
Sub SyncIE(ByRef objIE() As Object)
   
    ' IE 全てを調べるループ
    For i1 = LBound(objIE) To UBound(objIE)
       
        ' ループ回数をカウントする変数
        cntLoop = 0
       
        ' ページが読み込まれるまで待つ
        Do While objIE(i1).Busy = True Or objIE(i1).readyState <> 4
            ' IE を最前面に表示する
            'rc = BringWindowToTop(CLng(objIE(i1).hwnd))
            rc = SetForegroundWindow(CLng(objIE(i1).hwnd))
            cntLoop = cntLoop + 1
            Call Progress(" Web サイト表示中")        ' Excel のステータスバーに進捗を表示する
            Application.Wait [Now()+"00:00:00.3"]   ' 0.3 秒止まる
            DoEvents                                  ' 1度処理をOSに戻す
            ' 60回IEの状態を確認してもIEの読み込みが完了していなければ
            If cntLoop > 60 Then
                cntLoop = 0
                objIE(i1).Refresh ' IEの再読み込みを実行
                Debug.Print objIE(i1).LocationName & " is Refresh!!"
            End If
        Loop
       
        Debug.Print objIE(i1).LocationName & " is OK!!"
       
    Next i1
   
End Sub
 
 
 
' SyncIE サブルーチン内で進捗を表示するサブルーチン
Sub Progress(ByVal msg)
   
    ' ステータスバーに表示する文字列の個数を設定する変数
    cnt = cnt + 1
   
    ' ステータスバーに表示する文字が10文字を超えたら1に戻す
    If cnt > 10 Then cnt = 1
   
    AnimPic = "ε"             ' 変更する文字の設定
    OriginalPic = "┏( ・_・)┛" ' 変更しない文字の設定
   
    Application.StatusBar = msg & String(cnt, AnimPic) & OriginalPic ' cnt : AnimPic の表示個数(Public 変数)
   
End Sub



結果



図6 作成したアプリケーション



図7 アプリケーションから起動した Web サイト



コメント

アイコンの作り方、VBScript ファイルの作り方などなど、アプリケーション化の詳しいやり方は下のリンクの記事でまとめています。
Excel VBA と VBScript で 自作アイコンとドラッグ&ドロップが出来るアプリケーションを作る - 解析エンジニアの自動化 blog

また、この Web サイトを自動で立ち上げるアプリケーションのアイコンを下のリンクの記事でまとめている『パソコンを起動したら自動で実行される設定が出来る VBScript 』にドラッグ&ドロップすれば、パソコンをつけただけで自動で Web サイトが立ち上がります。
パソコンを起動するとプログラムが自動で実行させる設定にする[VBScript] - 解析エンジニアの自動化 blog

今回作成したマクロ有効ブックを改造していけばパソコンをつけて、待っているだけで手間のかかる作業が出来てしまう日が来るかもしれません。



以上