Alternativa ad ActiveDocument per fare riferimento a un nuovo documento da un modello

StackOverflow https://stackoverflow.com//questions/25026969

  •  21-12-2019
  •  | 
  •  

Domanda

Sto utilizzando un modello Word con un modulo utente.L'utente apre il modello per iniziare un nuovo documento e inserisce i dati nel modulo.I dati vengono quindi inseriti nei segnalibri del documento.Sto utilizzando il seguente sottotitolo per inserire i dati nei segnalibri.Le variabili passate al sub sono il nome del segnalibro in cui inserire il testo e il testo da inserire.

Public Sub UpdateBookmark(BookmarkToUpdate As String, ByVal TextToUse As String)
    Dim BMRange As Range
    Set BMRange = ActiveDocument.Bookmarks(BookmarkToUpdate).Range
    BMRange.Text = TextToUse
    ActiveDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub

Funziona bene, tranne per il fatto che in alcuni casi gli utenti passano ad altri documenti Word prima di completare il modulo.Quando lo fanno, l'attenzione viene lasciata sull'altro documento utilizzato e quindi il mio riferimento ad ActiveDocument significa che lo script cerca i segnalibri nell'altro documento invece che nel nuovo documento modello.

Esiste un'alternativa all'utilizzo di ActiveDocument per cercare i segnalibri nel nuovo documento creato dal modello?O in alternativa esiste un modo per dire al mio script di cambiare focus (attivare) il nuovo documento da cui viene eseguito?

Mille grazie per eventuali suggerimenti: ho passato molto tempo a cercare su Google e a sperimentare ma non riesco a trovare una soluzione che funzioni per questo problema specifico (o forse semplicemente non capisco abbastanza del modello a oggetti di Word per capirlo il mio).

È stato utile?

Soluzione

Esistono alcuni modi in cui potresti gestirlo, il più semplice dei quali sarebbe quello di definire l'ambito di una variabile globale/pubblica e assegnarla all'inizio del processo (ovvero, immediatamente prima dell'apertura del Form utente o durante la _Initialize O _Activate procedure dell'evento).

Set myDocument = ActiveDocument
                 'Or alternatively, 
                 ' = Documents.Add(...) etc.

NOTA che una variabile pubblica Public myDocument as Document dovere essere in un normale modulo di codice e non in un modulo di classe o userform.

Quindi nelle procedure del modulo, sostituisci semplicemente ActiveDocument con la variabile:

Public Sub UpdateBookmark(BookmarkToUpdate As String, ByVal TextToUse As String)
    Dim BMRange As Range
    Set BMRange = myDocument.Bookmarks(BookmarkToUpdate).Range
    BMRange.Text = TextToUse
    myDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub

In alternativa puoi definire l'ambito della variabile in modo più ristretto, ma poi dovresti passarlo alle procedure in cui è necessario, come:

Call UpdateBookmark(myDocument, BookmarkToUpdate, TextToUse)

E modificare la procedura:

Public Sub UpdateBookmark(myDocument as Document, BookmarkToUpdate As String, ByVal TextToUse As String)
    Dim BMRange As Range
    Set BMRange = myDocument.Bookmarks(BookmarkToUpdate).Range
    BMRange.Text = TextToUse
    myDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub

Ulteriori letture:

Sebbene si utilizzino esempi tratti da Excel, si applicano gli stessi principi generali per evitare di fare affidamento su Selezione E Attivazione oggetti, quando è possibile fare riferimento ad essi direttamente in modo più efficiente.

Come evitare di utilizzare Seleziona nelle macro VBA di Excel

(Word non è la mia area di competenza e, data la mia esperienza limitata, è più difficile evitare di utilizzare il file Selection oggetto in Word)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top