| 엑셀 VBA로 만드는 네이버 자동로그인 프로그램 #3 | 오빠두엑셀 VBA 강의 2-3
1. VBA로 인터넷 접근 및 웹페이지 정보수집하는 방법
엑셀 VBA를 통해 웹페이지 또는 웹문서에 접근하여 정보를 수정하고 데이터를 수집하기 위해서는 아래와 같이 크게 2가지 방법을 사용합니다.
1-A. WinHTTP (또는 MSXMLHTTP) 이용
VBA에서는 WinHTTP 또는 MSXMLHTTP를 이용하여 웹문서 또는 웹페이지의 데이터를 수집하고 편집할 수 있는 기능을 제공합니다.
엑셀 VBA 자체에서 제공하는 XML라이브러리를 통해 Early Binding 하여 이용할 수도 있고, 또는 CreateObject 명령문을 통해 MSXML2 의 XMLHTTP 개체를 불러서 Late Binding 하여 이용할 수도 있습니다. WinHTTP 또는 XMLHTTP는 주로 VBA를 통해 웹파싱(Web Parsing, 웹페이지에서 데이터를 추출하는 행위)을 할 때 이용하게 됩니다.

[링크] 웹파싱에 대한 위키(영문) 내용 참조
https://en.wikipedia.org/wiki/Web_scraping
1-B. Early Binding(정적 바인딩)과 Late Binding(동적 바인딩)의 차이점
코딩에 어려움을 겪는분들을 위해 Early Binding(정적 바인딩) 과 Late Binding(동적 바인딩)의 차이점을 간략히 안내해드리고자 합니다.
다만 Late Binding의 경우, VBA에서 각 개체의 속성값을 자동으로 지정해주지 않으므로 코드작성에 어려움을 겪을 수 있고, Early Binding보다 안정성면에서 떨어지는 단점이 있으므로 VBA에서 제공되는 Reference 안에서는 Early Binding을 이용하는 것을 권장합니다.
1-C. IE (Internet Explorer) 이용
VBA에서는 Internet Explorer를 통해 사용자가 직접 브라우저를 사용하듯이 접근하여 거의 모든 웹문서와 웹페이지의 정보를 편집/수정 할 수 있는 툴을 만들 수 있습니다.
XMLHTTP의 경우 추가 로그인이 필요하거나 페이지 보안문제로 접근이 어려운 경우 API키를 받아 이용해야 하므로 웹페이지에 접근시도조차 못하는 경우도 있습니다. 하지만 IE를 이용하게 되면 키보드와 마우스의 위치를 시간의 흐름대로 지정하여 코드를 작성하므로 대부분의 웹문서나 웹페이지에 접근하여 데이터를 수집할 수 있습니다.
다만 IE를 이용하여 웹문서나 웹페이지에 접근할 경우, XMLHTTP에 비하여 다소 많은 메모리를 소모하고 속도가 느리다는 단점이 있습니다.

2. Wait_Browser (IE 컨트롤을 위한 보조명령문 작성)
VBA에서 IE를 통해 웹문서나 웹페이지를 관리할 시, 항상 주의해야 할 부분은 실행중인 인터넷 익스플로러가 ‘사용할 준비가 완료될 때’ 까지, 즉 웹문서의 로딩이 완료되고 이후 동작을 위한 준비가 끝날 때까지 기다린 뒤 그 다음 동작을 취하는 것입니다. 이러한 동작을 위해 Wait_Browser 라는 보조 명령문을 아래와 같이 작성해줍니다.
Sub Wait_Browser(Browser As InternetExplorer, Optional t As Integer = 1) While Browser.Busy Or Browser.READYSTATE <> 4 DoEvents Wend Application.Wait DateAdd("s", t, Now) End Sub
2-A. Browser.REDAYSTATE에 대한 이해
VBA에서 판단하는 인터넷 익스플로러의 준비상태는 아래와 같이 총 5단계로 구분됩니다. 실제 코딩을 하면서 이용하게 되는 준비상태는 4번, 즉 모든 준비가 끝나고 모든 데이터를 사용 할 수 있는 상태이며, Browser.Busy (로딩중, 또는 실행중) 상태와 조합하여 인터넷 익스플로러가 다음 동작을 위해 준비가 완료된 상태를 판단하게 됩니다.
• READYSTATE_LOADING(1) : 브라우저 로딩
• READYSTATE_LOADED(2) : 브라우저 초기화 완료
• READYSTATE_INTERACTIVE(3) : 브라우저 응답 가능 하지만 일부 데이터 사용 불가능
• READYSTATE_COMPLETE(4) : 모든 데이터 사용 가능 상태
2-B. Application.Wait 속성에 대해 알아보기
Application (엑셀 프로그램) 에서의 Wait 속성을 통해 지정된 시간까지 코드를 일시정지하고 기다리는 행동을 취할 수 있습니다.
■ 사용법 : Application.Wait [Variant(Time)/시간]
■ 출력값 : Boolean (참/거짓)
'Application.Wait 속성 사용예제 > '## 현재시간에서 5초가 뒤의 시간까지 기다립니다. ## Application.Wait Now() + TimeValue("0:00:05")
[링크] Application.Wait 속성에 대해 자세히 알아보기
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-wait-method-excel
2-C. DateAdd 함수 사용법에 대해 알아보기
DateAdd 함수는 VBA에 내장된 함수입니다. DateAdd함수는 변수로 지정한 기준시간에서, 입력한 단위/값만큼의 차이가 나는 결과값을 Variant(Date) 형태로 출력합니다.
■ 출력값 : Variant(Date)
■ 단위의 종류 :
속성 | 설명 |
yyyy | 년 |
q | 분기 |
m | 달 |
d | 일(주말포함) |
w | 평일 |
ww | 주 |
h | 시간 |
n | 분 |
s | 초 |
'DateAdd 함수 사용예제> '## 현재시간기준 1분 뒤의값을 출력합니다. DateAdd("n",1,Now()) '## 금일 기준으로, 3일 뒤의 값을 출력합니다. DateAdd("d", 3, Date())
[링크] DateAdd 함수에 대해 자세히 알아보기
https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/dateadd-function
3. 인터넷 익스플로러를 200% 활용하기 위한 HTML 활용법
엑셀 VBA를 통해 인터넷 익스플로러를 활용할 때에 HTML 언어에 대해 약간의 이해만 하고 있다면 이를 200% 더 효율적으로 이용할 수 있습니다. HTML에 대한 깊이 알고 있지 않더라도, 목표가 되는 웹페이지에서 사용중인 HTML 언어의 대략적인 흐름 또는 그 구성만 이해할 수 있다면, VBA를 통해서 인터넷 익스플로러에 쉽게 접근할 수 있습니다.
보편적으로 사용되는 인터넷 브라우저 (Internet Explorer(인터넷 익스플로러), Chrome(크롬), Firefox(파이어폭스)) 모두 브라우저를 실행한 상태에서 F12키를 누르면 개발자도구가 나오고, 개발자도구를 통해서 현재 보여지는 웹페이지의 HTML 언어를 쉽게 분석할 수 있는데요 그 방법을 공유해드립니다.
3-A. 브라우저에서 개발자도구 실행 및 성분분석도구 선택
실행중인 브라우저에서 F12키를 눌러서 개발자도구를 실행합니다.

개발자도구가 실행되면, 개발자도구 좌측상단 (크롬의 경우)에 위치한 성분분석도구를 선택합니다. 이후 마우스커서를 HTML 언어를 분석하고자 하는 위치로 이동하게 되면, 해당하는 컨트롤에 대해 작성된 HTML언어가 표시되고 이를 바탕으로 VBA를 통해 인터넷 익스플로러를 통제할 수 있게 됩니다.

3-B. VBA와 인터넷 익스플로러 연동을 위해 반드시 짚고 넘어가야 할 속성 3가지
앞서 말씀드렸듯이, VBA를 통해 웹페이지 연동/통제 및 데이터 수집을 할 경우, 크게 WinHTTP(또는 MSXMLHTTP)를 이용하거나 또는 IE(인터넷 익스플로러)를 이용할 수 있다고 말씀드렸습니다.
그 중 인터넷 익스플로러를 VBA와 연동하는 경우는, 보통 사용자가 웹페이지에서 또 다른 행동을 취해야 할 경우에 사용하게 되는데요. 그렇기 때문에 VBA와 인터넷 익스플로러를 연동할 경우 사용할 웹페이지의 HTML 언어 중에서 사용된 (또는 웹페이지의 각 성분의 통제하기 위해 사용할) 아래의 3가지 속성만 체크한다면 이후에는 아주 쉽게 연동할 수 있습니다.
1. ID 속성:고유 값에 해당하는 속성입니다. 만약 사용할 성분이 ‘ID’ 값을 통해 구분 된다면 이후 강의에서 다루게 될, .GetElementByID 함수를 통해 쉽게 처리가 가능하게 됩니다.

2. Class 속성: 만약 통제하고자 하는 성분이 ‘ID’값으로 구분되지 않는다면, Class 속성으로 1차 분류를 하게 됩니다. 마찬가지로 이후 강의에서 다루게 될, .GetElementByClassName 함수를 통해 처리할 수 있습니다.
3. Type 속성:Class속성을 통해서 1차로 분류가 된 하나의 그룹이 생성되었습니다. 그리고 해당 그룹에서, Type 속성이 특정 값인 성분을 추출하면 웹페이지에서 원하는 성분을 통제할 수 있게 됩니다. (대부분의 웹문서는 Class-Type 을 통한 분류만 하여도 원하는 속성을 추출할 수 있습니다.)
