[VBA/Word2003] bewerkingen onmiddelijk uitvoeren

Pagina: 1
Acties:

  • Zaklamp529
  • Registratie: Oktober 2005
  • Laatst online: 04-11-2025
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:
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 ]


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB/AI

Front verplichte underscores

Wat de msgboxen moeten doen snap ik niet helemaal, maar
Zaklamp529 schreef op zaterdag 17 maart 2007 @ 20:41:
Ik heb ook geprobeerd sleep(1000) toe te voegen maar dit hielp ook niet.
hmm, vreemd. Screenupdate forceren:
Application.ScreenUpdating = False
Application.ScreenUpdating = True

Maar dat zou niet mogen helpen. :+

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • Zaklamp529
  • Registratie: Oktober 2005
  • Laatst online: 04-11-2025
F_J_K schreef op maandag 19 maart 2007 @ 20:40:
Wat de msgboxen moeten doen snap ik niet helemaal, maar
Die doen ook niks, maar ik ging msgboxen als printouts gebruiken en toen werkte het opeens wel een keer.
[...]

hmm, vreemd. Screenupdate forceren:
Application.ScreenUpdating = False
Application.ScreenUpdating = True

Maar dat zou niet mogen helpen. :+
Helaas werkt het ook niet.
Ik heb Application.ScreenUpdating op false gezegd
Hierna heb ik telkens Application.ScreenRefresh aangeroepen,
hierna Application.ScreenUpdating weer op true gezet.
Maar helaas, het resizen van de tabel laat ie pas zien als het script is afgelopen (en de width wordt kennelijk dan ook pas aangepast)