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
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