Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Stampa recordset su più pagine con i bookmarks da access a word

180 views
Skip to first unread message

Raffaella

unread,
Jul 30, 2011, 5:12:04 AM7/30/11
to
Ciao,
ho cercato nei vari post una soluzione, ma non l'ho ancora trovata. Ho
quindi deciso di esporre il mio problema, nella speranza che qualcuno
possa darmi una mano.
Da un pulsante di una maschera ho la necessità di far stampare su un
modello di word, una lettera contente due campi il cui contenuto viene
estratto con una query parametrica tra due tabelle relazionate tra di
loro "uno a molti", in base ai dati visualizzati in quel momento nella
maschera. Le tabelle in questione sono "Corsi" il cui campo che mi
interessa è "CODINTERNO" e la tabella "Docenti" il cui campo che mi
interessa è "nomedocente". Naturalmente per ciascun corso ci sono più
docenti.
Ho provato con il metodo dei bookmarks e la procedura funziona in
parte, nel senso che mi apre correttamente il file di word
compilandolo, ma mi mette i nominativi dei docenti uno di seguito
all'altro nella stessa pagina. Voglio invece che il CODINTERNO insieme
ad un singolo docente venga stampato su una pagina, e gli altri
docenti su altre pagine.
Ho provato anche con il Mairmerge ma ho problemi nell'impostare la
stampa unione in word, dal momento che i dati si basano su una query
parametrica.
Io utilizzo Office 2007, ma lavoro su database e documenti 2003,
poichè in azienda ci sono ancora dei pc con queste versioni.

Riporto di seguito il codice utilizzato nella routine:

Private Sub SoddAllievoDocente_Click()
Dim Wrd As Word.Application, Doc As Word.Document
Dim Modello As String, NomeFile As String, i As Integer
Dim Record As String, s As String
Dim ReplSel As Boolean
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

On Error Resume Next 'gestione errori step by step
'cerca un'istanza di Word già aperta
Set Wrd = GetObject(, "Word.Application")
If Err.Number = 429 Then
'se c'è stato un errore è perchè Word non era già aperto:
'aprilo adesso
Set Wrd = CreateObject("Word.Application")
End If

On Error GoTo 0 'ripristina la segnalazione degli errori

'rendi visibile la finestra di Word:
Wrd.Visible = True
'attiva Word e portalo in primo piano:
Wrd.Activate
'abilita l'opzione "Sostituisci la selezione". Se non fosse
'attiva, i campi modulo rimarrebbero all'interno del testo.
ReplSel = Wrd.Options.ReplaceSelection
Wrd.Options.ReplaceSelection = True

'Apri un nuovo documento basato sul modello:
Set Doc = Wrd.Documents.Add("F:\2006\PROCEDURE\PGQ_08_01
soddisfazione\PGQ 08_01_02 Soddisfazione_allievo_docenteREV2.dot")
'attivalo e portalo in primo piano:
Doc.Activate

Doc.Bookmarks("codinterno").Select

'e sovrascrivilo con il contenuto dei campi
'codinterno:
Wrd.Selection.TypeText nz(Me.CODINTERNO, "")

'esportazione elencodocenti:
'selezione del punto di inserimento
'apertura del recordset

Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Q_docenti_corsi")
qdf.Parameters("[Forms]![corsi]![CODINTERNO]") = Forms!corsi!
CODINTERNO
Set rst = qdf.OpenRecordset
Doc.Bookmarks("docente").Select

If Not rst.BOF Then 'se il recordset non è vuoto
'Wrd.Selection.TypeText nz(rst("Denominazione"))

'ciclo sul recordset ed esportazione di tutte le righe
With rst
rst.MoveFirst 'posizionati sul primo record
While Not .EOF 'ripeti fino alla fine del recordset:
'costruisci la riga da scrivere nel documento:

Wrd.Selection.TypeText nz(rst("Denominazione")) &
vbCrLf 'scrivi la riga

rst.MoveNext 'passa al prossimo record

Wend 'Not .EOF
End With 'Rst
'chiudi e azzera il recordset
rst.Close: Set rst = Nothing

Else 'Not Rst.BOF
Wrd.Selection.TypeText "NESSUN DOCENTE." & vbCrLf
End If 'Not Rst.BOF
'ripristina il valore originario dell'opzione
'"Sostituisci la selezione"
Wrd.Options.ReplaceSelection = ReplSel

'avvisa l'utente che l'esportazione è terminata
Wrd.Application.WordBasic.MsgBox "Esportazione terminata",
"Esportazione dati da Access"

On Error GoTo Err_SoddAllievoDocente_Click

Exit_SoddAllievoDocente_Click:
Exit Sub

Err_SoddAllievoDocente_Click:
MsgBox Err.Description
Resume Exit_SoddAllievoDocente_Click

End Sub

Probabilmente c'è qualche istruzione da inserire nel ciclo, ma non
conosco VBA, e non ho trovato un esempio simile neanche sul
sitocomune.

Grazie per l'aiuto

BFS

unread,
Jul 30, 2011, 12:09:19 PM7/30/11
to
Il 30/07/2011 11:12, Raffaella ha scritto:
> Ciao,
> ho cercato nei vari post una soluzione, ma non l'ho ancora trovata. Ho
> quindi deciso di esporre il mio problema, nella speranza che qualcuno
> possa darmi una mano.
> Da un pulsante di una maschera ho la necessit� di far stampare su un

> modello di word, una lettera contente due campi il cui contenuto viene
> estratto con una query parametrica tra due tabelle relazionate tra di
> loro "uno a molti", in base ai dati visualizzati in quel momento nella
> maschera. Le tabelle in questione sono "Corsi" il cui campo che mi
> interessa � "CODINTERNO" e la tabella "Docenti" il cui campo che mi
> interessa � "nomedocente". Naturalmente per ciascun corso ci sono pi�

> docenti.
> Ho provato con il metodo dei bookmarks e la procedura funziona in
> parte, nel senso che mi apre correttamente il file di word
> compilandolo, ma mi mette i nominativi dei docenti uno di seguito
> all'altro nella stessa pagina. Voglio invece che il CODINTERNO insieme
> ad un singolo docente venga stampato su una pagina, e gli altri
> docenti su altre pagine.
> Ho provato anche con il Mairmerge ma ho problemi nell'impostare la
> stampa unione in word, dal momento che i dati si basano su una query
> parametrica.
> Io utilizzo Office 2007, ma lavoro su database e documenti 2003,
> poich� in azienda ci sono ancora dei pc con queste versioni.

>
> Riporto di seguito il codice utilizzato nella routine:
>
> Private Sub SoddAllievoDocente_Click()
> Dim Wrd As Word.Application, Doc As Word.Document
> Dim Modello As String, NomeFile As String, i As Integer
> Dim Record As String, s As String
> Dim ReplSel As Boolean
> Dim dbs As DAO.Database
> Dim qdf As DAO.QueryDef
> Dim rst As DAO.Recordset
>
> On Error Resume Next 'gestione errori step by step
> 'cerca un'istanza di Word gi� aperta

> Set Wrd = GetObject(, "Word.Application")
> If Err.Number = 429 Then
> 'se c'� stato un errore � perch� Word non era gi� aperto:
> If Not rst.BOF Then 'se il recordset non � vuoto

> 'Wrd.Selection.TypeText nz(rst("Denominazione"))
>
> 'ciclo sul recordset ed esportazione di tutte le righe
> With rst
> rst.MoveFirst 'posizionati sul primo record
> While Not .EOF 'ripeti fino alla fine del recordset:
> 'costruisci la riga da scrivere nel documento:
>
> Wrd.Selection.TypeText nz(rst("Denominazione"))&
> vbCrLf 'scrivi la riga
>
> rst.MoveNext 'passa al prossimo record
>
> Wend 'Not .EOF
> End With 'Rst
> 'chiudi e azzera il recordset
> rst.Close: Set rst = Nothing
>
> Else 'Not Rst.BOF
> Wrd.Selection.TypeText "NESSUN DOCENTE."& vbCrLf
> End If 'Not Rst.BOF
> 'ripristina il valore originario dell'opzione
> '"Sostituisci la selezione"
> Wrd.Options.ReplaceSelection = ReplSel
>
> 'avvisa l'utente che l'esportazione � terminata

> Wrd.Application.WordBasic.MsgBox "Esportazione terminata",
> "Esportazione dati da Access"
>
> On Error GoTo Err_SoddAllievoDocente_Click
>
> Exit_SoddAllievoDocente_Click:
> Exit Sub
>
> Err_SoddAllievoDocente_Click:
> MsgBox Err.Description
> Resume Exit_SoddAllievoDocente_Click
>
> End Sub
>
> Probabilmente c'� qualche istruzione da inserire nel ciclo, ma non

> conosco VBA, e non ho trovato un esempio simile neanche sul
> sitocomune.
>
> Grazie per l'aiuto


ovvio perch� il file word lo apri fuori dal ciclo..quindi una sola volta.

dovresti invece fare qualcosa del tipo:

istanziare word

ciclare la tua query
while not tuaquery.eof
aprire il file word
compilare i due segnalibri
stampare il file word
oppure salvarlo (con nome diverso ovviamente
es.objWord.ActiveDocument.SaveAs & nomedocente)

tuaquery.movenext
wend

rilasciare word

ciao
BFS

Raffaella

unread,
Aug 2, 2011, 3:13:50 AM8/2/11
to
Il giorno sabato 30 luglio 2011 18:09:19 UTC+2, BFS ha scritto:
> Il 30/07/2011 11:12, Raffaella ha scritto:
> > Ciao,
> > ho cercato nei vari post una soluzione, ma non l'ho ancora trovata. Ho
> > quindi deciso di esporre il mio problema, nella speranza che qualcuno
> > possa darmi una mano.
> > Da un pulsante di una maschera ho la necessità di far stampare su un

> > modello di word, una lettera contente due campi il cui contenuto viene
> > estratto con una query parametrica tra due tabelle relazionate tra di
> > loro "uno a molti", in base ai dati visualizzati in quel momento nella
> > maschera. Le tabelle in questione sono "Corsi" il cui campo che mi
> > interessa è "CODINTERNO" e la tabella "Docenti" il cui campo che mi
> > interessa è "nomedocente". Naturalmente per ciascun corso ci sono più

> > docenti.
> > Ho provato con il metodo dei bookmarks e la procedura funziona in
> > parte, nel senso che mi apre correttamente il file di word
> > compilandolo, ma mi mette i nominativi dei docenti uno di seguito
> > all'altro nella stessa pagina. Voglio invece che il CODINTERNO insieme
> > ad un singolo docente venga stampato su una pagina, e gli altri
> > docenti su altre pagine.
> > Ho provato anche con il Mairmerge ma ho problemi nell'impostare la
> > stampa unione in word, dal momento che i dati si basano su una query
> > parametrica.
> > Io utilizzo Office 2007, ma lavoro su database e documenti 2003,
> > poichè in azienda ci sono ancora dei pc con queste versioni.

> >
> > Riporto di seguito il codice utilizzato nella routine:
> >
> > Private Sub SoddAllievoDocente_Click()
> > Dim Wrd As Word.Application, Doc As Word.Document
> > Dim Modello As String, NomeFile As String, i As Integer
> > Dim Record As String, s As String
> > Dim ReplSel As Boolean
> > Dim dbs As DAO.Database
> > Dim qdf As DAO.QueryDef
> > Dim rst As DAO.Recordset
> >
> > On Error Resume Next 'gestione errori step by step
> > 'cerca un'istanza di Word già aperta

> > Set Wrd = GetObject(, "Word.Application")
> > If Err.Number = 429 Then
> > 'se c'è stato un errore è perchè Word non era già aperto:
> > If Not rst.BOF Then 'se il recordset non è vuoto

> > 'Wrd.Selection.TypeText nz(rst("Denominazione"))
> >
> > 'ciclo sul recordset ed esportazione di tutte le righe
> > With rst
> > rst.MoveFirst 'posizionati sul primo record
> > While Not .EOF 'ripeti fino alla fine del recordset:
> > 'costruisci la riga da scrivere nel documento:
> >
> > Wrd.Selection.TypeText nz(rst("Denominazione"))&
> > vbCrLf 'scrivi la riga
> >
> > rst.MoveNext 'passa al prossimo record
> >
> > Wend 'Not .EOF
> > End With 'Rst
> > 'chiudi e azzera il recordset
> > rst.Close: Set rst = Nothing
> >
> > Else 'Not Rst.BOF
> > Wrd.Selection.TypeText "NESSUN DOCENTE."& vbCrLf
> > End If 'Not Rst.BOF
> > 'ripristina il valore originario dell'opzione
> > '"Sostituisci la selezione"
> > Wrd.Options.ReplaceSelection = ReplSel
> >
> > 'avvisa l'utente che l'esportazione è terminata

> > Wrd.Application.WordBasic.MsgBox "Esportazione terminata",
> > "Esportazione dati da Access"
> >
> > On Error GoTo Err_SoddAllievoDocente_Click
> >
> > Exit_SoddAllievoDocente_Click:
> > Exit Sub
> >
> > Err_SoddAllievoDocente_Click:
> > MsgBox Err.Description
> > Resume Exit_SoddAllievoDocente_Click
> >
> > End Sub
> >
> > Probabilmente c'è qualche istruzione da inserire nel ciclo, ma non

> > conosco VBA, e non ho trovato un esempio simile neanche sul
> > sitocomune.
> >
> > Grazie per l'aiuto
>
>
> ovvio perchè il file word lo apri fuori dal ciclo..quindi una sola volta.

>
> dovresti invece fare qualcosa del tipo:
>
> istanziare word
>
> ciclare la tua query
> while not tuaquery.eof
> aprire il file word
> compilare i due segnalibri
> stampare il file word
> oppure salvarlo (con nome diverso ovviamente
> es.objWord.ActiveDocument.SaveAs & nomedocente)
>
> tuaquery.movenext
> wend
>
> rilasciare word
>
> ciao
> BFS

Grazie, nel frattempo ci sono arrivata anch'io inserendo l'apertura del file nel ciclo, in questo modo però mi apre due documenti composti da una pagina ciascuno, invece vorrei che la routine mi aprisse un unico documento con due pagine.
Alla fine la soluzione l'ho trovata con il MeilMerge, anche se mi piace meno, mettendo insieme le soluzioni di più post:
1) ho creato una tabella d'appoggio dalla query parametrica (con query di creazione tabella)
2) ho trasformato la query parametrica in query di accodamento che punta alla tabella di appoggio
3) ho creato una query di eliminazione sempre per la tabella di appoggio, in modo che tale tabella venga svuotata prima dell'esecuzione della query di accodamento
4) ho preparato il file di word per la stampa unione, utilizzando come origine dati la tabella di appoggio

Riporto di seguito il codice utilizzato nel caso servisse a qualcuno:

Private Sub Comando25832_Click()
On Error GoTo Err_Comando25832_Click

DoCmd.SetWarnings False '<-- no messaggi di avviso
DoCmd.OpenQuery "Q_tab_sad_elimina" 'Cancella i dati presenti nella tabella di appoggio
DoCmd.SetWarnings False '<-- no messaggi di avviso
DoCmd.OpenQuery "Q_SADappoggio" 'Esegue la query che popola la tabella di appoggio di nuovi dati


Dim objWord As Word.Document
Set objWord = GetObject("I:\DB Irecoop\PGQ 08_01_02 Soddisfazione_allievo_docenteREV2.dot", "Word.Document")
' Rende Word visibile.
objWord.Application.Visible = True
objWord.MailMerge.Destination = wdSendToNewDocument
objWord.MailMerge.Execute
objWord.Close False

Exit_Comando25832_Click:
Exit Sub

Err_Comando25832_Click:
MsgBox Err.Description
Resume Exit_Comando25832_Click

End Sub


L'unica cosa è che quando mi apre il file di word mi appare la finestra che mi informa che all'apertura del documento verrà eseguito il comando SQL, cliccando su sì tutto funziona, ma vorrei che tale finestra non apparisse.
Ho provato a eliminarla seguendo il consiglio che ho trovato in altri post (modifica chiave di registro, modifica impostazioni di word per eseguire le macro...) ma non ci sono riuscita. Se hai qualche suggerimento...

Grazie e ciao
Raffa

0 new messages