VBA
CreateObject vs. GetObject
Ricerca…
Osservazioni
Nel modo più semplice, CreateObject
crea un'istanza di un oggetto, mentre GetObject
ottiene un'istanza esistente di un oggetto. Determinare se un oggetto può essere creato o ottenuto dipenderà dalla sua proprietà di Instancing . Alcuni oggetti sono SingleUse (ad esempio, WMI) e non possono essere creati se già esistono. Altri oggetti (ad esempio Excel) sono MultiUse e consentono l'esecuzione di più istanze contemporaneamente. Se un'istanza di un oggetto non esiste già e si tenta GetObject
, si riceverà il seguente messaggio intercettabile: Run-time error '429': ActiveX component can't create object
.
GetObject richiede che almeno uno di questi due parametri opzionali sia presente:
- Pathname - Variant (String): il percorso completo, incluso il nomefile, del file che contiene l'oggetto. Questo parametro è facoltativo, ma è necessario Class se Pathname è omesso.
- Class - Variant (String): stringa che rappresenta la definizione formale (Application e ObjectType) dell'oggetto. La classe è richiesta se Pathname è omesso.
CreateObject ha un parametro obbligatorio e un parametro facoltativo:
- Class - Variant (String): stringa che rappresenta la definizione formale (Application e ObjectType) dell'oggetto. La classe è un parametro richiesto.
- Servername - Variant (String): il nome del computer remoto su cui verrà creato l'oggetto. Se omesso, l'oggetto verrà creato sul computer locale.
La classe è sempre composta da due parti sotto forma di Application.ObjectType
:
- Applicazione : il nome dell'applicazione a cui appartiene l'oggetto. |
- Tipo di oggetto : il tipo di oggetto che si sta creando. |
Alcune classi di esempio sono:
- Word.Application
- Foglio Excel
- Scripting.FileSystemObject
Dimostrazione di GetObject e CreateObject
Restituisce un riferimento a un oggetto fornito da un componente ActiveX.
Utilizzare la funzione GetObject quando è presente un'istanza corrente dell'oggetto o se si desidera creare l'oggetto con un file già caricato. Se non esiste un'istanza corrente e non si desidera che l'oggetto venga avviato con un file caricato, utilizzare la funzione 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