Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Еще…Меньше
Примечание: Функция, метод, объект или свойство, описанные в данном разделе, отключаются, если служба обработки выражений Microsoft Jet выполняется в режиме песочницы, который не позволяет рассчитывать потенциально небезопасные выражения. Для получения дополнительных сведений выполните в справке поиск по словам «режим песочницы».
Возвращает ссылку на объект, предоставляемый компонентом ActiveX.
Синтаксис
GetObject([имя_пути ] [, класс ] )
Функция GetObject имеет следующие аргументы:
Аргумент |
Описание |
|
Необязательный аргумент. Variant (String). Полный путь к файлу, содержащему объект, который требуется получить. Если аргумент имя_пути пропущен, класс является обязательным. |
|
Необязательный аргумент. Variant (String). Строка, представляющая класс объекта. |
Аргумент классаргумент использует синтаксис имя_приложения.тип_объекта и содержит следующие части:
Элемент |
Описание |
имя_приложения |
Обязательный аргумент. Variant (String). Имя приложения, предоставляющего объект. |
тип_объекта |
Обязательный аргумент. Variant (String). Тип или класс объекта, который требуется создать. |
Замечания
Примечание: В примерах ниже показано, как использовать эту функцию в модуле Visual Basic для приложений (VBA). Чтобы получить дополнительные сведения о работе с VBA, выберите Справочник разработчика в раскрывающемся списке рядом с полем Поиск и введите одно или несколько слов в поле поиска.
Функция GetObject используется для доступа к объекту ActiveX файла и его назначению объекту объектная переменная. Чтобы назначить объекту, возвращаемом объектом GetObject, объекту, возвращаемом объектом, используйте утверждение Set. Например:
Dim CADObject As Object
Set CADObject = GetObject("C:CADSCHEMA.CAD")
При выполнении этого кода приложение, связанное с указанным именем_пути, запускается, а объект в указанном файле активируется.
Если имя_пути содержит пустую строку («»), GetObject возвращает новый экземпляр объекта указанного типа. Если аргумент имя_пути пропущен, функция GetObject возвращает текущий активный объект указанного типа. Если такой объект не существует, возникает ошибка.
Некоторые приложения разрешают активировать часть файла. Добавьте в конец имени файла восклицательный знак (!), а после него строку, указывающую часть файла, которую требуется активировать. Сведения о создании этой строки см. в документации приложения, в котором был создан объект.
Например, в графическом редакторе может быть несколько уровней для рисунка, сохраненного в файле. Вы можете использовать следующий код для активации уровня рисунка с названием SCHEMA.CAD:
Set LayerObject = GetObject("C:CADSCHEMA.CAD!Layer3")
Если класс объекта не был задан, автоматизация определяет запускаемое приложение и активируемый объект на основе предоставленного имени файла. Некоторые файлы, однако, могут поддерживать несколько классов объектов. Например, рисунок может поддерживать три различных типа объектов — объект Application, объект Drawing и объект Toolbar, —каждый из которых является частью одного и того же файла. Чтобы указать, какой объект в файле требуется активировать, используйте необязательный аргумент класс. Например:
Dim MyObject As Object
Set MyObject = GetObject("C:DRAWINGSSAMPLE.DRW", _
"FIGMENT.DRAWING")
В этом примере FIGMENT является названием графического редактора, а DRAWING — именем поддерживаемого им типа объекта.
Если объект активирован, он указывается в коде с помощью определенной вами объектной переменной. В предыдущем примере доступ к свойствам и методам нового объекта осуществлялся с помощью объектной переменной MyObject. Например:
MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:DRAWINGSSAMPLE.DRW"
Примечание: Используйте функцию GetObject, когда существует текущий экземпляр объекта или требуется создать объект с помощью уже загруженного файла. Если текущего экземпляра нет и вам не требуется объект, созданный с помощью загруженного файла, используйте функцию CreateObject.
Если объект зарегистрировал себя как объект типа «единственный экземпляр», создается только один экземпляр этого объекта независимо от того, сколько раз выполнялась функция CreateObject. При случае с объектом с одним экземпляром GetObject всегда возвращает один и тот же экземпляр, если он вызывается с нулевой строкой («»), и вызывает ошибку, если аргумент путь опущен. Получить ссылку на занятие, созданное с помощью Visual Basic, с помощью GetObject нельзя.
Пример
В этом примере функция GetObject применяется для получения ссылки на определенный лист Microsoft Office Excel 2007 (MyXL). Она использует свойство Application листа, чтобы сделать видимым Excel, закрыть его и т. п. Используя два вызова API, процедура DetectExcel Sub осуществляет поиск Excel и, если он выполняется, вводит его в текущую таблицу объектов. Первый вызов функции GetObject приводит к возникновению ошибки, если Microsoft Excel не выполняется. В этом примере ошибка приводит к заданию для флага ExcelWasNotRunning значения True. Второй вызов GetObject задает открытие файла. Если Excel еще не выполняется, второй вызов запускает его и возвращает ссылку на лист, представленный указанным файлом (mytest.xls). Файл должен существовать в указанном расположении; в противном случае генерируется ошибка автоматизации Visual Basic. Далее пример кода делает видимым и Excel, и окно, содержащее указанный лист. Наконец, если Excel не был изначально запущен, в коде используется метод Quit объекта Application для закрытия Excel. Если приложение уже выполнялось, попытка закрыть его не предпринимается. Сама ссылка освобождается посредством присвоения ей значения Nothing.
' Declare necessary API routines:
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 ' Variable to hold reference
' to Microsoft Excel.
Dim ExcelWasNotRunning As Boolean ' Flag for final release.
' Test to see if there is a copy of Microsoft Excel already running.
On Error Resume Next ' Defer error trapping.
' GetObject function called without the first argument returns a
' reference to an instance of the application. If the application isn't
' running, an error occurs.
Set MyXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then ExcelWasNotRunning = True
Err.Clear ' Clear Err object in case error occurred.
' Check for Microsoft Excel. If Microsoft Excel is running,
' enter it into the Running Object table.
DetectExcel
' Set the object variable to reference the file you want to see.
Set MyXL = GetObject("c:vb4MYTEST.XLS")
' Show Microsoft Excel through its Application property. Then
' show the actual window containing the file using the Windows
' collection of the MyXL object reference.
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
Do manipulations of your file here.
' ...
' If this copy of Microsoft Excel was not running when you
' started, close it using the Application property's Quit method.
' Note that when you try to quit Microsoft Excel, the
' title bar blinks and a message is displayed asking if you
' want to save any loaded files.
If ExcelWasNotRunning = True Then
MyXL.Application.Quit
End IF
Set MyXL = Nothing ' Release reference to the
' application and spreadsheet.
End Sub
Sub DetectExcel()
' Procedure dectects a running Excel and registers it.
Const WM_USER = 1024
Dim hWnd As Long
' If Excel is running this API call returns its handle.
hWnd = FindWindow("XLMAIN", 0)
If hWnd = 0 Then ' 0 means Excel not running.
Exit Sub
Else
' Excel is running so use the SendMessage API
' function to enter it in the Running Object Table.
SendMessage hWnd, WM_USER + 18, 0, 0
End If
End Sub
Нужна дополнительная помощь?
GetObject([Pathname] [Class])
Возвращает ссылку на объект, обеспечиваемый компонентом ActiveX
Параметры
Функция содержит именованные аргументы
Pathname | Необязательный аргумент-значение типа Variant(String). Полная спецификация пути и имя файла, содержащего отыскиваемый объект. В случае, если аргумент опущен, параметр Class является обязательным |
Class | Необязательный аргумент-значение типа Variant(String).Строка, отражающая класс объекта |
Параметр Class имеет синтаксис appname.objecttype, в котором присутствуют следующие элементы:
Appname | Обязательный. Значение типа Variant(String). Имя приложения, предоставляющего объект |
ObjectType | Обязательный. Значение типа Variant(String). Tип или класс создаваемого объекта |
Примечания
Функция GetObject применяется для доступа в объекту ActiveX, находящемуся в файле, и для присваивания этого объекта объектной переменной. Для присваивания объекта, возвращенного функцией GetObject, объектной переменной используется оператор Set. Например:
Dim CADObject As Object
Set CADObject = GetObject("C:CADSCHEMA.CAD")
При исполнении данного кода производится запуск приложения, указанного параметром pathname, и активизация объекта в заданном файле.
Если значением параметра pathname является пустая строка («»), функция GetObject возвращает новый экземпляр объекта заданного типа. В случае, если параметр pathname опущен, функция GetObject возвращает активный в данный момент объект заданного типа. Если объекта указанного типа не существует, возникает ошибка.
Ряд приложений допускают активизацию части файла. Для этого нужно добавить после имени файла восклицательный знак (!) и поместить вслед за ним строку, задающую ту часть файла, которую требуется активизировать. Дополнительные сведения относительно составления такой строки смотрите в документации на то приложение, которое создает объект.
К примеру, в графическом приложении может присутствовать несколько уровней рисования, хранящихся в файле. Для активизации уровня под названием SCHEMA.CAD
можно воспользоваться следующим кодом:
Set LayerObject = GetObject("C:CADSCHEMA.CAD!Layer3")
В тех случаях, когда не указан класс объекта (параметр class), автоматизация (Automation) находит приложение, которое нужно запустить, на основе заданного имени файла. Однако ряд файлов могут поддерживать несколько классов объектов. Например, приложение для рисования может поддерживать три различных типа объектов: объект Application, объект Drawing и объект Toolbar, которые являются частью одного файла. Для указания требуемого объекта нужно указать необязательный параметр class. Например:
Dim MyObject As Object
Set MyObject = GetObject("C:DRAWINGSSAMPLE.DRW", "FIGMENT.DRAWING")
В приведенном примере FIGMENT
– это имя графического приложения, а DRAWING
– один из поддерживаемых этим приложением типов объектов.
После активизации объекта, производится ссылка на него в коде с использованием определенной объектной переменной,. В предыдущем примере доступ к свойствам и методам нового объекта осуществляется с помощью объектной переменной MyObject
. Например:
MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:DRAWINGSSAMPLE.DRW"
Замечание Функцию GetObject полезно использовать в тех случаях, когда уже имеется текущий экземпляр объекта, или при необходимости создать объект из уже загруженного файла. Если же текущий экземпляр объекта отсутствует и нежелательно запускать объект из загруженного файла, применяется функция CreateObject.
Если объект производит само регистрацию в качестве объекта с единственным экземпляром, то, независимо от числа обращений к функции CreateObject, будет создан только один экземпляр такого объекта. В случае наличия только одного экземпляра объекта, функция GetObject, при ее вызове с использованием синтаксиса с указанием пустой строки («»), всегда возвращает один и тот же экземпляр, а при отсутствии параметра pathname возникает ошибка. Функцию GetObject можно применять для получения ссылки на класс, созданный в Visual Basic.
Пример
'Пример использования функции GetObject
' В данном примере функция GetObject создает ссылку
' на конкретный лист (MyXL) в Microsoft Excel.
' Для того, чтобы сделать Microsoft Excel видимым,
'закрыть его и т. д., используется свойство
' Application рабочего листа.
' С помощью двух вызовов API процедура
' Sub DetectExcel ищет Microsoft Excel и,
' если он выполняется, вводит его в таблицу выполняемых
' объектов (Running Object Table).
' Первый вызов GetObject приводит к ошибке,
' если Microsoft Excel еще не запущен.
' В этой программе ошибка приводит к установке значения True для флага ExcelWasNotRunning.
' Второй вызов GetObject указывает открываемый
' файл. Если Microsoft Excel не был запущен, то в
' результате второго вызова функции это приложение
' запускается, при этом возвращается ссылка на лист,
' соответствующий указанному файлу. Файл mytest.xls
' должен существовать в указанном каталоге; в противном ' случае возникает ошибка Visual Basic «Automation error»
' (Ошибка автоматизации). Далее в программе делаются
' видимыми окно Microsoft Excel и окно, содержащее
' указанный лист. И наконец, если Microsoft Excel
' не выполнялся при запуске этой программы,
' метод Quit объекта Application
' закрывает Microsoft Excel. Если это приложение
' выполнялось до запуска данной программы, попытка
' закрыть его не предпринимается. Ссылка на лист
' освобождается путем установки ее значения в Nothing
' Описываем необходимые процедуры 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 ' Очищаем объект Err на случай ошибки.
' Проверка Microsoft Excel. Если Microsoft Excel выполняется,
' он вводится в таблицу выполняемых объектов (Running Object table)
DetectExcel
' Задаем в объектной переменной ссылку на открываемый файл
Set MyXL = Getobject("c:vb4MYTEST.XLS")
' Делаем видимым Microsoft Excel с помощью его свойства Application.
' Делаем видимым окно, содержащее файл, с помощью
' коллекции Windows, задаваемой объектной ссылкой MyXL
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
Do manipulations of your file here.
' ...
' Если этот экземпляр Microsoft Excel не выполнялся при запуске данной
' программы, закрываем его с помощью метода Quit свойства Application.
' Отметим, что при попытке выхода из 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 выполняется, поэтому используйте
функцию API SendMessage, чтобы ввести его в таблицу выполняемых объектов (Running Object Table)
SendMessage hWnd, WM_USER + 18, 0, 0
End If
End Sub
Категория
Функции работы с объектами
Private Sub Кнопка0_Click()
Dim objExcel As Object
Dim objWorkbook As Object
Dim strFileName As String
On Error Resume Next
strFileName = "D:List.xlsx"'тут уж придумай сам откуда брать путь
If Len(Dir$(strFileName)) = 0 Then MsgBox "Нет Файла!": Exit Sub
Set objExcel = GetObject(, "Excel.Application") 'получаем объект, если он открыт (Excel запущен уже)
If objExcel Is Nothing Then 'не получили (не запущен)
Err.Clear 'очищаем от ошибки
Set objExcel = CreateObject("Excel.Application") 'создаём объект (запускаем Excel)
If objExcel Is Nothing Then Err.Clear: MsgBox "Не установлен MS Excel!", vbCritical, "Ошибка": Exit Sub 'без комментариев
End If
With objExcel
.DisplayAlerts = False
' .ActivateMicrosoftApp 4& 'xlMicrosoftAccess = 4'это, если нужно переключиться на окно Access
Set objWorkbook = .Workbooks.Item(Mid(strFileName, InStrRev(strFileName, "") + 1)).Windows(1)
If objWorkbook Is Nothing Then 'не получили, книга не открыта
Err.Clear 'очищаем от ошибки
Set objWorkbook = .Workbooks.Open(strFileName, 0) '0 - ссылки не обновляем при открытии
objWorkbook.UpdateLink objWorkbook.LinkSources
If Err.Number = 1004 Then 'не нашли файлы для обновления ссылок
Err.Clear 'очищаем от ошибки
If MsgBox("Обновить ссылки?", vbQuestion Or vbYesNo) = vbYes Then
Excel_UpdateLinks objWorkbook
Else
MsgBox "Внимание!" & vbNewLine & "Ссылки в книге """ & _
Mid(strFileName, InStrRev(strFileName, "") + 1) & """ не обновлены!", vbInformation, "Обновление ссылок"
End If
ElseIf Err Then
MsgBox "Ошибка: " & Err.Number & vbNewLine & Err.Description, vbCritical, "Обновление ссылок"
Err.Clear 'очищаем от ошибки
Exit Sub 'Вообще надо посмотреть, что за ошибка, попробовать обработать...
End If
With objWorkbook
.Visible = True
.Activate
End With
End If
.Visible = True
If Not .UserControl Then .UserControl = True
If .Windows.Count > 0 Then .Windows(.Windows.Count).Activate
Call SetForegroundWindow(.hWnd) 'это, если нужно лицезреть Excel
End With
Set objWorkbook = Nothing
Set objExcel = Nothing
End Sub
Private Function Excel_UpdateLinks(objWorkbook As Object) As Boolean
Dim arrLinks As Variant
Dim i As Long, lngRetVal As Long
Dim strFileName As String
Dim dlgOpenFile As Object 'FileDialog
arrLinks = objWorkbook.LinkSources(1&) 'xlExcelLinks=1
If Not IsEmpty(arrLinks) Then
If IsArray(arrLinks) Then
For i = 1 To UBound(arrLinks)
If Len(Dir$(arrLinks(i))) = 0 Then
lngRetVal = MsgBox("Не нашли файл по ссылке " & """" & arrLinks(i) & """" & vbNewLine & _
"Искать бум?", vbQuestion Or vbYesNo, "Обновление ссылок")
If lngRetVal = vbYes Then
strFileName = arrLinks(i) 'получаем ссылку (путь) на файл
If Len(Dir$(strFileName)) = 0 Then 'проверяем на существование (если нет файла, то идём к циклу)
Do While Len(Dir$(strFileName, vbDirectory)) = 0 'ищем путь (папку)
strFileName = Left$(strFileName, InStrRev(strFileName, "") - 1)
If InStr(1, strFileName, "") = 0 Then strFileName = CurDir: Exit Do 'если не нашли папку, получим текущий каталог
Loop
End If
Set dlgOpenFile = Application.FileDialog(3&) 'msoFileDialogFilePicker
With dlgOpenFile
.InitialFileName = strFileName
.AllowMultiSelect = False
.Title = "Укажите файл для восстановления ссылки"
If .Show = -1 Then
objWorkbook.ChangeLink arrLinks(i), .SelectedItems(1), 1& 'xlExcelLinks
Else
MsgBox "Не указано новое положение файла для восстановления ссылки!" & vbNewLine & _
"Ссылки не будут обновлены.", vbInformation, "Обновление ссылок"
Erase arrLinks
Exit Function
End If
End With
strFileName = ""
Else
MsgBox "Не указано новое положение файла для восстановления ссылки!" & vbNewLine & _
"Ссылки не будут обновлены.", vbInformation, "Обновление ссылок"
Erase arrLinks
Exit Function
End If
End If
Next i
objWorkbook.UpdateLink objWorkbook.LinkSources 'обновим ссылки в книге
Erase arrLinks
End If
End If
Excel_UpdateLinks = True
Set dlgOpenFile = Nothing
End Function
I use the following to check if two instances are running, and display a message. It could be altered to close other instance… This may be of help… I need code to return a specific instance, and return for use similar to GetObject(,»Excel.Application»)… I don’t think it possible though
If checkIfExcelRunningMoreThanOneInstance() Then Exit Function
In module (some of the declarations are possible used for other code):
Const MaxNumberOfWindows = 10
Const HWND_TOPMOST = -1
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Global ret As Integer
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function GetParent 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
Private Const VK_CAPITAL = &H14
Private Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As Integer
Private Declare Function OpenProcess Lib "kernel32" ( _
ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long
Private Declare Function EnumProcesses Lib "PSAPI.DLL" ( _
lpidProcess As Long, ByVal cb As Long, cbNeeded As Long) As Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" ( _
ByVal hProcess As Long, lphModule As Long, ByVal cb As Long, lpcbNeeded As Long) As Long
Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" ( _
ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400
Global ExcelWindowName$ 'Used to switch back to later
Function checkIfExcelRunningMoreThanOneInstance()
'Check instance it is 1, else ask user to reboot excel, return TRUE to abort
ExcelWindowName = excel.Application.Caption 'Used to switch back to window later
If countProcessRunning("excel.exe") > 1 Then
Dim t$
t = "Two copies of 'Excel.exe' are running, which may stop in cell searching from working!" & vbCrLf & vbCrLf & "Please close all copies of Excel." & vbCrLf & _
" (1 Then press Alt+Ctrl+Del to go to task manager." & vbCrLf & _
" (2 Search the processes running to find 'Excel.exe'" & vbCrLf & _
" (3 Select it and press [End Task] button." & vbCrLf & _
" (4 Then reopen and use PostTrans"
MsgBox t, vbCritical, ApplicationName
End If
End Function
Private Function countProcessRunning(ByVal sProcess As String) As Long
Const MAX_PATH As Long = 260
Dim lProcesses() As Long, lModules() As Long, N As Long, lRet As Long, hProcess As Long
Dim sName As String
countProcessRunning = 0
sProcess = UCase$(sProcess)
ReDim lProcesses(1023) As Long
If EnumProcesses(lProcesses(0), 1024 * 4, lRet) Then
For N = 0 To (lRet 4) - 1
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcesses(N))
If hProcess Then
ReDim lModules(1023)
If EnumProcessModules(hProcess, lModules(0), 1024 * 4, lRet) Then
sName = String$(MAX_PATH, vbNullChar)
GetModuleBaseName hProcess, lModules(0), sName, MAX_PATH
sName = Left$(sName, InStr(sName, vbNullChar) - 1)
If Len(sName) = Len(sProcess) Then
If sProcess = UCase$(sName) Then
countProcessRunning = countProcessRunning + 1
End If
End If
End If
End If
CloseHandle hProcess
Next N
End If
End Function
The I found:
Dim xlApp As Excel.Application
Set xlApp = GetObject("ExampleBook.xlsx").Application
Which gets the object if you know the name of the sheet currently active in Excel instance. I guess this could be got from the application title using the first bit of code. In my app I do know the filename.
Excel VBA GETOBJECT Function
We can use the GetObject function in VBA in MS Excel to access an ActiveX object from the Excel file and then assign the object to an object variable. To use OLE (Object Linking and Embedding) or COM (Compound Object Module) technology to control any Microsoft application like MS Word, MS Outlook, MS PowerPoint, Internet Explorer, etc., we can use the VBA GETOBJECT function.
We use the CreateObject function to create the object, and the GETOBJECT function returns the reference to the object.
Table of contents
- Excel VBA GETOBJECT Function
- Syntax for GETOBJECT Function
- Example of Excel VBA GETOBJECT Function
- Things to Remember
- Recommended Articles
You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA GetObject (wallstreetmojo.com)
Syntax for GETOBJECT Function
The GETOBJECT function has these named arguments:
- Pathname: We need to specify the full path and the file name containing the object to retrieve. It is an optional argument. Both arguments in the GetObject function are optional, but if ‘pathname’ omits, the second argument, ‘class’, is required.
- Class: This is also an optional argument, as specified earlier also. It accepts a string representing the class of the object.
We use the syntax ‘appname.objecttype’ to specify the ‘class’ argument.
- Appname: We need to specify the application name to provide the object.
- Object type: We specify the type of class of object to create.
Example of Excel VBA GETOBJECT Function
You can download this VBA GetObject Template here – VBA GetObject Template
Suppose we have a word document containing 3 tables.
We want to write a VBA codeVBA code refers to a set of instructions written by the user in the Visual Basic Applications programming language on a Visual Basic Editor (VBE) to perform a specific task.read more that will import all the tables in the document to the Excel sheet. We will need to use the CreateObjectCreateObject, as the name implies, is a function that will create the aforementioned object from Excel VBA. When you create an object using the CreateObject function, it is referred to as late binding.read more and GetObject functions in VBA to do the same.
Steps would be:
- Create an Excel file and save the file with the .xlsm excel extensionExcel extensions represent the file format. It helps the user to save different types of excel files in various formats. For instance, .xlsx is used for simple data, and XLSM is used to store the VBA code.read more (Excel Macro-Enabled Workbook) as we will need to run the VBA code (a macro).
- Open the basic visual editor with a shortcut key (Alt+F11) or use the ‘Visual Basic’ command in the ‘Code’ group in the Developer tab in excelEnabling the developer tab in excel can help the user perform various functions for VBA, Macros and Add-ins like importing and exporting XML, designing forms, etc. This tab is disabled by default on excel; thus, the user needs to enable it first from the options menu.read more.
- Double click on ‘ThisWorkbook’ on the left side of the VBA editorVBA ThisWorkbook refers to the workbook on which the users currently write the code to execute all of the tasks in the current workbook. In this, it doesn’t matter which workbook is active and only requires the reference to the workbook, where the users write the code.read more and choose ‘Workbook’ from the list shown on the screen’s top.
- Choose ‘Open’ from the list.
- Now, we need to write the code in between these two lines.
- First, we will declare variables to hold the objects (MS Word Document and MS Word Application object) and a ‘String Variable’ to hold the document’s name from where we need to extract the tables.
- For error handling, we will add one statement. This statement tells the VBA program to ignore the error and resume the execution with the next line of code. “On Error Resume NextVBA On Error Resume Statement is an error-handling aspect used for ignoring the code line because of which the error occurred and continuing with the next line right after the code line with the error.read more” statement does not fix the runtime errors, but it simply means that program execution will continue from the line following the line that caused the error.
- Now we will use the GetObject function to access the current instance of the Word Application Object.
- If there is no current MS Word application instance, or the ActiveX component cannot create an object or return reference to this object, then error 429. For this, we will add two lines in the code. After handling the error, we need to create an instance of the MS Word Application object using the CreateObject function.
- To make the MS Word Application visible, we will change the visible property of the ‘WdApp’ object to TRUE.
- We need to find the location and file name of the word document from which we want to import the tables into an excel sheet and assign the same to the “strDocName” To find the name and location, we can check out the properties of the file.
To open the ‘Properties’ dialog box, select the file and press ‘Alt+Enter.’
- If the file does not exist in the specified location, the code returns the message stating, “The file Marks Details was not found in the folder path.” The title would be “Sorry, that document name does not exist.”
- Now we need to activate the MS Word Application and assign the variable ‘wddoc’ with the word document having the file name stored in the ‘strDocName.’
- If the file is not open, we need to open the document and activate the app.
- After activating the word document, we need to access the tables in the document. To do the same, we will create some variables.
Tble is the integer variable that will store the count of tables in the document.
rowWd is the long variable that will store the number of rows in a table.
colWd is the long variable, storing the number of columns in a particular table.
- We need to count the number of tables in the document, and if they are notable in the document, then we will display a message box to the user that says “No Tables found in the Word document.”
- We will run a ‘For’ VBA loopAll programming languages make use of the VBA For Next loop. After the FOR statement, there is a criterion in this loop, and the code loops until the criteria are reached. read more for several tables to access tables in the document and write the content in the Excel sheet. Within this VBA loopA VBA loop in excel is an instruction to run a code or repeat an action multiple times.read more, we will run nested ‘for’ loops for accessing every row and every column in the row.
- As we do not want to save the document and quit the application, we should also release the system’s memory. To do the same, we will write the following code.
Now, whenever we open the excel file, the file is updated with table content from the word document.
Code:
Private Sub Workbook_Open() Rem Declaring Object variables to access object created by GETOBJECT Dim WdApp As Object, wddoc As Object Rem Declaring a string variable to access the Word document Dim strDocName As String Rem Error handling On Error Resume NextVBA On Error Resume Statement is an error-handling aspect used for ignoring the code line because of which the error occurred and continuing with the next line right after the code line with the error.read more Rem Activating MS Word if it is already opened Set WdApp = GetObject(, "Word.Application") If Err.Number = 429 Then Err.Clear Rem Creating a Word application object if MS Word is not already opened Set WdApp = CreateObject("Word.Application") End If WdApp.Visible = True strDocName = "C:UsersCBA7_01DesktopMarks Details.docx" Rem Checking relevant directory for the relevant document Rem If not found then informing the user and closing the program If Dir(strDocName) = "" Then MsgBox "The file " & strDocName & vbCrLf & "was not found in the folder path" & vbCrLf & "C:UsersCBA7_01.", _vbExclamation, "Sorry, that document name does not exist." Exit Sub End If WdApp.Activate Set wddoc = WdApp.Documents(strDocName) If wddoc Is Nothing Then Set wddoc = WdApp.Documents.Open("C:UsersCBA7_01DesktopMarks Details.docx") wddoc.Activate Rem Defining variables to access the tables in the word document Dim Tble As Integer Dim rowWd As Long Dim colWd As Integer Dim x As Long, y As Long x = 1 y = 1 With wddoc Tble = wddoc.Tables.Count If Tble = 0 Then MsgBox "No Tables found in the Word document", vbExclamation, "No Tables to Import" Exit Sub End If Rem Starting the looping process to access tables and their rows, columns For i = 1 To Tble With.Tables(i) For rowWd = 1 To .Rows.Count For colWd = 1 To .Columns.Count Cells(x, y) = WorksheetFunction.Clean(.cell(rowWd, colWd).Range.Text) Rem Accessing next column y = y + 1 Next colWd Rem Going to next row and start from column 1 y = 1 x = x + 1 Next rowWd End With Next End With Rem we do not need to save the word document wddoc.Close Savechanges:=False Rem we quit MS Word application WdApp.Quit Rem We finally release system memory allocated for the 2 object variables Set wddoc = Nothing Set WdApp = Nothing End Sub
Things to Remember
- A single-instance object is available for which only one instance of the object generates, regardless of the number for which CreateObject is run. For example, the GetObject function always returns the same instance when called with a string of zero length, and an error comes if it does not mention the ‘pathname’ argument.
- We cannot use GetObject to access a reference to a class created with VBA.
- Suppose there is no active instance of the MS Word Application, or we do not want the object initiated with a file already loaded. In that case, we first use the CreateObject function to create the object and then use the GetObject function to access the object.
Recommended Articles
This article has been a guide to VBA GetObject. Here, we discuss how the GetObject function returns an object’s reference in Excel VBA, practical examples, and a downloadable template. Below you can find some useful Excel VBA articles: –
- VBA IF Not
- VBA INSTRREV
- VBA FileSystemObject
- VBA Option Explicit