Newsgroup: it.comp.appl.access
Titolo: [ACC XP] Problema stampa unione Word da VBA

Premessa.
Una mia applicazione in Access 2000 esegue quotidianamente da oltre 5
anni decine e decine di stampe unione pilotate tramite VBA utilizzando
la routine il cui codice è riportato sotto.
Poichè uso la tecnica early binding, fra i riferimenti nel file mdb ho
impostato anche "Microsoft Word 9 Object Library".
Ovviamente sui pc dov'è installata l'applicazione è presente anche
Word 2000.
Avendo bisogno di implementare una funzione analoga in un database
Access XP ho preso il codice, l'ho copiato nel database XP e ... non
funziona !
Ovviamente, in questo caso fra i riferimenti ho impostato "Microsoft
Word 10 Object Library".
Nel documento Word il metodo di collegamento che ho utilizzato è via
DDE.
Il malfunzionamento consiste nel fatto che, quando viene eseguita
l'istruzione wrdDoc.MailMerge.OpenDataSource, pur essendo corretti
tutti i valori dei parametri, Word apre una finestra che elenca le
tabelle contenute nel file mdb che ho passato come origine dati,
chiedendomi di scegliere quella da usare come origine dati per il
documento.
Faccio notare che questo è un parametro che viene passato e contiene
il valore corretto, verificato con il debug.
In particolare ho provato a passare come parametro sia il nome della
tabella da solo, sia il nome della tabella preceduto dalla parola
chiave Table. In quest'ultimo caso ho provato tutte le combinazioni
possibili (maiuscolo/minuscolo, con/senza due punti dopo Table). 
Se nella lista che viene proposta seleziono la tabella (la stessa
passata come parametro) la stampa unione viene eseguita correttamente
ed il codice prosegue la sua esecuzione stampando se richiesto e
chiudendo il documento.
Altra cosa strana: se richiamo l'help per OpenDataSource, l'help NON
indica il parametro SubType che invece viene proposto da Intellisense
all'interno dell'editor VBA.
Sembra che Word non riceva un parametro necessario o che lo riceva ma
non riesca ad interpretarlo correttamente.
Sub StampaUnione(pNomeDoc As String, pNomeDB As String, pNomeOrigine
As String, Optional pSave As String, Optional pDest As String)
' Esegue la stampa unione di un documento Word
'
' Parametri in ingresso:
'
' pNomeDoc      : Nome, completo di percorso, del documento Word da
stampare
' pNomeDB       : Nome del database che contiene l'origine dati da
unire al documento
' pNomeOrigine  : Nome dell'origine dati contenuta in pNomeDB
' pSave         : Opzione per salvataggio documento: S=Salva, N=Non
salva, P=Chiede se salvare
' pDest         : Destinazione stampa unione: S=Stampante, F=Fax,
M=e-mail, D=Documento
On Error GoTo Err_StampaUnione
'Dim appWrd As Object, wrdDoc As Object, nDest As Byte, nSave As Long
Dim appWrd As Word.Application, wrdDoc As Word.Document, nDest As
Byte, nSave As Long
Dim stFile As String, fld As Object, i As Byte, aPath() As String
Const wdMainAndDataSource As Byte = 2
Const wdDoNotSaveChanges As Long = 0, wdSaveChanges As Long = -1,
wdPromptToSaveChanges As Long = -2
Const wdSendToEmail As Byte = 2, wdSendToFax As Byte = 3,
wdSendToNewDocument As Byte = 0, wdSendToPrinter As Byte = 1
 
  If Dir(pNomeDoc) = "" Then
     MsgBox "Il documento " & vbCrLf & pNomeDoc & vbCrLf & " non è
stato trovato", vbCritical + vbOKOnly
     Exit Sub
  End If
  If Dir(LeggiIni(stFileIni, "Path_DB", pNomeDB) & "\" & pNomeDB) = ""
Then
     MsgBox "Il database " & vbCrLf & pNomeDB & vbCrLf & " non è stato
trovato", vbCritical + vbOKOnly
     Exit Sub
  End If
  If IsMissing(pSave) Then pSave = "N"          ' Per default NON
salva il documento
  Select Case pSave
    Case Is = "S"
      nSave = wdSaveChanges
    Case Is = "N"
      nSave = wdDoNotSaveChanges
    Case Is = "P"
      nSave = wdPromptToSaveChanges
  End Select
  If IsMissing(pDest) Then pDest = "S"          ' Per default invia il
documento alla stampante
  Select Case pDest
    Case Is = "S"
      nDest = wdSendToPrinter
    Case Is = "F"
      nDest = wdSendToFax
    Case Is = "M"
      nDest = wdSendToEmail
    Case Is = "D"
      nDest = wdSendToNewDocument
  End Select
 
  ' Apre Word
  Set appWrd = GetObject(, "Word.Application")
  appWrd.Visible = True
  ' Apre il documento Word selezionato
  Set wrdDoc = appWrd.Documents.Open(pNomeDoc, True, False)
  ' Apre l'origine dati per il documento
  wrdDoc.MailMerge.OpenDataSource LeggiIni(stFileIni, "Path_DB",
pNomeDB) & "\" & pNomeDB, , , , True, False, , , , , , pNomeOrigine
  ' Esegue la stampa unione
  wrdDoc.MailMerge.Destination = nDest
  wrdDoc.MailMerge.Execute
  ' Chiude il documento
  wrdDoc.Close (nSave)
  ' Chiude Word
  appWrd.DDETerminateAll
  appWrd.Quit
  Set wrdDoc = Nothing
  Set appWrd = Nothing
  Exit Sub
Err_StampaUnione:
  Select Case Err.Number
    Case 429
      'se c'è stato un errore è perchè Word non era già aperto lo apre
      Set appWrd = CreateObject("Word.Application")
      Resume Next
    Case Else
      MsgBox "Errore n° " & Err.Number & ": " & Err.Description,
vbOKOnly
      wrdDoc.Close (nSave)
      ' Chiude Word
      appWrd.DDETerminateAll
      appWrd.Quit
      Set wrdDoc = Nothing
      Set appWrd = Nothing
  End Select
End Sub

VT @ Work ha detto: in data 08/03/2007 12.37:

[CUT]
... non so nello specifico da cosa possa dipendere, ma ti illustro una 
mia situazione che magari può essere d'aiuto
recentemente a me è capitato con AXP di "perdere" l'automazione (sia con 
word che con excel) con tecnica early binding, le ho provate tutte ma 
non voleva più aprirmi alcun file.
poi ho provato con il late binding.. e ... miracolo funzionava tutto e 
ho dovuto cambiare semplicemente l'inizializzazione delle variabili 
relative all'ambiente e al documento.
Ciao
Nick

 documento.
---omissis---
Prova a correggere la chiave nel registro indicato nel link:
http://support.microsoft.com/default.aspx?scid=kb;en-us;825765&Product=wrd
Ciao.
-- 
Sergio MAZZA 

 wrote:
 (...) 

Purtroppo non ha funzionato !
Continua a comportarsi esattamente nel solito modo.
Stranamente continua anche a comparire la finestra che avvisa "Se si
apre questo documento verrà eseguito il seguente comando SQL  ..." che
in base all'articolo che mi hai suggerito, avrebbe dovuto sparire dopo
avere aggiunto la chiave di registro specificata.
Qualche altra idea ?
Grazie

 Grazie
Antivirus?
Livello protezione Macro troppo alto?
Prova a fare l'unione a mano indicando il DDE...
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA 

 2003 SP2
3 versioni di office?
Scusa perché non provi con Virtual PC a crearti ambienti sterili?


Ciao.