Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Michele,
ho un database Excell creato con office 2019, che contiene il classico elenco:
(ESEMPIO)
Nprotocollo - nome - cognome - data di nascita - luogo di nascita
100 tizio caio 10/10/2000 Bari
100 caio tizio 13/11/1997 Roma
200 Mio Tuo 07/03/1978 Pisa
________________________________________________________________________________
vorrei riuscire a creare più file word (ho provato con la stampa unione e non riesco), ognuno con l'elenco di persone con lo stesso protocollo, cerco di spiegarmi meglio, nel caso dell'esempio dovrei avere due pagine word (o due file word), uno con protocollo nr. 100 che contenga tizio e caio, e l'altro con protocollo nr. 200 che contenga mio
Ho presupposto che la tua tabella di database sia una tabella di Excel denominata Tabella1.
Prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice: (vedi di sotto)
'========>>
Option Explicit
'-------->>
Public Sub Tester()
Dim WB As Workbook
Dim SH As Worksheet
Dim RngTabella As Range
Dim oTabella As ListObject
Dim arrUnique() As Variant
Dim oWord As Object
Dim oDoc As Object
Dim i As Long
Const sFoglio As String = **"Foglio1" '<<=== Modifica**
Const sTabella As String = **"Tabella1" '<<=== Modifica**
Set WB = ThisWorkbook
Set SH = WB.Sheets(sFoglio)
Set oTabella = SH.ListObjects(sTabella)
With oTabella
Set RngTabella = .Range
arrUnique = SortedUniqueList(.DataBodyRange.Value)
End With
Set oWord = CreateObject("Word.Application")
oWord.Visible = True
For i = 1 To UBound(arrUnique)
Set oDoc = oWord.Documents.Add
With RngTabella
.AutoFilter Field:=1, Criteria1:=arrUnique(i)
.Copy
End With
With oDoc
.Paragraphs(1).Range.PasteExcelTable False, False, False
.SaveAs2 "Protocollo " & arrUnique(i) & ".docx"
.Close
End With
Next i
RngTabella.AutoFilter Field:=1
oWord.Quit
Set oDoc = Nothing
Set oWord = Nothing
End Sub
'-------->>
Public Function SortedUniqueList(V As Variant)
Dim oSortedUniqueList As Object
Dim arrOut() As Variant
Dim sStr As String
Dim i As Long
Set oSortedUniqueList = CreateObject("System.Collections.Sortedlist")
With oSortedUniqueList
For i = LBound(V) To UBound(V)
sStr = V(i, 1)
If Not sStr = vbNullString Then
If Not .ContainsKey(sStr) Then
.Add Key:=sStr, Value:=i
End If
End If
Next i
ReDim arrOut(1 To .Count)
For i = 0 To .Count - 1
arrOut(i + 1) = .GetKey(i)
Next i
End With
SortedUniqueList = arrOut
End Function
'<<========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel
- Salva il file con l’estensione xlsm
- Alt+F8 per aprire la finestra di gestione delle macro
- Seleziona Tester
- Esegui
In questo modo il codice creerà un nuovo documento Word denominato con il contenuto della prima colonna della tabella preceduta dalla parola Protocollo, ad esempio Protocollo 200. Ogni documento Word conterrà un sottoinsieme della tabella originale contenente tutte le righe che corrispondono al Protocollo valore di interesse.
Potresti scaricare il mio file di prova Michele20210928.xlsm
Per evitare problemi di incollaggio che potrebbero essere causati dall'attuale editor della Community, ti consiglio vivamente di copiare il codice dal mio file prova direttamente nel modulo di codice che hai creato nella tua cartella di lavoro.
Postscriptum:
Potresti scaricare i 3 file Word creati com il mio codice utilizzando la tabella nel il mio file di prova Excel
===
Regards,
Norman