본문 바로가기
VBA 라이브러리

GetObject 함수

2023. 8. 6.

이 글은 도움말을 번역한 글입니다.

GetObject 함수

ActiveX 컴포넌트에서 제공하는 개체에 대한 참조를 반환합니다.

Syntax
GetObject([ pathname ], [ class ])

pathname : 선택 사항입니다. Variant(문자열). 검색할 개체가 포함된 파일의 전체 경로 및 이름입니다. 경로명을 생략하면 클래스가 필요합니다.

class : 선택 사항입니다. Variant(문자열). 개체의 클래스를 나타내는 문자열입니다.

class 인수는 appname.objecttype 구문을 사용하며, 다음과 같은 부분으로 구성됩니다:

appname : 필수입니다. Variant(문자열). 개체를 제공하는 애플리케이션의 이름입니다.

objecttype : 필수입니다. Variant(문자열). 생성할 개체의 유형 또는 클래스입니다.

비고

GetObject 함수를 사용하여 파일에서 ActiveX 개체에 액세스하고 해당 개체를 개체 변수에 할당합니다. Set 문을 사용하여 GetObject가 반환한 개체를 개체 변수에 할당합니다.

엑셀 파일에 접근하는 예제

Sub ExcelFileExample()
    Dim ExcelApp As Object
    Dim ws As Worksheet
    Dim rng As Range

    ' 엑셀 파일 열기
    Set ExcelApp = GetObject("D:\Download\sample.xlsx")

    ' 엑셀 개체가 Workbook인지 확인
    If TypeOf ExcelApp Is Excel.Workbook Then
        ' 첫 번째 시트 가져오기
        Set ws = ExcelApp.Sheets(1)

        ' A1:A10 범위 가져오기
        Set rng = ws.Range("A1:A10")

        ' 범위 값 출력
        Dim cell As Range
        For Each cell In rng
            Debug.Print cell.value
        Next cell

        ' 개체 정리
        Set rng = Nothing
        Set ws = Nothing
        Set ExcelApp = Nothing
    Else
        MsgBox "열려는 파일이 엑셀 파일이 아닙니다."
    End If
End Sub

' 결과 출력
' Title
' Who Is Jaidyn Foss
' The Brodt Beetle
' Lilian & Alyssa
' Lilly In Alabama
' Zechariah And The Light Thulian Pink Brain
' The Spot
' The Town
' Announce The Design
' Our Brink Pink Expansion

액세스 파일에 접근하는 예제

Sub AccessDatabaseExample()
    Dim AccessApp As Object
    Dim db As Object
    Dim rs As Object
    
    ' Access 데이터베이스 파일 열기
    Set AccessApp = GetObject("D:\Northwind.accdb")
    
    ' 데이터베이스 객체 가져오기
    Set db = AccessApp.CurrentDb
    
    ' 쿼리 실행
    Set rs = db.OpenRecordset("SELECT * FROM Employees")
    
    ' 결과 출력
    Do While Not rs.EOF
        Debug.Print rs("E-mail Address")
        rs.MoveNext
    Loop
    
    ' 객체 정리
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    Set AccessApp = Nothing
End Sub

' 출력 결과
' nancy@ northwindtraders.com
' andrew@ northwindtraders.com
' jan@ northwindtraders.com
' mariya@ northwindtraders.com
' steven@ northwindtraders.com
' michael@ northwindtraders.com
' robert@ northwindtraders.com
' laura@ northwindtraders.com
' anne@ northwindtraders.com

이 코드가 실행되면, 지정된 경로명과 연결된 애플리케이션이 시작되고, 지정된 파일의 개체가 활성화됩니다.

만약 경로명이 길이가 0인 문자열("")이라면, GetObject는 지정된 유형의 새 개체 인스턴스를 반환합니다. 경로명 인자를 생략하면, GetObject는 지정된 타입의 현재 활성화된 객체를 반환합니다. 지정된 유형의 개체가 존재하지 않으면, 오류가 발생합니다.

일부 애플리케이션은 파일의 일부를 활성화하는 것을 허용합니다. 파일 이름의 끝에 느낌표(!)를 추가하고, 그 뒤에 파일의 일부를 식별하는 문자열을 붙여 넣으면 됩니다.

예를 들어, 드로잉 애플리케이션에서 파일에 저장된 드로잉에 여러 개의 레이어가 있을 수 있습니다. 다음 코드를 사용하여 다음과 같은 도면 내의 레이어를 활성화할 수 있습니다.

Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")

개체의 클래스를 지정하지 않으면 자동화가 사용자가 제공한 파일 이름에 따라 시작할 애플리케이션과 활성화할 개체를 결정합니다. 그러나 일부 파일은 두 가지 이상의 개체 클래스를 지원할 수 있습니다. 예를 들어, 드로잉은 애플리케이션 개체, 드로잉 개체 및 도구 모음 개체라는 세 가지 유형의 개체를 지원할 수 있으며, 모두 동일한 파일의 일부입니다. 파일에서 활성화할 개체를 지정하려면 선택적 클래스 인수를 사용합니다.

Dim MyObject As Object
Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")

예제에서, FIGMENT는 그림 그리기 애플리케이션의 이름이며, DRAWING은 해당 애플리케이션이 지원하는 개체 유형 중 하나입니다. 개체가 활성화된 후에는, 코드에서 해당 개체 변수를 사용하여 참조합니다. 이전 예제에서는 MyObject라는 개체 변수를 사용하여 새로운 개체의 속성과 메서드에 접근했습니다.

MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW"

Note

개체의 현재 인스턴스가 있거나 이미 로드된 파일로 개체를 생성하려는 경우 GetObject 함수를 사용합니다. 현재 인스턴스가 없고 로드된 파일로 개체를 시작하지 않으려면 CreateObject 함수를 사용하십시오.

개체가 자신을 단일 인스턴스 개체로 등록한 경우 CreateObject가 몇 번 실행되더라도 해당 개체의 인스턴스는 하나만 만들어집니다. 단일 인스턴스 개체의 경우 GetObject는 길이가 0인 문자열("") 구문으로 호출될 때 항상 동일한 인스턴스를 반환하며 경로 이름 인수가 생략되면 오류가 발생합니다. GetObject를 사용하여 Visual Basic으로 만든 클래스에 대한 참조를 얻을 수 없습니다.

Example

' 필요한 API 루틴을 선언합니다:
Declare Function FindWindow Lib "user32" Alias _
                            "FindWindowA" (ByVal lpClassName As String, _
                                           ByVal lpWindowName As Long) As Long

Declare Function SendMessage Lib "user32" Alias _
                             "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
                                             ByVal wParam As Long, ByVal lParam As Long) As Long

Sub GetExcel()
    Dim MyXL As Object    ' Microsoft Excel 참조를 저장할 변수
    Dim ExcelWasNotRunning As Boolean    ' 최종 해제를 위한 플래그

' Microsoft Excel이 이미 실행 중인지 확인합니다.
    On Error Resume Next    ' 오류 처리를 연기합니다.
' GetObject 함수를 첫 번째 인수 없이 호출하면 애플리케이션 인스턴스에 대한 참조가 반환됩니다.
' 애플리케이션이 실행 중이지 않은 경우 오류가 발생합니다.
    Set MyXL = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then ExcelWasNotRunning = True
    Err.Clear    ' 발생한 오류를 초기화합니다.

    ' Microsoft Excel이 실행 중인지 확인하고, 실행 중이면 개체 Table에 등록합니다.
    DetectExcel

    ' 원하는 파일에 대한 개체 변수를 설정합니다.
    Set MyXL = GetObject("c:\vb4\MYTEST.XLS")

    ' Microsoft Excel을 Application 속성을 통해 표시합니다. 그리고
    ' 해당 파일이 포함된 창을 MyXL 개체 참조의 Windows 컬렉션을 사용하여 표시합니다.
    MyXL.Application.Visible = True
    MyXL.Parent.Windows(1).Visible = True
    ' 파일 조작을 여기서 수행합니다.
    ' ...

    ' 만약 Microsoft Excel이 실행되지 않은 경우, Application 속성의 Quit 메서드를 사용하여 종료합니다.
    ' Microsoft Excel을 종료하려고 하면 타이틀 바가 깜빡이고, 로드된 파일을 저장할 것인지 묻는 메시지가 표시됩니다.
    If ExcelWasNotRunning = True Then
        MyXL.Application.Quit
    End If

    Set MyXL = Nothing    ' 애플리케이션과 스프레드시트에 대한 참조를 해제합니다.
End Sub

Sub DetectExcel()
' 실행 중인 Excel을 감지하고 등록하는 프로시저입니다.
    Const WM_USER = 1024
    Dim hWnd As Long
    ' Excel이 실행 중인 경우 이 API 호출은 해당 핸들을 반환합니다.
    hWnd = FindWindow("XLMAIN", 0)
    If hWnd = 0 Then    ' 0은 Excel이 실행 중이지 않음을 의미합니다.
        Exit Sub
    Else
        ' Excel이 실행 중이므로 SendMessage API 함수를 사용하여 실행중인 개체 Table에 등록합니다.
        SendMessage hWnd, WM_USER + 18, 0, 0
    End If
End Sub

도움말 출처

GetObject function (Visual Basic for Applications)

Office VBA reference topic

learn.microsoft.com

'VBA 라이브러리' 카테고리의 다른 글

FormatCurrency 함수  (0) 2023.08.22
Format 함수  (0) 2023.08.22
CreateObject 함수  (0) 2023.08.06
String 함수  (0) 2023.07.22
Space 함수  (0) 2023.07.22