Risolto Salvataggio file word in TXT dopo stampa e unione

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Ciao a tutti
di seguito ho inserito un codice per la stampa e unione automatica in word all'apertura del file, la cosa che mi manca e che non riesco a fargli fare (che tuttora faccio in manuale) è il salvataggio della mia stampa e unione in singoli file in formato txt se fosse possibile, con chiusura in automatico del file creato dalla stampa e unione in word, magari lasciando aperto quello in TXT e salvando il file in txt secondo un campo che si trova all'interno della stampa e unione e aggiorna il dato dal db di excel, spero di essere stata chiara.
Grazie a tutti per la disponibilità
Sub Autoopen():
    NomeFile = ActiveDocument.Name
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .Execute
    End With
    
    NomeUnione = ActiveDocument.Name
    
    'stampa direttamente
'    Application.PrintOut _
        FileName:="", _
        Range:=wdPrintAllDocument, _
        Item:=wdPrintDocumentContent, _
        Copies:=1, _
        Pages:="", _
        PageType:=wdPrintAllPages, _
        ManualDuplexPrint:=False, _
        Collate:=True, _
        Background:=False, _
        PrintToFile:=False
        
'oppure mostra la finestra di dialogo Stampa
'    risp = Dialogs(wdDialogFilePrint).Show

'chiude il documento unito
'    Documents(NomeUnione).Close savechanges:=wdDoNotSaveChanges

'chiude il doc. principale di stampa unione
'    Documents(NomeFile).Close savechanges:=wdDoNotSaveChanges

End Sub
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
Ciao a tutti
[...] la cosa che mi manca e che non riesco a fargli fare (che tuttora faccio in manuale) è il salvataggio della mia stampa e unione in singoli file in formato txt se fosse possibile
Una volta che hai stampato il tuo file, puoi tranquillamente salvarlo con la seguente istruzione:

Visual Basic:
Documents(NomeUnione).SaveAs2 "Nome Documento", wdFormatTextLineBreaks
ovviamente Nome Documento che sta tra apici, deve essere sostituito con il nome che intendi assegnare al nuovo file, completo del percorso della cartella dove intendi salvare.

Questa istruzione la puoi inserire subito prima del commento

Visual Basic:
'oppure mostra la finestra di dialogo Stampa
già presente nel tuo codice.

TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Grazie innanzitutto, adesso inserendo questa riga così come sotto, mi salva il file in TXT però quando tolgo l'apice a chiude il documento unito mi restituisce errore di run time 4160 evidenziandomi la riga 28 del codice in giallo.


Sub Autoopen():
    NomeFile = ActiveDocument.Name
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .Execute
    End With
    
    NomeUnione = ActiveDocument.Name
    
    'stampa direttamente
'    Application.PrintOut _
        FileName:="", _
        Range:=wdPrintAllDocument, _
        Item:=wdPrintDocumentContent, _
        Copies:=1, _
        Pages:="", _
        PageType:=wdPrintAllPages, _
        ManualDuplexPrint:=False, _
        Collate:=True, _
        Background:=False, _
        PrintToFile:=False

Documents(NomeUnione).SaveAs2 "Nome Documento", wdFormatTextLineBreaks

'oppure mostra la finestra di dialogo Stampa
'    risp = Dialogs(wdDialogFilePrint).Show

'chiude il documento unito
    Documents(NomeUnione).Close savechanges:=wdDoNotSaveChanges

'chiude il doc. principale di stampa unione
'    Documents(NomeFile).Close savechanges:=wdDoNotSaveChanges

End Sub
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
adesso inserendo questa riga così come sotto, mi salva il file in TXT però quando tolgo l'apice a chiude il documento unito mi restituisce errore di run time 4160 evidenziandomi la riga 28 del codice in giallo.
Questo è ovvio, perchè quando esegui il "salva con nome", il documento attivo prende il nuovo nome che gli hai attribuito, nell'esempio si chiamerà "Nome Documento".
In definitiva, per chiuderlo, devi usare come argomento di Documents, il nuovo nome:

Visual Basic:
Documents("Nome Documento.txt").Close savechanges:=wdDoNotSaveChanges
TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
OK, grazie adesso va, ma come riuscirei a creare singoli file in txt essendo più pagine di word (o magari dividerli già in singoli file word) che mi crea il documento di stampa e unione? Inoltre come posso rinominarli secondo un campo all'interno del documento base di stampa e unione?
se fosse possibile fare le precedenti cose dette
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
ma come riuscirei a creare singoli file in txt essendo più pagine di word (o magari dividerli già in singoli file word) che mi crea il documento di stampa e unione?
per come hai attualmente scritto il codice:

Visual Basic:
    NomeFile = ActiveDocument.Name
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .Execute
    End With
la Stampa Unione viene già avviata mediante la creazione di singoli files, attraverso la proprietà

.Destination = wdSendToNewDocument

Inoltre come posso rinominarli secondo un campo all'interno del documento base di stampa e unione?
Se vuoi dare un nome diverso ad ogni file, non devi far altro che usare una variabile nella quale metterai il nome rilevato da uno dei campi unione e utilizzerai questa variabile al posto di Nome Documento, come fatto in precedenza:

Visual Basic:
Dim sNomeDoc As String
sNomeDoc = ActiveDocument.MailMerge.DataSource.DataFields("nome del campo").Value
Ovviamente a "nome del campo" devi sostituire il nome reale del campo da cui intendi prendere il dato.

TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Guarda purtroppo con questa proprietà non mi crea singoli file in word, ma unico file con pagine diverse.
.Destination = wdSendToNewDocument

Poi non riesco a inserire la variabile per rinominare il file
Visual Basic:
Dim sNomeDoc As String
sNomeDoc = ActiveDocument.MailMerge.DataSource.DataFields("nome del campo").Value
la dovrei inserire qui di seguito ma non capisco come
Visual Basic:
Documents(NomeUnione).SaveAs2 "Nome Documento", wdFormatTextLineBreaks
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Ho provato con questo codice seguente, ma non capisco dove sbaglio eseguendolo mi restituisce errore di compilazione previsto End With, ho provato a ragionare unendo codici diversi c'è qualche errore di sintassi credo

Sub Autoopen():
    NomeFile = ActiveDocument.Name
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .Execute
    End With
    
    NomeUnione = ActiveDocument.Name
    
    'stampa direttamente
'    Application.PrintOut _
        FileName:="", _
        Range:=wdPrintAllDocument, _
        Item:=wdPrintDocumentContent, _
        Copies:=1, _
        Pages:="", _
        PageType:=wdPrintAllPages, _
        ManualDuplexPrint:=False, _
        Collate:=True, _
        Background:=False, _
        PrintToFile:=False
strPath = "\\percorso di salvataggio\"
strFilename = ActiveDocument.MailMerge.DataSource.DataFields("campo unione").Value
If Len(strFilename) Then
strFilename = strPath & "BOZZA" & strFilename
objWdMailMerge.Execute
With ActiveDocument
.SaveAs strFilename, wdFormatTextLineBreaks, AddToRecentFiles:=False
'oppure mostra la finestra di dialogo Stampa
'    risp = Dialogs(wdDialogFilePrint).Show

'chiude il documento unito
'    Documents("BOZZA _MSG _ANNESSO 3  - CODES XXXXX.txt").Close savechanges:=wdDoNotSaveChanges

'chiude il doc. principale di stampa unione
'    Documents(NomeFile).Close savechanges:=wdDoNotSaveChanges

End Sub
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
Allora, se devi stampare e salvare con un nome che prendi dal documento base, devi cambiare approccio, perchè se crei un nuovo documento con tutti i record, perdi l'origine dati, quindi non puoi prelevare i valori dai campi del documento, che in pratica non esistono nel nuovo file unito.
L'alternativa è quella di non finalizzare il documento con .Execute, ma mantenere il documento in Anteprima Risultati.

Prova questo codice, che ho commentato per cercare di spiegarti cosa fa.

Visual Basic:
Sub SalvaFilesStampaUnione()

Dim wDocBase As Document
Dim wNuovoDoc As Document

Set wDocBase = ActiveDocument

'Attiva la stampa unione
With wDocBase.MailMerge
    .SuppressBlankLines = True
    With .DataSource
        .FirstRecord = wdDefaultFirstRecord
        .LastRecord = wdDefaultLastRecord
    End With
  
    'Attiva la modalità di anteprima dei campi
    .ViewMailMergeFieldCodes = False
  
    'Si porta sul primo record
    .DataSource.ActiveRecord = wdFirstRecord
  
    'Inizia il ciclo per lo scorrimento dei record
    While .DataSource.ActiveRecord < .DataSource.RecordCount
        'Seleziona la pagina e la copia
        wDocBase.Bookmarks("\Page").Range.Select
        Selection.Copy
      
        'Crea un nuovo documento e incolla la pagina copiata
        Set wNuovoDoc = Application.Documents.Add
        Selection.Paste
      
        'Crea il nome del documento dal campo "Cognome" del documento principale
        'tu, ovviamente scegli il nome del Campo che ti serve.
        DocName = .DataSource.DataFields("Cognome").Value
      
        'Salva il nuovo file come testo
        wNuovoDoc.SaveAs FileName:=DocName, FileFormat:=wdFormatTextLineBreaks
      
        'Stampa il nuovo file
        wNuovoDoc.PrintOut Copies:=1, Background:=False
      
        'Chiude il nuovo file
        wNuovoDoc.Close False
      
        'Passa al record successivo
        .DataSource.ActiveRecord = wdNextRecord
    Wend
End With

End Sub
TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Grazie sto provando il codice ho disabilitato la stampa per ora mettendo l'apice davanti la stringa
Visual Basic:
wNuovoDoc.PrintOut Copies:=1, Background:=False
Pero non capisco dove mi salva i file in txt non essendoci indicato il percorso nel codice, scusa per l'ignoranza
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
Grazie sto provando il codice ho disabilitato la stampa per ora mettendo l'apice davanti la stringa
Visual Basic:
wNuovoDoc.PrintOut Copies:=1, Background:=False
OK.

Pero non capisco dove mi salva i file in txt non essendoci indicato il percorso nel codice, scusa per l'ignoranza
Dovrebbe salvarli nella stessa cartella del file che usi per la stampa unione.
Ovviamente se li vuoi in un percorso diverso, devi specificare un altro percorso, analogamente a come hai già fatto in questo tratto del tuo codice precedente:

Visual Basic:
'[...]
strPath = "\\percorso di salvataggio\"
strFilename = ActiveDocument.MailMerge.DataSource.DataFields("campo unione").Value
If Len(strFilename) Then
strFilename = strPath & "BOZZA" & strFilename
'[...]
TheTruster
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
Ho aggiunto io l'impostazione del percorso relativo al file che usi per la stampa unione.

Visual Basic:
Sub SalvaFilesStampaUnione()

Dim wDocBase As Document
Dim wNuovoDoc As Document
Dim sPath As String

Set wDocBase = ActiveDocument

'Attiva la stampa unione
With wDocBase.MailMerge
    .SuppressBlankLines = True
    With .DataSource
        .FirstRecord = wdDefaultFirstRecord
        .LastRecord = wdDefaultLastRecord
    End With

    'Attiva la modalità di anteprima dei campi
    .ViewMailMergeFieldCodes = False

    'Si porta sul primo record
    .DataSource.ActiveRecord = wdFirstRecord

    'Inizia il ciclo per lo scorrimento dei record
    While .DataSource.ActiveRecord < .DataSource.RecordCount
        'Seleziona la pagina e la copia
        wDocBase.Bookmarks("\Page").Range.Select
        Selection.Copy
    
        'Crea un nuovo documento e incolla la pagina copiata
        Set wNuovoDoc = Application.Documents.Add
        Selection.Paste
    
        'Imposta il percorso relativo al documento principale della Stampa Unione
        sPath = wDocBase.Path
      
        'Crea il nome del documento dal campo "Cognome" del documento principale
        'tu, ovviamente scegli il nome del Campo che ti serve.
        DocName = sPath & "/" & .DataSource.DataFields("Cognome").Value
    
        'Salva il nuovo file come testo
        wNuovoDoc.SaveAs FileName:=DocName, FileFormat:=wdFormatTextLineBreaks
    
        'Stampa il nuovo file
        wNuovoDoc.PrintOut Copies:=1, Background:=False
    
        'Chiude il nuovo file
        wNuovoDoc.Close False
    
        'Passa al record successivo
        .DataSource.ActiveRecord = wdNextRecord
    Wend
End With

End Sub
TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Grazie ho provato un paio di volte il codice adesso li salva nella stessa directory del file che uso per la stampa e Unione. Perfetto
Per quanto riguarda la rinomina dei file in Txt ho visto che mi rinomina un file come quello del modello che uso per la stampa e Unione e gli altri prendono il nome dal campo Unione.
Inoltre sembra saltarmi un record cioè mi crea due file in txt con lo stesso record all’interno, non so se mi sono spiegata.
Inoltre vorrei che la prima parte del testo per la rinomina in txt fosse fisso es: Bozza - campo Unione.txt, scusate se ci metto poco di mio ma sto facendo tutto da autodidatta da poche settimane
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
Grazie ho provato un paio di volte il codice adesso li salva nella stessa directory del file che uso per la stampa e Unione. Perfetto
Ok. Bene.

Per quanto riguarda la rinomina dei file in Txt ho visto che mi rinomina un file come quello del modello che uso per la stampa e Unione e gli altri prendono il nome dal campo Unione.
Inoltre sembra saltarmi un record cioè mi crea due file in txt con lo stesso record all’interno, non so se mi sono spiegata.
Inoltre vorrei che la prima parte del testo per la rinomina in txt fosse fisso es: Bozza - campo Unione.txt, scusate se ci metto poco di mio ma sto facendo tutto da autodidatta da poche settimane
A questo punto, visto che a me fuziona perfettamente così come te l'ho postato, mostra la tua routine, perchè non vorrei che tra un copia-incolla e un altro, tu abbia commesso qualche errore.

TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Buongiorno, questo è il codice copiato all'ultima modifica del file, ti confermo che facendolo lavorare (nel file stampa e unione ho provato co tre record da unire) mi salta un record e mi crea due file in txt con lo stesso record, uno rinominato con il nome del file in word della stampa e unione e l'altro con il nome del campo unione, poi infine ho l'ultimo file

Sub SalvaFilesStampaUnione():
Dim wDocBase As Document
Dim wNuovoDoc As Document
Dim sPath As String

Set wDocBase = ActiveDocument

'Attiva la stampa unione
With wDocBase.MailMerge
    .SuppressBlankLines = True
    With .DataSource
        .FirstRecord = wdDefaultFirstRecord
        .LastRecord = wdDefaultLastRecord
    End With

    'Attiva la modalità di anteprima dei campi
    .ViewMailMergeFieldCodes = False

    'Si porta sul primo record
    .DataSource.ActiveRecord = wdFirstRecord

    'Inizia il ciclo per lo scorrimento dei record
    While .DataSource.ActiveRecord < .DataSource.RecordCount
        'Seleziona la pagina e la copia
        wDocBase.Bookmarks("\Page").Range.Select
        Selection.Copy
   
        'Crea un nuovo documento e incolla la pagina copiata
        Set wNuovoDoc = Application.Documents.Add
        Selection.Paste
   
        'Imposta il percorso relativo al documento principale della Stampa Unione
        sPath = wDocBase.Path
     
        'Crea il nome del documento dal campo "Cognome" del documento principale
        'tu, ovviamente scegli il nome del Campo che ti serve.
        DocName = sPath & "/" & .DataSource.DataFields("CODES").Value
   
        'Salva il nuovo file come testo
        wNuovoDoc.SaveAs FileName:=DocName, FileFormat:=wdFormatTextLineBreaks
   
        'Stampa il nuovo file
        'wNuovoDoc.PrintOut Copies:=1, Background:=False
   
        'Chiude il nuovo file
        wNuovoDoc.Close False
   
        'Passa al record successivo
        .DataSource.ActiveRecord = wdNextRecord
    Wend
End With

End Sub
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
216
30
Office e VBA
32
Ho ritoccato il codice per cercare di evitare gli errori che hai riscontrato.
Prova questa versione:

Visual Basic:
Sub SalvaFilesStampaUnione()

Dim wDocBase As Document
Dim wNuovoDoc As Document
Dim sPath As String
Dim sDocName As String
Dim r As Integer

Set wDocBase = ActiveDocument

'Attiva la stampa unione
With wDocBase.MailMerge
    .SuppressBlankLines = True
    With .DataSource
        .FirstRecord = wdDefaultFirstRecord
        .LastRecord = wdDefaultLastRecord
    End With

    'Attiva la modalità di anteprima dei campi
    .ViewMailMergeFieldCodes = False

    'Si porta sul primo record
    .DataSource.ActiveRecord = wdFirstRecord

    'Inizia il ciclo per lo scorrimento dei record
    For r = 1 To .DataSource.RecordCount
     
        'Seleziona la pagina e la copia
        wDocBase.Bookmarks("\Page").Range.Select
        Selection.Copy

        'Crea un nuovo documento e incolla la pagina copiata
        Set wNuovoDoc = Application.Documents.Add
        Selection.Paste

        'Imposta il percorso relativo al documento principale della Stampa Unione
        sPath = wDocBase.Path
  
        'Crea il nome del documento dal campo "Cognome" del documento principale
        'tu, ovviamente scegli il nome del Campo che ti serve.
        sDocName = sPath & "\BOZZA_" & .DataSource.DataFields("CODES").Value

        'Salva il nuovo file come testo
        wNuovoDoc.SaveAs FileName:=sDocName, FileFormat:=wdFormatTextLineBreaks

        'Stampa il nuovo file
        'wNuovoDoc.PrintOut Copies:=1, Background:=False

        'Chiude il nuovo file
        wNuovoDoc.Close False

        'Passa al record successivo
        .DataSource.ActiveRecord = wdNextRecord
    Next r
End With

End Sub
Ricordati di togliere il commento all'istruzione PrintOut, nel caso decidessi di avviare anche la stampa.

TheTruster
 

DeniseC

Utente junior
22 Novembre 2020
54
6
Excel 2019
0
Ok adesso va perfettamente, mi manca solo una cosa adesso come faccio a farla partire automaticamente la stampa e unione come il primo codice che usavo?
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!