Allora…
Nel tuo file Excel creati una mappa dei campi disponibili e della loro posizione nel documento Word.
Per prova io ho creato questa in Foglio2:
uploadIn colonna A le intestazioni, nello stesso ordine con cui compaiono nel tuo elenco
In colonna B inserisci il numero di sequenza di quel campo nel file Word; nell' esempio il primo campo sara' "Nome del Progetto", seguito da "Comune", etc
In colonna C il numero di interlinee che devono essere inserite dopo il contenuto di quel campo (quindi tra il valore di un campo e l' intestazione del campo successivo).
In colonna D metterai il testo che vuoi compaia nel doc; io ho usato le stesse scritte di colonna A
A questo punto inserisci questo codice nel tuo file:
- Codice: Seleziona tutto
Sub plizz()
Dim myWd As Object, myDoc As Object, myMap As Worksheet, myHead As String
Dim myProgStart As Range, I As Long, J As Long, myMatch, myCampo As String
myHead = "SCHEDA DI RILEVAZIONE INIZIATIVE/PROGETTI/CANTIERI" '<<< Titolo di pagina
Set myWd = CreateObject("Word.application")
Set myDoc = myWd.documents.Add
myWd.Visible = True
' Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
Set myMap = ThisWorkbook.Sheets("Foglio2") '<<< Il foglio con la "mappa" del Doc da creare
Set myProgStart = ThisWorkbook.Sheets("Foglio1").Range("A4") '<<< L' inizio dell' elenco
'
I = 0
Do
If myProgStart.Offset(I, 0) <> "" Then
myWd.Selection.typetext myHead
myWd.Selection.TypeParagraph: myWd.Selection.TypeParagraph
For J = 1 To 1000
myMatch = Application.Match(J, myMap.Range("B:B"), False)
If Not IsError(myMatch) Then
myCampo = myMap.Range("D1").Offset(myMatch - 1, 0).Value ' myProgStart.Offset(I, myMatch).Value
myWd.Selection.typetext Text:=myCampo
myWd.Selection.TypeParagraph
Call formatCampo(myWd)
myWd.Selection.typetext Text:=myProgStart.Offset(I, myMatch - 2).Value & " "
myWd.Selection.TypeParagraph
Call formatText(myWd)
For k = 1 To myMap.Range("B1").Offset(myMatch, 1).Value - 1
myWd.Selection.TypeParagraph
Next k
Else
myWd.Selection.InsertBreak Type:=7 'wdpagebreak
'new page, new project
Exit For
End If
Next J
Else
Exit Do
End If
I = I + 1
Loop
Set myWd = Nothing
myWd.Visible = True
End Sub
Sub formatText(ByRef ilDoc)
ilDoc.Selection.MoveUp Unit:=4, Count:=1, Extend:=1
With ilDoc.Selection.Font
.Name = "Times New Roman"
.Size = 11
.Bold = False
.Italic = False
.Underline = 0
.UnderlineColor = -16777216
.Strikethrough = False
.DoubleStrikeThrough = False
.Outline = False
.Emboss = False
.Shadow = False
.Hidden = False
.Smallcaps = False
.Allcaps = False
.Color = -16777216
.Engrave = False
.Superscript = False
.Subscript = False
.Spacing = 0
.Scaling = 100
.Position = 0
.Kerning = 0
.Animation = 0
End With
ilDoc.Selection.MoveDown Unit:=4, Count:=1
End Sub
Sub formatCampo(ByRef ilDoc)
ilDoc.Selection.MoveUp Unit:=4, Count:=1, Extend:=1
With ilDoc.Selection.Font
.Name = "Times New Roman"
.Size = 11
.Bold = True
.Italic = False
.Underline = 1
.UnderlineColor = -16777216
.Strikethrough = False
.DoubleStrikeThrough = False
.Outline = False
.Emboss = False
.Shadow = False
.Hidden = False
.Smallcaps = True 'Maiuscoletto
.Allcaps = False
.Color = RGB(255, 0, 0) 'Rosso
.Engrave = False
.Superscript = False
.Subscript = False
.Spacing = 0
.Scaling = 100
.Position = 0
.Kerning = 0
.Animation = 0
End With
ilDoc.Selection.MoveDown Unit:=4, Count:=1
End Sub
Le istruzioni marcate <<< sono da personalizzare
Inserisci tutto in un nuovo Modulo di codice del tuo "progetto vba":
-Da excel, Alt-F11 e ti si apre l' editor delle macro
-Menu /Inserisci /Modulo
-Copi il codice e lo incolli nel frame di dx
Poi torni sul foglio dei tuoi dati ed esegui la macro:
-Alt-F8, scegli "plizz" dall' elenco che ti propone, premi Esegui
Prova su un elenco con una decina di righe, cosi' calcoli anche il tempo che serve per elenchi piu' lunghi.
La macro si ferma sulla prima riga dell' elenco che in colonna A risulta vuoto. Poiche' tu hai usato celle unite, la cella A9 risultera' vuota e la creazione dell' elenco si interrompera'.
Personalmente ritengo deprecabile l' uso di celle unite in tabelle che debbano essere elaborate (e non solo visualizzate), quindi ti suggerisco di eliminare tutte le unioni celle prima di eseguire la macro.
La macro crea un nuovo documento Word, con tante pagine quante sono le righe della tabella excel.
Ho inserito due routine che formattano i titoli dei campi (format Campo) e il testo dei campi (format Text); modificando i vari parametri puoi modificare la formattazione come da tue preferenze.
Nota che ho ignorato il file ".dot" (la sua utilita' sarebbe stata maggiore se fossero gia' stati impostati i nomi dei campi).
Il file Word rimane aperto, cosi' lo puoi verificare e salvare come da tue preferenze.
Spero sia di qualche utilita'…
Ciao