Interazione word: stampa multi record e fronte / retro

di il
16 risposte

Interazione word: stampa multi record e fronte / retro

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

16 Risposte

  • Re: Interazione word: stampa multi record e fronte / retro

    Jocman ha scritto:


    ...
    - Cosa sbaglio nello strutturare il codice per la stampa di record multipli
    La butto lì: prova a non usare blocchi With - End With nidificati.
    Edit di qualche ora dopo: l'errore di viene dato già in compilazione o solo in esecuzione?
  • Re: Interazione word: stampa multi record e fronte / retro

    Ciao.
    Da prendere con le molle, perché non ho mai fatto una operazione del genere, quindi sicuramente non sarò di aiuto.
    Ma, sei sicuro di averlo aperto?
    E se carichi i dati da stampare in una mayrice e poi stampi la matrice?
    Per il fronte retro,mi sembra che ci sia l opzione specifica nell istruzione di stampa di vba
  • Re: Interazione word: stampa multi record e fronte / retro

    Philcattivocarattere ha scritto:


    La butto lì: prova a non usare blocchi With - End With nidificati.
    Edit di qualche ora dopo: l'errore di viene dato già in compilazione o solo in esecuzione?
    Ma se non nidifico in quel modo, come faccio?
    L'unica differenza che vedo rispetto alla stampa singola è che ho aggiunto la nidificazione del recordset, ma mi serve per muovermi all'interno dello stesso....

    L'errore me lo da in fase di compilazione (a scanso di equivoci - nel senso che mi esprimo male io: quando lancio la funzione mi da quell'errore).

    fratac ha scritto:


    Per il fronte retro,mi sembra che ci sia l opzione specifica nell istruzione di stampa di vba
    Devo studiarmi un pò la cosa....
  • Re: Interazione word: stampa multi record e fronte / retro

    Jocman ha scritto:


    ...
    Ma se non nidifico in quel modo, come faccio?
    ...L'errore me lo da in fase di compilazione (a scanso di equivoci - nel senso che mi esprimo male io: quando lancio la funzione mi da quell'errore).
    Quanta pazienza, quanta pazienza! Scrivendo il membro e proprietà/metodo per intero.
    ...
    appWord.Visible = False
    Rst.MoveFirst
    	Do Until Rst.EOF
    		With doc
    			INSERIRE QUI TUTTO CIO’ CHE VA SCRITTO NEL FILE WORD
    		End With
    	appWord.ActiveDocument.Application.Options.PrintBackground = False
    	appWord.ActiveDocument.Application.PrintOut , Range:=wdPrintAllDocument, ManualDuplexPrint:=False
    	doc.Close saveChanges:=False
          
    	Rst.MoveNext
    	Loop
    appWord.DisplayAlerts = wdAlertsNone
    appWord.Quit False
    Con la tua vecchia formulazione, per controprova, puoi provare a riscrivere nel codice la riga che ti dà problemi. Dovresti accorgerti subito se l'intellisense che si attiva alla pressione del "punto" ti propone proprietà e metodi del recorset (blocco With in cui si trova la riga incriminata) o di appWord (blocco With più esterno).
  • Re: Interazione word: stampa multi record e fronte / retro

    Non so se ho trovato una soluzione o se semplicemente ho aggirato l'ostacolo.....

    Ho spostato tutta la parte di interazione word in una funzione separata, cui passo i valori variabili (per fortuna sono solo 5)

    Poi, nel caso della stampa multipla, apro il recordset e per ogni record lancio la funzione con i relativi valori presi dai campi del recordset.

    In effetti quello che ho fatto è tipo:
    
    With Rst
    
    	.MoveFirst
    	Do Until Rst.EOF
    		
    		Call StampaMultipla (passo le 5 variabili)
    		
    		.MoveNext
    	Loop
    End With
    
    Visto che la cosa funziona come vorrei, devo supporre che facessi qualche casino nella nidificazione con tutti quei With...End With, quindi il suggerimento di Phil ha senso, sicuramente l'Intelli-coso avrebbe rilevato la cosa (allo stato attuale avendo spostato tutto non riesco più a riprodurre l'errore se riscrivessi di nuovo come era prima, perchè di sicuro inconsciamente ci farei forse più caso)

    Adesso devo risolvere la questione fronte/retro...
  • Re: Interazione word: stampa multi record e fronte / retro

    Jocman ha scritto:


    Adesso devo risolvere la questione fronte/retro...
    La rispieghi, per favore, alla luce di quello che hai ottenuto sistemando quell'errore?

    Nel frattempo appunto qui due link che potrebbero venir buoni
    https://web.archive.org/web/20130828212643/http://pubs.logicalexpressions.com/Pub0009/LPMArticle.asp?ID=101
    https://web.archive.org/web/20130915062449/http:/pubs.logicalexpressions.com/Pub0009/LPMArticle.asp?ID=116
  • Re: Interazione word: stampa multi record e fronte / retro

    Philcattivocarattere ha scritto:


    La rispieghi, per favore, alla luce di quello che hai ottenuto sistemando quell'errore?
    Certo, ci mancherebbe pure.

    Tutto quello scritto prima è relativo alla stampa diretta di un modulo in word, che è costituito da 2 pagine fronte/retro.

    Quando lavoro per fatti miei (come detto nel primo post) per i miei documentii (qualunque essi siano) lancio la stampa da word, quindi si apre la finestra di dialogo della stampante e imposto lì il fronte / retro.

    In questo caso, inviando direttamente il file word in stampa (senza quindi che l'utente lo veda aperto o interagisca) devo per forza di cosa impostare la stampa fronte/retro nel codice VBA.

    Cercando in rete (la mia scienza è molto limitata) e legendo post inglesi qua è là, ero risalito a 3 stringhe interessanti:
    
    .ActiveDocument.Application.Options.PrintBackground = False
    .ActiveDocument.Application.PrintOut Copies:=1       
    .ActiveDocument.Application.PrintOut , Range:=wdPrintAllDocument, ManualDuplexPrint:=False
    
    1) dovrebbe consentirmi di effettuare la stampa diretta (correlata alla 3)
    2) dovrebbe consentirmi di decidere il numero di copie da stampare
    3) effettua la stampa e imposta la possibilità di fronte/retro

    sulla 1 non mi esprimo....
    la 2: se la lascio cos' com'è, in realtà mi stampa 2 copie (eppure è impostato 1); in ogni caso fa niente, al momento l'ho eliminata
    la 3: quell'opzione ManualDuplexPrint (true/false) ipotizzo si riferisca al fatto che io debba manualmente prendere foglio con la prima facciata stampata, girarlo e reiserirlo nel cassetto della stampante per poi stampare il retro (quindi impostato a True); diversamente, la stampante dovrebbe fare tutto in automatico (quindi impostato a False). Però come lo imposto lo imposto (True o False) non cambia nulla, stampa sempre 2 fogli con singola facciata.
  • Re: Interazione word: stampa multi record e fronte / retro

    Uhmmm....mi autoaggiorno.
    Purtroppo leggendo e rileggendo la guida in linea, la stringa
    
    ManualDuplexPrint:=False
    
    è relativa a stampanti prive di kit duplex. La nostra invece è progettata per il duplex....
    Mi sa che non è questa la strada.....
  • Re: Interazione word: stampa multi record e fronte / retro

    Jocman ha scritto:


    Mi sa che non è questa la strada.....
    Da quello che ho letto in giro Il fronte/retro non riesci ad impostarlo da VBA puro e semplice. Guarda i due link che avevo messo nel mio ultimo post. Lì si fa uso intenso di API ed è specifico per Word.
    Alcuni suggeriscono anche di creare due stampanti, una con preimpostato il fronte/retro e un'altra no: è più facile scegliere su quale stampante andare invece di cambiare le impostazioni di quella predefinita.
  • Re: Interazione word: stampa multi record e fronte / retro

    Si, la possibilità di installare una seconda stampante l'avevo letta anche io, ma essendo un ufficio con le sue policy (per non usare altro termine) diventa tutto "impossibile".

    Mi guardo per bene i link che hai suggerito, chissà....
  • Re: Interazione word: stampa multi record e fronte / retro

    Jocman ha scritto:


    Si, la possibilità di installare una seconda stampante l'avevo letta anche io, ...
    Installare in senso figurato, si tratta solo di configurarne due, ma il dispositivo di stampa è sempre lo stesso.
    Ho trovato anche questo file in cui l'autore ha messo insieme anche gli altri due "capitoli" del quartetto fatto da Jonathan West
    https://jay-freedman.info/Controlling_the_Printer_from_Word_VBA.docx
  • Re: Interazione word: stampa multi record e fronte / retro

    E' molto interessante il file doc che mi hai linkato.
    Francamente, però, stiamo andando molto al di sopra delle mie (scarse) conoscenze.
    Tuttavia stamattina ho fatto quattro chiacchiere con quelli dell'ufficio interessati spiegandogli il problema.
    Magicamente hanno tirato fuori dal cilindro (o meglio da un armadio) una vecchia stampante monocromatica con duplex, non più usata perchè sostituita da quella di rete per grandi volumi. Ma è ancora presente come stampante nel sistema.
    Siamo arrivati alla conclusione di rimetterla in moto e usarla impostata fissa fronte/retro per questo scopo.
    A loro dice che va bene anche così....
  • Re: Interazione word: stampa multi record e fronte / retro

    Jocman ha scritto:


    ...
    Francamente, però, stiamo andando molto al di sopra delle mie (scarse) conoscenze.
    Perché credi che io le abbia capite? (e lo so che per te sono tra i primi 5 specialisti Access! )
    Zero di niente, non le ho nemmeno lette attentamente se è per quello. Per quanto ti poteva interessare, secondo me, il secondo "capitolo" era sufficiente. L'ho messa da parte anch'io quel file. Sai mai che in futuro debba usare VBA su Word con uso particolare della stampante... l'occhio vado a buttarlo di sicuro. Lì, se non ho sbagliato clamorosamente, c'è il codice per impostare la stampante come fronte/retro o facciata singola, tramite l'uso di API, che il puro VBA e modello ad oggetti di Word non riesce a fare (mentre Access sembra di sì... strano, no? )
  • Re: Interazione word: stampa multi record e fronte / retro

    Philcattivocarattere ha scritto:


    (e lo so che per te sono tra i primi 5 specialisti Access! )
    Miiiiii, adoro la tua modestia

    Comunque si, il file è realmente molto interessante (l'ho conservato anche io).
    Non ne ho capito granchè (ma ripeto, mia ignoranza atavica), credo che tutto quello che spiega sia da integrare nel file word (quindi non in access), ma anche in quel caso non ho capito granchè di come....eseguirlo.
    Cioè:
    Access dovrebbe compilare e mandare in stampa il file word e al momento della stampa il file word dovrebbe eseguire il codice che è stato messo al suo interno (per svolgere uan di quelle funzioni descritte nel tutorial - nel mio caso impostare la stampa duplex) ....
    Comunque, tutto nel mio archivio per un eventuale futuro.
Devi accedere o registrarti per scrivere nel forum
16 risposte