Newsgroup: it.comp.appl.access
Titolo: Stampa unione - problemi con la versione Word 2003

Quella che segue è la parte della routine che utilizza la stampa unione per
creare un nuovo documento:
---------------------
Set docWord = AppWord.Documents.Open("c:\Assicurazioni\Modello2003.doc")
AppWord.ActiveDocument.MailMerge.Execute    'aggiorna i campi
AppWord.ActiveDocument.SaveAs SalvaConNome  'salva con nome
docWord.Close SaveChanges:=wdDoNotSaveChanges,
OriginalFormat:=wdWordDocument  'Chiude il documento di stampa unione
---------------------
Il problema è che con la versione Word 2000 funzionava regolarmente, mentre
con la versione 2003 mi dà errore su:
AppWord.ActiveDocument.MailMerge.Destination = wdSendToNewDocument
L'errore è il seguente:
"Errore di run-time 5852  -  L'oggetto non è disponibile"
Ho provato a richiamare direttamente il documento di stampa unione (con il
programma aperto) ed ho costatato che prima di effettuare l'aggiornamento
dei campi appare un messaggio che chiede se unire o meno i dati provenienti
dal comando SQL cui il doc è collegato (in pratica una query). Se è questo
il problema, come facio ad evitare tale richiesta? Se no, quale altro
potrebbe essere?

 ha scritto nel messaggio 
news:glQwe.18645$h5.8...@news3.tin.it...

sicuro che non sia determinato dal fatto che qualche campo non è compilato e 
quindi non sa cosa mettere nel bookmark? 

 ha scritto nel messaggio news:glQwe.18645$h5.8...@news3.tin.it...

Prova con:
In Word vai in  STRUMENTI - OPZIONI - STANDARD e nelle Opzioni Generali
seleziona: Conferma conversione all'apertura.
Una volta scelto il Data Base di origine alla richiesta di Conferma origine
dati devi selezionare "Database di MS Access via DDE (*.mdb)
(oppure)
http://support.microsoft.com/default.aspx?scid=kb;it;276004
http://support.microsoft.com/kb/279462/EN-US/
http://support.microsoft.com/default.aspx?scid=kb;en-us;289830
Ciao.
-- 
Sergio MAZZA 

come Object. 


Il problema è sul fatto che il documento master per la stampa unione è proprio la richiesta di conferma; il codice che hai inviato 
non ha nulla di grave se non per il fatto che per l'uso che ne fai non serve dichiararti l'oggetto Document visto che fai 
riferimento all'ActiveDocument di Application. Poi nell'esempio non hai dichiarato esplicitamente dove deve finire la stampa unione 
(se in un nuovo documento o altra destinazione) ma probabilmente ti prenderà l'opzione predefinita (ma io non ci giurerei).
Quindi se vogliamo riscrivere la routine:
'---------
On error goto nomeSub_err
dim appWord as object
set appWord = CreateObject("Word.Application")
appWord.Documents.Open "c:\Assicurazioni\Modello2003.doc"
with appWord.ActiveDocument
    .MailMerge.Destination = wdSendToNewDocument
    .MailMerge.Execute
end with
...
set appWord = nothing
exit sub
nomeSub_err:
    set appWord = nothing
    msgbox err.number & " " & application.accesserror(err.number)
'---------
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio 
news:da1869$ess$1...@domitilla.aioe.org...

Visato che sei così gentile,  ti mando l'intera routine. Mi ci dai uno 
sguardo? L'ho commentata, così sarà più chiaro cos'ho fatto... anche se sono 
sicuro non ne avrai bisogno:
Private Sub CreaDoc()
On Error GoTo errore
'--------------------------------------------------------------------
'Se è un nuovo record, e quindi non ci sono dati, esce dalla routine...
    If Forms!Master.NewRecord = True Then
        MsgBox "Non ci sono dati da stampare"
        GoTo fine
    End If
'--------------------------------------------------------------------
'Apre una maschera di attesa...
DoCmd.OpenForm "Attesa", acNormal, , , acFormEdit, acWindowNormal
Forms!Attesa.Repaint
'--------------------------------------------------------------------
Dim docWord As Word.Document
Dim AppWord As Object
Dim SalvaConNome As String    'Destinazione nuovo documento da stampa unione
Dim DocEsistente As Word.Document
    'chiama il programma Word come fosse aperto per evitare di avere più di 
una istanza Word in essere
    Set AppWord = GetObject(, "Word.Application")
        SalvaConNome = directori & "Sinistri\" & 
[Forms]![Master]![SinistroN] & ".Doc"
        'lo chiama come se esistesse: se esiste lo apre se no va alla 
gestione
        'errori dove lo crea...
        Set DocEsistente = AppWord.Documents.Open(SalvaConNome)
continua:
    AppWord.Visible = True 'rende visibile Word
'-------------------------------------------------------------------------------
fine:
DoCmd.Close acForm, "Attesa", acSaveYes
'------------------------
Exit Sub
errore:
If Err.Number = 429 Then
    Set AppWord = CreateObject("Word.Application")
    Resume Next
End If
If Err.Number = 5631 Or Err.Number = 4605 Then
    Resume continua
End If
If Err.Number = 2450 Then
    MsgBox "Non ci sono dati da stampare"
    Resume fine
End If
If Err.Number = 5174 Then
'il file richiamato non esiste, quindi lo crea
Set docWord = AppWord.Documents.Open("c:\Assicurazioni\Modello2003.doc") 
'Chiama il file.doc
AppWord.ActiveDocument.MailMerge.Destination = wdSendToNewDocument
AppWord.ActiveDocument.MailMerge.Execute    'aggiorna i campi
AppWord.ActiveDocument.SaveAs SalvaConNome  'salva con nome
docWord.Close SaveChanges:=wdDoNotSaveChanges, 
OriginalFormat:=wdWordDocument  'Chiude il documento di stampa unione
Resume Next
If Err.Number = 5631 Then
    MsgBox "Mancano dati essenziali alla stampa."
    Resume fine
End If
End If
MsgBox "Errore numero " & Err.Number & ". " & Err.Description
Resume fine
End Sub
Ciao e grazie, Agos 

 Ciao e grazie, Agos
Fammi capire; il MailMerge lo fai solo se va in errore la routine? Ti piace proprio complicarti la vita?
Sperando di aver intuito cosa dovresti fare:
Private Sub CreaDoc()
On Error GoTo errore
Dim AppWord As Object
on error resume next
Set AppWord = GetObject(, "Word.Application")
If Err.Number = 429 Then
    Set AppWord = CreateObject("Word.Application")
End If
on error goto 0
'il file richiamato non esiste, quindi lo crea
SalvaConNome = directori & "Sinistri\" & [Forms]![Master]![SinistroN] & ".Doc"
if dir(SalvaConNome)= "" then
    with AppWord
        .Documents.Open "c:\Assicurazioni\Modello2003.doc" 'Chiama il file.doc
        .ActiveDocument.MailMerge.Destination = wdSendToNewDocument
        .ActiveDocument.MailMerge.Execute    'aggiorna i campi
        .ActiveDocument.SaveAs SalvaConNome  'salva con nome
        .Close SaveChanges:=wdDoNotSaveChanges, OriginalFormat:=wdWordDocument
        end with
else
    AppWord.Documents.Open(SalvaConNome)
endif
AppWord.Visible = True
errore:
    set AppWord = nothing
    msgbox err.number & " " & application.accesserror(err.number)
End Sub
Ciao.
-- 
Sergio MAZZA 

ringrazio.
Tornando al problema, ho provato la tua routine, ma mi si inchioda nello 
stesso punto con lo stesso errore:  "Errore di run-time 5852  -  L'oggetto 
non è disponibile"; e se richiamo il file Word direttamente me lo apre non 
prima di avermi chiesto se voglio inserire i dati SQL.
Cercherò di approfondire. Se hai qualche altro consiglio...
Ciao, Agos 

 Ciao, Agos
Il problema (come ti avevo già anticipato) non è la routine (a parte la complicazione della vita) ma il modo che utilizza word per 
accedere alla fonte dati. E' li che devi intervenire...
Ciao.
-- 
Sergio MAZZA 

Provo a descrivertelo:
-- Per creare il documento di stampa unione "Modello2003.doc", dal menù di 
Word2003 vado su  Strumenti > Lettere e Indirizzi > Stampa unione...
-- Seguo la procedura guidata e dopo un paio di passaggi mi trovo su 
"Selezione dei destinatari"; qui seleziono  "Usa elenco esistente" e con 
"Sfoglia..." apro "Seleziona origine dati"; qui, su "Tipo file" indico 
"Database di Access (*.mdb; *mde)", dopo di che vado a cercare il db 
contenente la query che sottenderà al documento principale di stampa unione. 
A questo punto mi appare il messaggio "Nessuna tabella visibile contenuta 
nell'origine dei dati". Clicco OK e mi appare la maschera "Conferma origine 
dei dati" ed è qui che, come anche tu mi hai confrermato, seleziono 
"Database di MS Access via DDE (*.mdb)". A questo punto appare la maschera 
con l'elenco delle tabelle e delle query contenute nel db selezionato e non 
devo far altro che selezionare la query "Stampa". Quest'ultima seleziona un 
solo record in base ad un parametro che trova sulla maschera che contiene 
anche il pulsante che avvia la routine che conosci. Lascio selezionato il 
flag "Collega a query" e do l'OK. Appare ancora una finestra, "Destinatari 
stampa unione", che mostra il risultato della query, do l'ultima conferma e 
il documento di stampa unione è pronto. Ora, con "Inserisci campi unione" 
posiziono al posto giusto i vari campi e il gioco dovrebbe essere fatto, 
ma...
* Se lancio la routine dalla maschera del db mi dà l'errore che sai;
** Se provo a lanciare direttamente il file  "modello2003.doc" (chiaramente 
con la maschera del db aperta affinché la query possa prendersi il parametro 
che le occorre), tutto funziona regolarmente, se non che appare quella 
fastidiosa richiesta di conferma inserimento dati provenienti da SQL.
Sono convinto che la risoluzione del problema sta nell'evitare quest'ultimo 
messaggio di conferma, il quale, evidentemente, interrompe il mailmerge 
provocando l'errore... MA COME? Se non t'inventi qualcosa tu che sei uno dei 
massimi esperti in stampa unione, mi sa che stavolta mi devo arrendere... ma 
mi rode.
In ogni caso ti sono grato, hai molto da insegnare.
Ciao Agos 

Lasciamo stare il "massimo  esperto" che se poi non si risolve il
problema sai che figuraccia!!
Prova allora ad abbassare il livello di sicurezza di word sulle macro:
Strumenti - Macro - Protezioni...
Ciao.
- -
Sergio MAZZA

 ha scritto nel messaggio 
news:1120337607....@o13g2000cwo.googlegroups.com...

Già fatto, l'ho messo al minimo, non c'è verso.
Ho controllato tutte le opzioni di settaggio del Word2003, ma non ho trovato 
niente.
Comincio a pensare a soluzioni "sporche" come creare il documento principale 
di stampa unione con la versione 2000 di Word che non fa una piega.
Oppure creare una tabella, eseguirci una query di accodamento aggiungendo i 
dati che mi servono, fare il mailmerge con i dati di questa tabella e alla 
fine ripulirla... ma mi ripugna.
Se hai novità fammi sapere.
Ciao, Agos. 

Agos ha scritto:

Domani in ufficio vedo di ricreare la tua condizione per vedere se mi fa 
lo stesso problema...
Ciao.
--
Sergio MAZZA

 Ciao Agos
L'unica "stranezza" (ma non troppo) mi si è presentata su una query con lettura di parametro per la condizione da form (es. 
Forms![nomeForm]!nomeControllo).
Se la form è aperta la stampa unione funziona benissimo e mi crea l'unico documento con l'unico record restituito dalla query; se la 
form è chiusa mi viene richiesto il parametro necessario all'esecuzione della query (e non c'è nulla di strano), tutto quì.
Ora non so' cos'altro posso inventarmi per riprodurre quel tipo di errore...
Ciao.
-- 
Sergio MAZZA