Ciao a tutti.
Mi è stato chiesto di poter stampare dei modelli di documento in word prendendo dati da un DB access (fatto da me).
In genere riesco a far interagire access e word, ma adesso devo pensare un po’ fuori dal mio standard.
In genere io o compilo documenti word che poi devo salvare e conservare, oppure documenti da stampare al volo e “dimenticare”.
Nel primo caso, faccio in modo di aprire il modello, compilarlo e salvarlo nella cartella di destinazione, dove poi lo avrò disponibile.
Nel secondo caso, apro il modello, lo compilo, lo visualizzo a schermo (se dovessi fare qualche variazione), lo stampo e poi lo chiudo senza salvare (così da non rovinare il modello).
Adesso, però, la cosa non sarà sotto il mio controllo, e quindi devo evitare “danni”, soprattutto al modello word.
Il problema ha 3 variabili
1) Parte dati: si tratterà o di stampare un singolo record, o un gruppo selezionato (in entrambe i casi la medesima tabella di origine).
2) Problema di stampa A: la soluzione è la stampa diretta (apro il modello, lo compilo, lo stampo, lo chiudo senza salvare, tutto in background); l’utente si limiterà a premere il pulsante e andare a prendere il foglio alla stampante. Così, non dovrebbe rovinare in nessun modo il modello word.
3) Problema di stampa B: la stampa dovrà essere fronte/retro.
L’interazione word la gestisco, schematicamente, in questo modo:
Dim Sourcefile As String
Dim Destinationfile As String
Dim appWord As Word.Application
Dim doc As Word.Document
On Error Resume Next
Err.Clear
Set appWord = GetObject(, "Word.Application")
If Err.Number <> 0 Then
Set appWord = New Word.Application
End If
Set doc = appWord.Documents.Open(Sourcefile, , False)
With appWord
.Visible = False
With doc
INSERIRE QUI TUTTO CIO’ CHE VA SCRITTO NEL FILE WORD
End With
.ActiveDocument.Application.Options.PrintBackground = False
.ActiveDocument.Application.PrintOut , Range:=wdPrintAllDocument, ManualDuplexPrint:=False
.DisplayAlerts = wdAlertsNone
.Quit False
End With
Set doc = Nothing
Set appWord = Nothing
In questo modo la stampa del singolo record funziona (tranne per un aspetto, il fronte/retro, ma lo rimando a dopo)
Per stampare, invece, un numero multiplo di record, faccio in questo modo (sempre schematicamente):
Set Rst = CurrentDb.OpenRecordset("SELECT * FROM tblFDV WHERE [IDPratica]=" & Forms!frmPrincipale!txtIDPratica , dbOpenSnapshot)
With appWord
.Visible = False
With Rst
.MoveFirst
Do Until .EOF
With doc
INSERIRE QUI TUTTO CIO’ CHE VA SCRITTO NEL FILE WORD
End With
.ActiveDocument.Application.Options.PrintBackground = False
.ActiveDocument.Application.PrintOut , Range:=wdPrintAllDocument, ManualDuplexPrint:=False
doc.Close saveChanges:=False
.MoveNext
Loop
End With
.DisplayAlerts = wdAlertsNone
.Quit False
End With
In questo caso, in vece, ottengo un errore relativo alla riga
.ActiveDocument.Application.Options.PrintBackground = False
Ovvero
.ActiveDocument Impossibile trovare il metodo o il membro dei dati
E non so come rimediare; come è strutturato mi sembra corretto, ma a quanto pare non è così. Sembra come se avessi chiuso l'applicativo e quindi ha perso ogni riferimento, ma la chiusura la faccio ben dopo.
E poi rimane il problema del fronte/retro.
La funzione dovrebbe essere in quel riferimento
.ActiveDocument.Application.PrintOut , Range:=wdPrintAllDocument, ManualDuplexPrint:=False
cioè, essendo falso, dovrebbe stampare fronte retro (se “vero” dovrei andare io a girare il foglio, credo).
Eppure nella stampa del singolo record (in quanto la stampa da recordset mi da quell’errore e quindi non ci arrivo a stampare) mi vengono stampate due singole facciate invece che un fronte/retro.
Domande:
- Cosa sbaglio nello strutturare il codice per la stampa di record multipli
- Come fare (se fattibile) per ottenere la stampa fronte/retro o in alternativa come poter procedere
Grazie
Andrea