StefanoACC ha scritto:
...
O c'è qualcosa di così banale che mi sfugge....o sto diventando pazzo.. non trovo una logica...
Non ho individuato il problema con precisione, quindi sto andando anch'io a tentativi con i suggerimenti. Facciamo finta, per un attimo, che l'installazione di Acrobat Pro 2020 abbia acuito problemi latenti (che ieri mi erano sfuggiti)
Dim appOutlook As New Outlook.Application
...
Set appOutlook = CreateObject("outlook.application")
Questa sintassi ha 2 criticità.
1) l'utilizzo del New in fase di dichiarazione della variabile oggetto
2) l'assegnazione tipica del latebinding in presenza di un tipo già dichiarato nonché di un oggetto già assegnato.
Punto 1 = l'utilizzo del New in fase di dichiarazione della variabile oggetto
Lo trovi anche in esempi ufficiali Microsoft ma in VBA non si deve mai usare. Mai. La spiegazione te la posto pari pari come l'ho trovata, non perché la prenda per buona ad occhi chiusi ma perché non c'è nulla da aggiungere.
Don't Dim .. As New
Dim obj As MyClass
Set obj = New MyClass
Why write 2 lines when you can just say Dim obj As New MyClass?
Never Dim anything As New if you're concerned about speed. VB6 will treat such a variable as an auto-instantiated variable. Every time you use it, VB will check if it should be instantiated. This will cost you some extra CPU cycles.
Fonte: . Lì si parla di Visual Basic ma il concetto vale anche per VBA. Se poi la stessa cosa la trovi scritta in una pietra miliare come "vba developer's handbook" (non ricordo se prima o seconda edizione) c'è bisogno di aggiungere altro? Solo quanto ulteriormente specificato proprio in quest'ultimo: l'unico motivo per usare il New già in dichiarazione è per avere sempre a disposizione nella finestra immediata quell'oggetto pronto all'uso ma è evidente che si sta parlando di situazioni di sviluppo/debug, non di codice da distribuire.
Il tutto si risolve dividendo in 2 quella riga
Dim appOutlook As Outlook.Application
Set appOutlook = New Outlook.Application
Fatto questo il punto 2 non ha nemmeno bisogno di essere analizzato perché sparisce la necessità di un'ulteriore assegnazione: hai già fatto il Set. Potrai quindi eliminare la riga
Set appOutlook = CreateObject("outlook.application")
Prova così e guarda se la situazione migliora.
Ti sembra di aver letto che il punto 2 non ha nemmeno bisogno di trattazione, vero? L'hai letto, sì, ma non era quello che intedevo fare. Perché se i punti sono 2 bisogna trattarli entrambi.
Punto 2 = l'assegnazione tipica del latebinding in presenza di un tipo già dichiarato nonché di un oggetto già assegnato.
Stai mescolando earlybinding e latebinding. E qui permettetimi tutti una piccola divagazione perché questo argomento mi porta inevitabilmente a Gibra che in piena estate 2013 si è preso il disturbo di intervenire in un thread su MasterDrive per spiegare ben bene la cosa dopo che io avevo scritto uno strafalcione (tra l'altro immediatamente corretto da @Alex). Divagazione chiusa, nel senso che sul suo sito è ancora disponibile una comparazione dell'uso dell'earlybinding e del latebinding (seppur in vb.net) che fa sempre comodo vedere a confronto e conoscere, per sfruttare la compilazione condizionale anche in VBA.
http://nuke.vbcorner.net/Projects/NET/VS2010EarlyLateBindinginVBNETExcel/tabid/111/language/en-US/Default.aspx
http://nuke.vbcorner.net/Projects/NET/VS2008EarlyLatebindinginVBNETWord/tabid/115/language/en-US/Default.aspx
Earlybinding
Dim appOutlook As Outlook.Application
Set appOutlook = New Outlook.Application
Latebinding
Dim appOutlook As Object
Set appOutlook = CreateObject("Outlook.Application")
con la possibilità variante sul secondo, con GetObject e l'uso accorto della gestione degli errori, per "agganciarsi" ad un'istanza di Outlook già aperta, questione sulla quale però devo riservarmi di riflettere bene, ho ricordi contrastanti in questo momento.
In ogni caso, vai di Earlybinding puro, per ora, e guarda se il problema continua a presentarsi.
Per il latebinding (da preferirsi in distribuzione) dedichiamo eventualmente qualche post ulteriore.