Analyst Cave

Nov 24, 2021

ThisWorkbook si riferisce alla cartella di lavoro in cui viene eseguito il codice Excel VBA. ActiveWorkbook d’altra parte si riferisce alla cartella di lavoro di Excel che attualmente ha il focus, cioè è la finestra di Excel di fronte.

Spesso gli sviluppatori di Excel VBA mescolano questi due tipi comuni di cartelle di lavoro in VBA. Il problema inizia a sorgere quando si lavora in più cartelle di lavoro Excel allo stesso tempo e per caso si esegue una macro da una cartella di lavoro mentre un’altra cartella di lavoro Excel è attualmente attiva. Questo può avere effetti disastrosi se si utilizzano direttamente le proprietà VBA Range o VBA Cell.

In questo articolo vorrei spiegare la differenza tra gli oggetti Excel VBA ActiveWorkbook e ThisWorkbook.

ActiveWorkbook

L’ActiveWorkbook non è solo la cartella di lavoro visibile, come molti pensano, perché è possibile avere anche più cartelle di lavoro aperte e affiancate. Tuttavia, solo una cartella di lavoro Excel è considerata attiva in qualsiasi momento. Essere attivo è una proprietà superiore – solo la cartella di lavoro la cui finestra è attualmente selezionata è considerata attiva. Vedi sotto per una definizione precisa

Application.ActiveWorkbook o ActiveWorkbook in Excel VBA:
Ritorna l’oggetto Workbook che rappresenta la cartella di lavoro nella finestra attiva (la finestra in alto). La proprietà non restituirà nulla se la finestra Info o la finestra Appunti è la finestra attiva.

Esempio di Excel VBA ActiveWorkbook

'Returns the name of the Active Workbook in Excel VBADebug.Print ActiveWorkbook.Name'Get Sheet1 from the Active WorkbookActiveWorkbook.Sheets("Sheet1")

ThisWorkbook

La proprietà ThisWorkbook è molto più facile da capire poiché fa semplicemente riferimento alla cartella di lavoro Excel in cui viene eseguito il codice VBA. Per la definizione completa vedi sotto:

Application.ThisWorkbook o ThisWorkbook in Excel VBA:
Ritorna l’oggetto Workbook che rappresenta la cartella di lavoro in cui è in esecuzione il codice macro VBA corrente.

Esempio di Excel VBA ThisWorkbook

'Returns the name of the Workbook which is executing this MacroDebug.Print ActiveWorkbook.Name'Get Sheet1 from the Workbook executing this MacroActiveWorkbook.Sheets("Sheet1")

ActiveWorkbook vs ThisWorkbook

Se sei ancora confuso sulla differenza tra queste due proprietà vedi sotto:

A sinistra la cartella di lavoro Excel è visibile ed è l’applicazione principale. In questo caso se si esegue una macro in questa cartella di lavoro la proprietà ActiveWorkbook è la stessa di ThisWorkbook.

A destra la cartella di lavoro Excel non è visibile o non è l’applicazione principale. In questo caso se esegui una macro in questo Workbook la proprietà ActiveWorkbook rappresenta il Workbook a sinistra, e ThisWorkbook rappresenta il Workbook a destra.

Spero che ora sia chiaro!

Conclusioni

Ora che puoi distinguere tra queste due proprietà è importante tenere un paio di cose in mente:

  • Su base giornaliera usa ThisWorkbook invece del più errato ActiveWorkbook, quando ti aspetti che il tuo codice venga eseguito sullo stesso Workbook su cui stai lavorando
  • Usa ActiveWorkbook con attenzione, essendo una proprietà in alto potrebbe non sempre restituire una proprietà se sono coinvolte altre finestre pop-up Excel. Anche se potresti aver bisogno della proprietà ActiveWorkbook quando lavori con Excel AddIns (che eseguono il codice sulla cartella di lavoro attiva, non sul tuo AddIn)

.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.