수색…


소개

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

암호

이 함수를 사용하여 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 브라우저

MSDN-InternetExplorer 개체

자동화를 통해 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 요청을 사용 합니다 . 다른 예에서 이것에 대해 더 자세히.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow