VBA
자동화 또는 다른 응용 프로그램 라이브러리 사용
수색…
소개
Visual Basic 응용 프로그램의 일부로 다른 응용 프로그램의 개체를 사용하는 경우 해당 응용 프로그램의 개체 라이브러리에 대한 참조를 설정할 수 있습니다. 이 문서는 Windows 셸, Internet Explorer, XML HttpRequest 등과 같은 다른 소프트웨어 라이브러리를 사용하는 방법의 목록, 소스 및 예제를 제공합니다.
통사론
- expression.CreateObject (ObjectName)
- 표현; 필수 사항. Application 개체를 반환하는 식입니다.
- ObjectName; 필수 문자열. 작성할 객체의 클래스 이름입니다. 유효한 클래스 이름에 대한 자세한 내용은 OLE 프로그램 식별자를 참조하십시오.
비고
응용 프로그램이 자동화를 지원하면 응용 프로그램이 노출하는 개체에 Visual Basic에서 액세스 할 수 있습니다. Visual Basic을 사용하여 개체의 메서드를 호출하거나 개체의 속성을 가져 와서 설정하여 이러한 개체를 조작합니다.
Visual Basic 응용 프로그램의 일부로 다른 응용 프로그램의 개체를 사용하는 경우 해당 응용 프로그램의 개체 라이브러리에 대한 참조를 설정할 수 있습니다. 이를 수행하기 전에 먼저 응용 프로그램이 오브젝트 라이브러리를 제공하는지 확인해야합니다.
해당 응용 프로그램의 개체 라이브러리에 대한 참조를 설정하여 코드에서 사용하려는 다른 응용 프로그램의 개체를 선택할 수 있습니다.
지정된 클래스의 Automation 개체를 만듭니다. 응용 프로그램이 이미 실행중인 경우 CreateObject는 새 인스턴스를 만듭니다.
VBScript 정규식
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp")
도구> 참조> Microsoft VBScript 정규식 #. #
관련 DLL : VBScript.dll
출처 : Internet Explorer 1.0 및 5.5
- MSDN-Microsoft는 정규 표현식으로 VBScript를 강화합니다.
- MSDN- 정규식 구문 (스크립팅)
- 전문가 교환 - Visual Basic에서 정규식을 사용하여 응용 프로그램 및 Visual Basic 6 사용
- Microsoft Excel에서 정규식 (Regex)을 셀 내에서 사용하는 방법과 SO에서 루프를 사용하는 방법
- regular-expressions.info/vbscript
- regular-expressions.info/vbscriptexample
- WIKI - 정규 표현식
암호
이 함수를 사용하여 RegEx 결과를 얻고 모든 일치 (1보다 큰 경우)를 1 문자열로 연결 한 다음 결과를 Excel 셀에 표시 할 수 있습니다.
Public Function getRegExResult(ByVal SourceString As String, Optional ByVal RegExPattern As String = "\d+", _
Optional ByVal isGlobalSearch As Boolean = True, Optional ByVal isCaseSensitive As Boolean = False, Optional ByVal Delimiter As String = ";") As String
Static RegExObject As Object
If RegExObject Is Nothing Then
Set RegExObject = createVBScriptRegExObject
End If
getRegExResult = removeLeadingDelimiter(concatObjectItems(getRegExMatches(RegExObject, SourceString, RegExPattern, isGlobalSearch, isCaseSensitive), Delimiter), Delimiter)
End Function
Private Function getRegExMatches(ByRef RegExObj As Object, _
ByVal SourceString As String, ByVal RegExPattern As String, ByVal isGlobalSearch As Boolean, ByVal isCaseSensitive As Boolean) As Object
With RegExObj
.Global = isGlobalSearch
.IgnoreCase = Not (isCaseSensitive) 'it is more user friendly to use positive meaning of argument, like isCaseSensitive, than to use negative IgnoreCase
.Pattern = RegExPattern
Set getRegExMatches = .Execute(SourceString)
End With
End Function
Private Function concatObjectItems(ByRef Obj As Object, Optional ByVal DelimiterCustom As String = ";") As String
Dim ObjElement As Variant
For Each ObjElement In Obj
concatObjectItems = concatObjectItems & DelimiterCustom & ObjElement.Value
Next
End Function
Public Function removeLeadingDelimiter(ByVal SourceString As String, ByVal Delimiter As String) As String
If Left$(SourceString, Len(Delimiter)) = Delimiter Then
removeLeadingDelimiter = Mid$(SourceString, Len(Delimiter) + 1)
End If
End Function
Private Function createVBScriptRegExObject() As Object
Set createVBScriptRegExObject = CreateObject("vbscript.RegExp") 'ex.: createVBScriptRegExObject.Pattern
End Function
파일 시스템 개체 스크립팅
Set createScriptingFileSystemObject = CreateObject("Scripting.FileSystemObject")
도구> 참조> Microsoft Scripting Runtime
관련 DLL : ScrRun.dll
출처 : Windows OS
MSDN- FileSystemObject를 사용하여 파일에 액세스
파일 시스템 개체 (FSO) 모델은 폴더 및 파일 작업을위한 개체 기반 도구를 제공합니다. 익숙한 object.method 구문을 사용하여 풍부한 속성, 메서드 및 이벤트 집합을 사용하여 폴더 및 파일을 처리 할 수 있습니다. 전통적인 Visual Basic 문과 명령을 사용할 수도 있습니다.
FSO 모델은 응용 프로그램에서 폴더를 작성, 변경, 이동 및 삭제하거나 특정 폴더가있는 경우 및 위치를 결정할 수있는 기능을 제공합니다. 또한 이름, 작성한 날짜 또는 마지막으로 수정 한 날짜와 같은 폴더에 대한 정보를 얻을 수 있습니다.
MSDN-FileSystemObject 항목 : " ... FileSystemObject 개념 및 사용 방법 설명 " exceltrick-VBA의 FileSystemObject - 설명
Scripting.FileSystemObject
스크립팅 사전 개체
Set dict = CreateObject("Scripting.Dictionary")
도구> 참조> Microsoft Scripting Runtime
관련 DLL : ScrRun.dll
출처 : Windows OS
Scripting.Dictionary 객체
MSDN- 사전 개체
Internet Explorer 개체
Set createInternetExplorerObject = CreateObject("InternetExplorer.Application")
도구> 참조> Microsoft 인터넷 컨트롤
관련 DLL : ieframe.dll
출처 : Internet Explorer 브라우저
자동화를 통해 Windows Internet Explorer의 인스턴스를 제어합니다.
Internet Explorer Objec 기본 멤버
아래 코드는 IE 개체가 작동하는 방식과 VBA를 통해 IE 개체를 조작하는 방법을 소개합니다. 나는 그것을 통해 단계별 실행을 권장한다. 그렇지 않으면 다중 네비게이션 중에 오류가 발생할 수있다.
Sub IEGetToKnow()
Dim IE As InternetExplorer 'Reference to Microsoft Internet Controls
Set IE = New InternetExplorer
With IE
.Visible = True 'Sets or gets a value that indicates whether the object is visible or hidden.
'Navigation
.Navigate2 "http://www.example.com" 'Navigates the browser to a location that might not be expressed as a URL, such as a PIDL for an entity in the Windows Shell namespace.
Debug.Print .Busy 'Gets a value that indicates whether the object is engaged in a navigation or downloading operation.
Debug.Print .ReadyState 'Gets the ready state of the object.
.Navigate2 "http://www.example.com/2"
.GoBack 'Navigates backward one item in the history list
.GoForward 'Navigates forward one item in the history list.
.GoHome 'Navigates to the current home or start page.
.Stop 'Cancels a pending navigation or download, and stops dynamic page elements, such as background sounds and animations.
.Refresh 'Reloads the file that is currently displayed in the object.
Debug.Print .Silent 'Sets or gets a value that indicates whether the object can display dialog boxes.
Debug.Print .Type 'Gets the user type name of the contained document object.
Debug.Print .Top 'Sets or gets the coordinate of the top edge of the object.
Debug.Print .Left 'Sets or gets the coordinate of the left edge of the object.
Debug.Print .Height 'Sets or gets the height of the object.
Debug.Print .Width 'Sets or gets the width of the object.
End With
IE.Quit 'close the application window
End Sub
웹 스크래핑
IE에서 가장 일반적으로하는 일은 웹 사이트의 일부 정보를 마킹하거나 웹 사이트 양식을 작성하고 정보를 제출하는 것입니다. 우리는 그것을하는 방법을 볼 것입니다.
example.com 소스 코드를 살펴 보겠습니다.
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style ... </style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.</p>
<p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
다음과 같은 코드를 사용하여 정보를 얻고 설정할 수 있습니다.
Sub IEWebScrape1()
Dim IE As InternetExplorer 'Reference to Microsoft Internet Controls
Set IE = New InternetExplorer
With IE
.Visible = True
.Navigate2 "http://www.example.com"
'we add a loop to be sure the website is loaded and ready.
'Does not work consistently. Cannot be relied upon.
Do While .Busy = True Or .ReadyState <> READYSTATE_COMPLETE 'Equivalent = .ReadyState <> 4
' DoEvents - worth considering. Know implications before you use it.
Application.Wait (Now + TimeValue("00:00:01")) 'Wait 1 second, then check again.
Loop
'Print info in immediate window
With .Document 'the source code HTML "below" the displayed page.
Stop 'VBE Stop. Continue line by line to see what happens.
Debug.Print .GetElementsByTagName("title")(0).innerHtml 'prints "Example Domain"
Debug.Print .GetElementsByTagName("h1")(0).innerHtml 'prints "Example Domain"
Debug.Print .GetElementsByTagName("p")(0).innerHtml 'prints "This domain is established..."
Debug.Print .GetElementsByTagName("p")(1).innerHtml 'prints "<a href="http://www.iana.org/domains/example">More information...</a>"
Debug.Print .GetElementsByTagName("p")(1).innerText 'prints "More information..."
Debug.Print .GetElementsByTagName("a")(0).innerText 'prints "More information..."
'We can change the localy displayed website. Don't worry about breaking the site.
.GetElementsByTagName("title")(0).innerHtml = "Psst, scraping..."
.GetElementsByTagName("h1")(0).innerHtml = "Let me try something fishy." 'You have just changed the local HTML of the site.
.GetElementsByTagName("p")(0).innerHtml = "Lorem ipsum........... The End"
.GetElementsByTagName("a")(0).innerText = "iana.org"
End With '.document
.Quit 'close the application window
End With 'ie
End Sub
무슨 일 이니? 핵심 플레이어는 HTML 소스 코드 인 .Document 입니다. 우리는 우리가 원하는 컬렉션이나 객체를 얻기 위해 몇 가지 쿼리를 적용 할 수 있습니다.
예를 들어, IE.Document.GetElementsByTagName("title")(0).innerHtml
. GetElementsByTagName
은 " title "태그가있는 HTML 요소의 컬렉션 을 반환합니다. 소스 코드에는 이러한 태그가 하나만 있습니다. Collection 은 0부터 시작합니다. 따라서 첫 번째 요소를 얻으려면 (0)
추가하십시오. 지금 우리의 경우 우리는 innerHtml
(String)만을 원하고 Element Object 자체는 원하지 않습니다. 그래서 우리는 우리가 원하는 속성을 지정합니다.
딸깍 하는 소리
사이트의 링크를 따라 가려면 여러 가지 방법을 사용할 수 있습니다.
Sub IEGoToPlaces()
Dim IE As InternetExplorer 'Reference to Microsoft Internet Controls
Set IE = New InternetExplorer
With IE
.Visible = True
.Navigate2 "http://www.example.com"
Stop 'VBE Stop. Continue line by line to see what happens.
'Click
.Document.GetElementsByTagName("a")(0).Click
Stop 'VBE Stop.
'Return Back
.GoBack
Stop 'VBE Stop.
'Navigate using the href attribute in the <a> tag, or "link"
.Navigate2 .Document.GetElementsByTagName("a")(0).href
Stop 'VBE Stop.
.Quit 'close the application window
End With
End Sub
Microsoft HTML Object Library 또는 IE 가장 친한 친구
IE에로드되는 HTML을 최대한 활용하려면 Microsoft HTML Object Library 와 같은 다른 라이브러리를 사용할 수 있습니다. 다른 예에서 이것에 대해 더 자세히.
IE 주요 문제
IE의 주된 문제는 페이지가로드되고 상호 작용할 준비가되었는지 확인하는 것입니다. Do While... Loop
도움이되지만 신뢰할 수 없습니다.
또한 IE를 사용하여 HTML 컨텐트를 긁어내는 것은 OVERKILL입니다. 왜? 브라우저는 모든 CSS, 자바 스크립트, 그림, 팝업 등으로 웹 페이지를 검색하는 것을 의미하기 때문에 원시 데이터 만 필요하면 다른 접근 방법을 고려하십시오. 예 : XML HTTP 요청을 사용 합니다 . 다른 예에서 이것에 대해 더 자세히.