Automazione word in funzioni separate

di il
3 risposte

Automazione word in funzioni separate

Ciao a tutti.

Per il lavoro utilizzo molto le automazioni word per generare documenti da access.

Ultimamente mi sto trovando nella necessità di dover fare delle variazioni ad uno stesso modello di documento word; ad esempio, in un certo punto dove fino ad oggi inserivo una tabella, ho necessità invece di inserire in alternativa un elenco puntato.

Pensavo di risolvere utilizzando uno switch e, nella parte di programma relativo, andare a leggere lo stato di quello switch e eseguire 2 codici diversi a seconda del suo stato (con un IF oppure un SELECT); oppure in caso di una terza variante utilizzare un controllo opzioni e valutare quello, etc…, ma sempre rimanendo all'interno dello stesso listato.

Però cosi facendo, quel listato diventa lunghissimo e difficoltoso da gestire in caso di correzioni, verifiche etc.

Avevo pensato quindi di creare delle funzioni separate da richiamare in base alle opzioni, però ho 2 dubbi:

  • il primo è che se richiamo la funzione, in cui è presente la parte di automazione word per fare, ad esempio, l'elenco puntato, verrà eseguita correttamente? La mia perplessità è che se nel listato completo io mi trovo all'interno dell'automazione word (impostazione del documento, apertura del file, compilazione, chiusura e salvataggio del documento compilato) quando “esco” da quel listato perchè richiamo la funzione (per poi tornarci dopo l'esecuzione della funzione), per access non cambia nulla e quindi fa quello che deve fare o rischio qualche blocco perchè sto facendogli eseguire delle istruzioni “campate per aria” non avendo la funzione richiamata le stringhe di gestione di word?

        un esempio stupido: se creo una funzione esterna tipo:

Function Testo01()

appWord.Selection.TypeText "Hello"

End Function

        e la richiamo dal listato principale, word scriverà quel testo nel punto specificatop oppure darà errore?

  • il secondo è se sarò capace di mettere in pratica i vostri suggerimenti / consigli

Grazie a tutti

Andrea

3 Risposte

  • Re: Automazione word in funzioni separate

    Mi comincio a rispondere da solo (alla fine mi sono detto perchè non fai direttamente la prova?).

    se faccio una cosa come descritto sopra, si blocca con relativo errore ( mi riporta appWord come variabile non definita).

    Per cui, no, non funziona (era troppo facile….)

     Quindi è ufficiale: Aiuto! (sempre se si possa fare una cosa simile)

  • Re: Automazione word in funzioni separate

    13/12/2023 - Jocman ha scritto:


    …e richiamo la funzione, in cui è presente la parte di automazione word per fare, ad esempio, l'elenco puntato, verrà eseguita correttamente?

    Prova e già la fase di Compila dovrebbe darti l'idea (ecco, l'hai fatto nel frattempo: qualcosa sai fare da solo se ti impegni)

    Function Testo01()
    
    appWord.Selection.TypeText "Hello"
    
    End Function

    La funzione Testo01 conosce cos'è appWord? Dipende dall'area di validità della variabile/oggetto. Per non ampliare inutilmente lo visibilità della variabile, passala come parametro alla funzione, nel caso specifico si tratta di un oggetto quindi è ByRef. 

    Se in una Funzione/Sub vuoi che siano disponibili variabili/oggetti dichiarati ed usati nel codice chiamante, passi il tutto come parametro.

    Private Sub TuaSub()
    Dim appWord As Word.Application
       ....
       appWord.Selection.TypeText "Hello"
       ...
    End Sub

    può essere spezzata così

    Private Sub TuaSub()
    Dim appWord As Word.Application
       ....
       Call Testo01(appWord)   
       'si può anche chiamare la funzione solo con
       'Testo01 appWord
       'o ancora
       'Testo01 myWordApp:=appWord (quando i parametri sono tanti può far comodo)
       ...
    End Sub
    
    
    Private Function Testo01(ByRef myWordApp as Word.Application)
    
       myWordApp.Selection.TypeText "Hello"
    
    End Function

    Per la chiamata alla funzione ho usato il Call, così si evidenzia meglio, ma si può tranquillamente scrivere direttamente il nome della funzione, premi spazio e si attiva l'intellisense che chiede di inserire un parametro di tipo Word.Application.

    Per non confondere i nomi delle variabili ho usato appWord e myWordApp, in modo che si capisca che nella funzione sto usando myWordApp, non sto usando la variabile appWord che non è accessibile direttamente. Solo passandola come parametro “per riferimento” (ByRef) le due puntano “alla stessa cosa”: appWord e myWordApp, ognuna nella propria funzione/sub, sono la stessa cosa, non sono una la copia dell'altra. 

    Questo esempio è ovviamente senza utilità, non ha senso creare una funzione per una cosa del genere, però serve a far capire che passando appWord alla funzione Testo01, quello stesso oggetto viene poi trattato all'interno della funzione come potresti fare nel codice principale. 

    In generale, se vuoi rendere disponibile una variabile ad una funzione/sub chiamata la passi come parametro. Poi dipende se vuoi che venga gestito come “la stessa cosa dell'originale” e che quindi ogni modifica fatta al parametro sia riportata nella variabile della procedura chiamante o se ti interessa solo averle a disposizione ma della loro eventuale modifica non ti importa più niente. Ma questo è un altro discorso rispetto al quesito principale del thread.

    Definisci sempre se una funzione è Private o Public, non lasciare al modulo in cui si trova scegliere se è implicitamente Private o Public. In caso di copia incolla potresti trovarti brutte sorprese. Nel dubbio sempre validità minima, Private. Solo se serve la dichiari Public.

    13/12/2023 - Jocman ha scritto:

    il secondo è se sarò capace di mettere in pratica i vostri suggerimenti / consigli

    Stendiamo un velo non necessariamente pietoso.

  • Re: Automazione word in funzioni separate

    Grazie delle informazioni Phil

    Credo di aver capito come orientarmi

    Inizierò a fare un pò di prove e vediamo cosa tiro fuori dal cilindro.

    Grazie

    PS: quanto al velo, io lo metterei anche pietoso (anche se non in senso totalmente negativo, dai)

Devi accedere o registrarti per scrivere nel forum
3 risposte