엑셀VBA 인터넷익스플로러 로딩중인지 확인하는 법

엑셀VBA 인터넷익스플로러 로딩중인지 확인하는 법

 

아래 소스를 붙여넣고 Macro1을 실행할 때 내용은 다음과 같다. 먼저 인터넷 창을 띄우고, 네이버에 접속한 후 로딩이 되는대로 ‘a’를 검색, 다시 로딩이 끝나는대로 ‘b’를 검색, 다시 로딩이 완료되면 ‘c’를 검색한다. 이 모든것이 자동으로 이뤄지는 것이다.

 

익스플로러가 로딩 중인지 아닌지를 판단하는 것은 상당히 중요한 이슈로, 로딩이 몇 초에 완료될지 몰라서 무작정 넉넉히 sleep을 걸어야하는 낭비를 줄일 수 있다.

 

‘//원하는 윈도우를 포커스하기 위한 선언 

Private Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As Long) As Long
‘//윈도우 핸들을 찾기 위한 선언
Private Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

 

‘//일정시간을 대기하는 함수 *Sleep(n) = n/1000초 동안 대기
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

 

‘//키보드 상태확인을 위한 선언하기
Private Declare Function GetAsyncKeyState Lib “user32” (ByVal vKey As Long) As Integer
‘//키입력을 위한 선언하기
Const KEYEVENTF_EXTENDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Private Declare Sub keybd_event Lib “user32.dll” (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

 

‘//인터넷 익스플로러 선언

‘//도구-참조-Microsoft Internet controls​ (또는 C:\windows\system32\shdocvw.dll)

Dim IE As New InternetExplorer
‘//기억할 윈도우 핸들
Dim IEhWnd

 

Sub Macro1()

‘//익스플로러를 열어 지정해둔 주소로 접속한다
IE.Visible = True
IE.Navigate “naver.com”
IEhWnd = IE.hwnd ‘//새로 열린 윈도우 핸들을 기억한다

Call LoadWait ‘//로딩중 대기

Call goIE ‘//로딩 끝나면, 익스플로러를 열고(goIE)

Call KeyA: Call Enter: Call LoadWait ‘//”A”를 검색하고 로딩대기

Call KeyB: Call Enter: Call LoadWait ‘//”B”를 검색하고 로딩대기

Call KeyC: Call Enter: Call LoadWait ‘//”C”를 검색하고 로딩대기

‘Call goExcel ‘//엑셀로 돌아오기
End Sub

Function LoadWait()
‘//로딩하는 동안 대기한다

If IE.hwnd <> 0 Then ‘//익스플로러가 켜져있을 때만
Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE ‘//익스플로러가 로딩 중이면 대기한다
DoEvents
Loop
Sleep (1000)

Else
MsgBox “익스플로러가 켜져있지 않습니다”
End
End If
End Function

 

Function goIE()
‘//기억해둔 윈도우 핸들을 불러낸다.
   ‘// 참고로 “IEhWnd = FindWindow(“IEFrame”, vbNullString)”라는
   ‘// 1줄을 추가하면 익스플로러를 찾아서 불러낸다
Call SetForegroundWindow(IEhWnd)
Call Sleep(1000) ‘//1초 쉰다
End Function

Function goExcel()
‘//다른 창에서 작업하다가 다시 엑셀로 돌아갈 때 유용하다

Dim ihWnd As Long
ihWnd = FindWindow(vbNullString, Application.Caption)

If ihWnd = 0 Then
    MsgBox “현재 엑셀을 찾을 수 없습니다”
Else
    Call SetForegroundWindow(ihWnd)
End If
End Function

 

Function Enter()
keybd_event 13, 0, 0, 0 ‘//엔터
keybd_event 13, 0, KEYEVENTF_KEYUP, 0
Call Sleep(100) ‘//0.1초 쉰다

DoEvents
End Function

 

Function KeyA()
keybd_event 65, 0, 0, 0 ‘//A키
keybd_event 65, 0, KEYEVENTF_KEYUP, 0
Call Sleep(100) ‘//0.1초 쉰다

DoEvents
End Function

 

Function KeyB()
keybd_event 66, 0, 0, 0 ‘//B키
keybd_event 66, 0, KEYEVENTF_KEYUP, 0
Call Sleep(100) ‘//0.1초 쉰다
DoEvents
End Function

 

Function KeyC()
keybd_event 67, 0, 0, 0 ‘C키
keybd_event 67, 0, KEYEVENTF_KEYUP, 0
Call Sleep(100) ‘//0.1초 쉰다

DoEvents
End Function