VBA
CreateObject vs. GetObject
Поиск…
замечания
В своем простейшем случае CreateObject
создает экземпляр объекта, тогда как GetObject
получает существующий экземпляр объекта. Определение того, может ли объект быть создан или получен, будет зависеть от его свойства Instancing . Некоторые объекты SingleUse (например, WMI) и не могут быть созданы, если они уже существуют. Другие объекты (например, Excel) - это MultiUse и позволяют запускать сразу несколько экземпляров. Если экземпляр объекта еще не существует и вы GetObject
, вы получите следующее сообщение Run-time error '429': ActiveX component can't create object
.
GetObject требует наличия хотя бы одного из этих двух необязательных параметров:
- Pathname - Variant (String): полный путь, включая имя файла, файла, содержащего объект. Этот параметр является необязательным, но Class требуется, если Pathname опущено.
- Class - Variant (String): Строка, представляющая формальное определение (Application и ObjectType) объекта. Класс требуется, если Pathname опущен.
CreateObject имеет один обязательный параметр и один необязательный параметр:
- Class - Variant (String): Строка, представляющая формальное определение (Application и ObjectType) объекта. Класс является обязательным параметром.
- Servername - Variant (String): имя удаленного компьютера, на котором будет создан объект. Если этот параметр опущен, объект будет создан на локальном компьютере.
Класс всегда состоит из двух частей в виде Application.ObjectType
:
- Приложение - имя приложения, частью которого является объект. |
- Тип объекта - тип создаваемого объекта. |
Некоторые примеры классов:
- Word.Application
- Лист Excel
- Scripting.FileSystemObject
Демонстрация GetObject и CreateObject
Возвращает ссылку на объект, предоставленный компонентом ActiveX.
Используйте функцию GetObject, когда есть текущий экземпляр объекта, или если вы хотите создать объект с уже загруженным файлом. Если текущий экземпляр отсутствует, и вы не хотите, чтобы объект запускался с загруженным файлом, используйте функцию CreateObject.
Sub CreateVSGet()
Dim ThisXLApp As Excel.Application 'An example of early binding
Dim AnotherXLApp As Object 'An example of late binding
Dim ThisNewWB As Workbook
Dim AnotherNewWB As Workbook
Dim wb As Workbook
'Get this instance of Excel
Set ThisXLApp = GetObject(ThisWorkbook.Name).Application
'Create another instance of Excel
Set AnotherXLApp = CreateObject("Excel.Application")
'Make the 2nd instance visible
AnotherXLApp.Visible = True
'Add a workbook to the 2nd instance
Set AnotherNewWB = AnotherXLApp.Workbooks.Add
'Add a sheet to the 2nd instance
AnotherNewWB.Sheets.Add
'You should now have 2 instances of Excel open
'The 1st instance has 1 workbook: Book1
'The 2nd instance has 1 workbook: Book2
'Lets add another workbook to our 1st instance
Set ThisNewWB = ThisXLApp.Workbooks.Add
'Now loop through the workbooks and show their names
For Each wb In ThisXLApp.Workbooks
Debug.Print wb.Name
Next
'Now the 1st instance has 2 workbooks: Book1 and Book3
'If you close the first instance of Excel,
'Book1 and Book3 will close, but book2 will still be open
End Sub