PDA

View Full Version : [vba word] creare una tabella dentro tabella


john_revelator
08-12-2007, 11:39
Salve a tutti. Scusate il titolo un pò criptico.
Forse un'immagine sarà più d'aiuto.
In pratica devo creare un documento word con questo layout:

http://img134.imageshack.us/my.php?image=senzatitolo1ds7.jpg

Il problema è che non ho la più pallida idea di come fare.

Il codice che ho scritto finora è questo


Private Sub cmdCrea_Click()

Set objword = CreateObject("Word.Application")
objword.Visible = True
Set objdoc = objword.Documents.Add

Set objRange = objdoc.Range()
objdoc.Tables.Add objRange, 1, 2
Set objtable = objdoc.Tables(1)


strQueryName = "qrylingue"
Set objRST = Application.CurrentDb.OpenRecordset(strQueryName)
objtable.Cell(1, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
objtable.Columns(1).PreferredWidth = 150
objtable.Columns(2).PreferredWidth = 350


objtable.Cell(1, 1).Range.Text = "Altra(e) lingua(e)"
objtable.Cell(1, 1).Range.Font.Name = "Arial Narrow"
objtable.Cell(1, 1).Range.Font.Size = 11
objtable.Cell(1, 1).Range.Font.Bold = False


objtable.Rows.Add
objtable.Cell(2, 1).Range.Text = "Autovalutazione"
objtable.Cell(2, 1).Range.Font.Name = "Arial Narrow"
objtable.Cell(2, 1).Range.Font.Size = 11
objtable.Cell(2, 1).Range.Font.Bold = False

' qua ci vanno le voci comprensione, parlato, scritto

objtable.Rows.Add
objtable.Cell(3, 1).Range.Text = "Livello europeo (*)"
objtable.Cell(3, 1).Range.Font.Name = "Arial Narrow"
objtable.Cell(3, 1).Range.Font.Size = 11
objtable.Cell(3, 1).Range.Font.Bold = False

' qui ci vanno le voci ascolto, lettura (incolonnate sotto comprensione),
' interazione orale (sotto parlato) e produzione orale


i = 3

Do While Not objRST.EOF

For k = 0 To objRST.Fields.Count - 1

lingua = objRST.Fields("lingua")
ascolto = objRST.Fields("cvep_ascolto")
lettura = objRST.Fields("cvep_lettura")
interazione = objRST.Fields("cvep_interazione")
porale = objRST.Fields("cvep_produz_orale")
pscritta = objRST.Fields("cvep_produz_scritta")

Next k

objtable.Rows.Add
objtable.Cell(i + 1, 1).Range.Text = lingua
objtable.Cell(i + 1, 1).Range.Font.Name = "Arial Narrow"
objtable.Cell(i + 1, 1).Range.Font.Size = 10
objtable.Cell(i + 1, 1).Range.Font.Bold = False

' qua andranno i valori del recordset

i = i + 1

objRST.MoveNext
Loop

End Sub



Spero che qualcuno mi possa aiutare. E' l'ultima cosa che mi manca per il mio lavoro. :)

john_revelator
14-12-2007, 15:25
Scusate se uppo ma proprio non ne vengo fuori.
Dopo tanti sbattimenti ho fatto decisamente dei progressi. La tabella col layout mostrato in figura sono riuscito a crearlo ma probabilmente sbaglio qualcosa a livello concettuale perchè mi ritrovo con delle righe vuote alla fine del mio documento. Spero che qualcuno abbia la pazienza di dedicarmi 5 minuti e scaricare il file in questione. :)

http://files-upload.com/files/678289/word.zip

edit. Penso che il problema stia in questa linea di codice

objword.ActiveDocument.Tables.Add Range:=objword.ActiveDocument.Tables(1).Cell(2, 2).Range, numrows:=2 + contalingue, NumColumns:=5, _
DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed

che uso per creare la tabella all'interno della mia cella.

Il fatto è che ho dovuto inserire quest'istruzione 2 volte affinchè la tabella venisse creata.
Inserendola una volta soltanto non funziona

john_revelator
17-12-2007, 10:16
Nessuno che abbia mai avuto lo stesso problema? :muro:

john_revelator
18-12-2007, 14:35
:help:

john_revelator
18-12-2007, 16:11
Ho risolto e si trattava di una sciocchezza. :)
Semplicemente all'interno del mio codice per due volte eseguivo questa istruzione

objtable.Rows.Add

che era superflua.

Da qui le righe in più che venivano create.

Se qualcuno comunque mi sapesse spiegare la ragione per la quale per poter creare una tabella all'interno di una cella sono costretto ad eseguire questa istruzione due volte:

objword.ActiveDocument.Tables.Add Range:=objword.ActiveDocument.Tables(1).Cell(2, 2).Range, numrows:=2 + contalingue, NumColumns:=5, _
DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed

mi toglierebbe una grossa curiosità.
Grazie a tutti per l'attenzione. ;)