ie-excel

エクセル・マクロでie操作

Excel VBAでIEを操作 ieを最前面にする

2018/11/09

Excel VBAを使用していると、ある状態になった場合そのウィンドウを最前面に表示。
その次の作業をさせたいようなケースがあります。
そのため、今回はWindowを最前面に出す方法を解説したいと思います。

紹介する方式は2種類。

前準備

  • Visual Basic Editor の画面から「ツール」→「参照設定」を選択します。
  • 「Microsoft Internet Controls」と「Microsoft HTML Object Library」にチェックを入れて、OKを押す

ieを最前面にする

ヒトがieの画面を最前面にする場合は以下の操作をします。

  1. IEを立ち上げる
  2. URLを入力する
  3. サイトが表示されるのを待つ
  4. IEを最前面にする

上記をVBAで表現すると以下のようになります。

SetForegroundWindowを利用した方法

Option Explicit

'変数を宣言
Dim objIE1 As InternetExplorer
Dim objIE2 As InternetExplorer
Dim objIE3 As InternetExplorer
Dim ieDoc As HTMLDocument

'Win32 APIのSetForegroundWindowを使用する
' Excel 64bit用
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" ( _
    ByVal Hwnd As LongPtr) As Long

' Excel 32bit用
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Private Declare Function SetForegroundWindow Lib "user32" ( _
    ByVal hwnd As Long) As Long

#End If

Sub IE_open()

'Internet Exploreを立ち上げる
  Set objIE1 = CreateObject("InternetExplorer.Application")
  objIE1.Visible = True

'URLを指定する
  objIE1.Navigate2 "https://www.google.co.jp"

'該当のWebサイトが表示されるのを待つ
  While objIE1.Busy Or objIE1.readyState <> READYSTATE_COMPLETE
    DoEvents
  Wend

'Internet Exploreを立ち上げる
  Set objIE2 = CreateObject("InternetExplorer.Application")
  objIE2.Visible = True

'URLを指定する
  objIE2.Navigate2 "https://www.yahoo.co.jp"

'該当のWebサイトが表示されるのを待つ
  While objIE2.Busy Or objIE2.readyState <> READYSTATE_COMPLETE
    DoEvents
  Wend

'Internet Exploreを立ち上げる
  Set objIE3 = CreateObject("InternetExplorer.Application")
  objIE3.Visible = True

'URLを指定する
  objIE3.Navigate2 "https://www.amazon.co.jp"

'該当のWebサイトが表示されるのを待つ
  While objIE3.Busy Or objIE3.readyState <> READYSTATE_COMPLETE
    DoEvents
  Wend
 
  Sleep (1000)
    
'IEを最前面に表示
  SetForegroundWindow (objIE1.hwnd)

  Set objIE1 = Nothing
  Set objIE2 = Nothing
  Set objIE3 = Nothing
    
End Sub

3つのサイトを開いて、最初に開いたサイトを最前面にする方式です。

本当はSleepを使用したくはなかったのですが、させないと時々意図しないウィンドウが最前面となるために使用しています。

SetForegroundWindowとSleepを宣言する
'Win32 APIのSetForegroundWindowを使用する
' Excel 64bit用
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" ( _
    ByVal Hwnd As LongPtr) As Long

' Excel 32bit用
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Private Declare Function SetForegroundWindow Lib "user32" ( _
    ByVal hwnd As Long) As Long

#End If

「SetForegroundWindow」「Sleep」それぞれを使用するために、APIを宣言しています。

64bitと32bitで宣言方法が異なるため、それぞれに対応するように分岐させています。

最前面に表示する
'IEを最前面に表示
  SetForegroundWindow (objIE1.hwnd)

今回は「objIE1」として開いたGoogleのサイトを最前面となるようにしています。

「objIE1」の箇所を「objIE2」や「objIE3」に変更すれば、該当のウィンドウが最前面となります。

「SetForegroundWindow」を使用すると、このように簡単に指定できます。

 

 

AppActivateを使用した最前面表示方法

SetForegroundWindowではなくAppActivateを用いた方法の例示です。

Option Explicit

'変数を宣言
Dim objIE1 As InternetExplorer
Dim objIE2 As InternetExplorer
Dim objIE3 As InternetExplorer
Dim ieDoc As HTMLDocument

'Win32 APIのSetForegroundWindowを使用する
' Excel 64bit用
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)

' Excel 32bit用
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

#End If

Sub IE_open()

'Internet Exploreを立ち上げる
  Set objIE1 = CreateObject("InternetExplorer.Application")
  objIE1.Visible = True

'URLを指定する
  objIE1.Navigate2 "https://www.google.co.jp"

'該当のWebサイトが表示されるのを待つ
  While objIE1.Busy Or objIE1.readyState <> READYSTATE_COMPLETE
    DoEvents
  Wend

'Internet Exploreを立ち上げる
  Set objIE2 = CreateObject("InternetExplorer.Application")
  objIE2.Visible = True

'URLを指定する
  objIE2.Navigate2 "https://www.yahoo.co.jp"

'該当のWebサイトが表示されるのを待つ
  While objIE2.Busy Or objIE2.readyState <> READYSTATE_COMPLETE
    DoEvents
  Wend

'Internet Exploreを立ち上げる
  Set objIE3 = CreateObject("InternetExplorer.Application")
  objIE3.Visible = True

'URLを指定する
  objIE3.Navigate2 "https://www.amazon.co.jp"

'該当のWebサイトが表示されるのを待つ
  While objIE3.Busy Or objIE3.readyState <> READYSTATE_COMPLETE
    DoEvents
  Wend
 
  Sleep (1000)
  
   AppActivate objIE1.document.Title & " - " & "Internet Explorer"
    
  SendKeys "%(' ')", True
  Sleep (500)
  SendKeys "X", True
        
  Sleep (500)

  SendKeys "%(' ')", True
  Sleep (500)
  SendKeys "R", True

  Set objIE1 = Nothing
  Set objIE2 = Nothing
  Set objIE3 = Nothing

End Sub
AppActivateを実行してアクティブ化し、その後最大化と元のサイズに戻す
AppActivate objIE1.document.Title & " - " & "Internet Explorer"
    
SendKeys "%(' ')", True
Sleep (500)
SendKeys "X", True
        
Sleep (500)

SendKeys "%(' ')", True
Sleep (500)
SendKeys "R", True

本当はこちらの方がスマートなやり方のはずですが・・・

AppActivateを宣言したのち、内部ではアクティブになっているようですが、残念ながらデスクトップ上では前面には出てこないことも・・・
そこで「SendKey」で一度ウィンドウのサイズを最大化してから、元のサイズに戻しています。

また、最大化する際「ALT」+「Space」+「X」ですが、時々「ALT」+「SPACE」で止まることもあるようなため、「X」を押すタイミングは若干Sleepを入れてずらしています。

元のウィンドウサイズに戻すのは「ALT」+「Space」+「R」のため、後半はその記述です。

Sleepをたくさん入れなければならないため「SetForegroundWindow」を用いた方法の方がスマートです。

-ExcelでIE操作