Hallo,
Ik ben bezig met een Word 2003 script op tabellen altijd passend op de pagina te krijgen.
De werking van het script is als volgt:
Eerst wordt de tabel met table.AutoFitBehavior(wdAutoFitContent) automatisch gefit en als de tabel dan niet op de pagina past, wordt de fontgrootte naar beneden bijgesteld. Dit wordt herhaald totdat de tabel past.
Nou is werkt het scriptje half. Als ik overal msgboxen gaat het (soms) goed, maar over het algemeen doet het niks. Dit heeft er mee te maken, dat er een vertraging in de bewerkingen zit.
Als "table.AutoFitBehavior (wdAutoFitContent)" wordt aangeroepen en vervolgens wordt de breedte van de tabel opgevraagd, dan wordt nog de oude breedte doorgegeven, met msgbox ertussen is dit soms niet zo.
Ik heb ook geprobeerd sleep(1000) toe te voegen maar dit hielp ook niet.
Mijn vraag is dat ook hoe ik kan zorgen dat het opvragen van de breedte pas gedaan wordt, als Word klaar is met het resizen van de tabel.
Ik denk in hierbij iets in de trant van.
queuedcommands.flush
of iets van:
Do While queuedcommands.buffersize > 0
sleep(100)
Loop
Weet er iemand of er zo iets kan in VBA? Of heeft iemand hiervoor misschien een andere oplossing?
Groet,
Edwin
Het script ziet er als volgt uit:
Ik ben bezig met een Word 2003 script op tabellen altijd passend op de pagina te krijgen.
De werking van het script is als volgt:
Eerst wordt de tabel met table.AutoFitBehavior(wdAutoFitContent) automatisch gefit en als de tabel dan niet op de pagina past, wordt de fontgrootte naar beneden bijgesteld. Dit wordt herhaald totdat de tabel past.
Nou is werkt het scriptje half. Als ik overal msgboxen gaat het (soms) goed, maar over het algemeen doet het niks. Dit heeft er mee te maken, dat er een vertraging in de bewerkingen zit.
Als "table.AutoFitBehavior (wdAutoFitContent)" wordt aangeroepen en vervolgens wordt de breedte van de tabel opgevraagd, dan wordt nog de oude breedte doorgegeven, met msgbox ertussen is dit soms niet zo.
Ik heb ook geprobeerd sleep(1000) toe te voegen maar dit hielp ook niet.
Mijn vraag is dat ook hoe ik kan zorgen dat het opvragen van de breedte pas gedaan wordt, als Word klaar is met het resizen van de tabel.
Ik denk in hierbij iets in de trant van.
queuedcommands.flush
of iets van:
Do While queuedcommands.buffersize > 0
sleep(100)
Loop
Weet er iemand of er zo iets kan in VBA? Of heeft iemand hiervoor misschien een andere oplossing?
Groet,
Edwin
Het script ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| Function GetTableWidth_px(tbl As table) As Double
GetTableWidth_px = 0
Dim cll As Cell
For Each cll In tbl.Rows(1).Cells
GetTableWidth_px = GetTableWidth_px + cll.width
Next
End Function
Sub SetTableWidth_perc(tbl As table, width As Double)
tbl.AutoFitBehavior (wdAutoFitFixed)
tbl.PreferredWidthType = wdPreferredWidthPercent
tbl.PreferredWidth = 100
End Sub
Sub AutofitTable(tbl As table, sizedown As Boolean)
If (sizedown) Then
Dim rw As row
Dim cll As Cell
For Each rw In tbl.Rows
' Iteratie over rijen gaat sneller dan over cellen
If rw.range.Font.Size = 9999999 Then
For Each cll In rw.range.Cells
cll.range.Font.Size = cll.range.Font.Size - 1
Next
Else
rw.range.Font.Size = rw.range.Font.Size - 1
End If
Next
End If
' first set width to 100%
SetTableWidth_perc tbl:=tbl, width:=100
' get target width in pixels
Dim targetwidth As Double
targetwidth = GetTableWidth_px(tbl)
With tbl
.AutoFitBehavior (wdAutoFitContent)
End With
' get current width in pixels
Dim currentwidth As Double
currentwidth = GetTableWidth_px(tbl)
If currentwidth > targetwidth Then
AutofitTable tbl:=tbl, sizedown:=True
End If
End Sub
Sub AutofitTables()
Dim tbl As table
For Each tbl In Selection.range.Tables
AutofitTable tbl:=tbl, sizedown:=False
Next
End Sub |
[ Voor 39% gewijzigd door Zaklamp529 op 17-03-2007 21:00 . Reden: code binnen code tags geplaatst ]