Word VBA, Macro uitvoeren middels interval/timer

Status
Niet open voor verdere reacties.

remcop1989

Gebruiker
Lid geworden
29 mrt 2012
Berichten
492
Ik heb de volgende situatie:

Vanuit een extern programma wordt een Word-document gevuld met stukken tekst en tabellen. 6 seconden na het openen van het Word-document wordt (in Word) een macro gestart "document_new" (vanuit "ThisDocument"). Deze macro start de macro "checktext" vanuit een module. Zie onderstaand:

Code:
[COLOR="#FF0000"]'eerst wordt in "ThisDocument" een timer ingesteld die na 6 seconden de macro "checktext" start[/COLOR]
Private Sub document_new()
Application.OnTime when:=Now + TimeValue("00:00:06"), Name:="checktext"
End Sub

[COLOR="#FF0000"]'de macro checktext wordt gestart vanuit een module[/COLOR]
Sub checktext()

With ActiveDocument.Content.Find
        .Text = "Deze offerte is gemaakt met behulp van Accountview."
        .Forward = True
        .Execute
    If .Found = True Then
        FormatTableQuotationLines_NL
        ActiveDocument.Activate
    Else: FormatTableQuotationLines_DE
    End If
End With
                   
End Sub


Als de tekst "Deze offerte is gemaakt met behulp van Accountview." wordt gevonden voert hij de macro "FormatTableQuotationLines_NL" uit, anders voert hij de macro "FormatTableQuotationLines_DE" uit. Deze 2 macro's zorgen voor een bepaalde opmaak van een tabel in het document en werken 100% correct. Deze tabel staat ALTIJD op pagina 2


Het probleem hierbij is als volgt:
Na 6 seconden zoekt Word dus naar de tekst "Deze offerte is gemaakt met behulp van Accountview.".
Deze tekst staat onder aan een tabel in het Word-document. Reden hiervoor is dat er zo voor gezorgd wordt dat de macro die de tabel opmaakt ook pas uitgevoerd wordt nadat de tabel er volledig in staat.

Het kan echter zijn dat het plaatsen van de tabel in Word langer dan 6 seconden duurt. Dit zorgt ervoor dat de tekst "Deze offerte is gemaakt met behulp van Accountview." er na 6 seconden nog niet instaat en dus de "opmaak-macro" niet uitgevoerd wordt.

Hoelang het duurt om de tabel in Word te zetten is niet op voorhand te zeggen. De ene keer is dit 3 seconden, dan weer 5 seconden, dan weer 10 seconden en dan weer 18 seconden. Het simpel "verlengen" van de timer is niet te doen.

NB: in het document waar zich het probleem nu voordoet duurt het tussen de 15 en 20 seconden voordat de tabel volledig in Word staat. Zet ik de timer op 22 seconden, dan loopt alles op rolletjes en voert hij de macro perfect uit



Ik zelf denk nu aan een oplossing die als volgt werkt:
stap 1) controleer of het document op pagina 1 een bepaald kenmerk (stuk tekst) bevat
stap 2) als dit zo is: start dan om de 2 seconden de macro "checktext" en controleer op de zin "Deze offerte is gemaakt met behulp van Accountview."

Hiermee zou e.e.a. correct moeten werken mijns inziens. Hiertoe heb ik al de volgende code gevonden, maar deze zorgt ervoor dat de macro voortijdig stopt en ik weet niet waarom:

In "ThisDocument":
Code:
Private Sub document_new()

Starttimer

End Sub

In de module:
Code:
Sub Starttimer()
    volgendestart = Now + TimeValue("00:00:02")
    Application.OnTime volgendestart, "checktext"
End Sub




Wie helpt mij uit de brand?
 
Laatst bewerkt door een moderator:
Vanaf de iPad is contorleren van code wat lastig,
Toch even een reactie; om de timer door te laten lopen moet deze weer getart worden vanuit checktext wanneer de tekst nog niet gevonden is. Dat gebeurt nu niet, zover ik zie
Mvg Leo
 
Laatst bewerkt:
Oké, hoe zou ik dat het beste kunnen doen dan?

Opvallend is wel dat hij de tekst vindt en de tabel deels al opmaakt met bovenstaande.
 
Ik zou het laden van de tabel (dat gebeurt toch met een macro ?) afsluiten met

Code:
thisdocument.variables("nieuw")="accountview"

controleren met met

Code:
Do until thisdocument.variables("nieuw")<>" "
  doevents
Loop

Maar waarom het laden zo lang moet duren is mij een raadsel en volgens mij ook simpel op te lossen (waardoor je deze hulpconstructies niet meer nodig hebt).
 
Dank je voor je reactie. Echter gebeurd het "laden" van de tabel en andere teksten vanuit het programma naar Word op de achtergrond vanuit een Foxpro omgeving waar ik verder geen invloed op heb. Wat er dus daar gebeurd weet ik niet. Zodra ik alles compleet heb kan ik enkel op "offerte maken" klikken en hij begint met alles in Word te zetten.

Kan ik die dountil loop niet gebruiken bij het zoeken naar de tekst die de macro om de tabel op te maken start?
 
Laatst bewerkt:
De macro die zoekt naar die tekst wordt middels een timer (6 seconden na document_new) gestart. Als die tekst wordt gevonden begint hij met de tabel opmaak, anders niet.

Dit is niet de juiste manier blijkt nu, omdat het "in Word zetten" van de teksten vanuit het Foxpro programma nooit een vaste tijdsduur heeft maar altijd wisselt en vaak langer duurt dan 6 seconden. Gevolg: de tekst wordt niet gevonden en de tabel niet opgemaakt.

Ik heb geen invloed op het Foxpro programma dat de teksten in Word zet.
Ook is het niet de oplossing om de timer te verlengen. Ik kan de timer nu op 20 seconden zetten maar als het dan een keer 24 seconden duurt heb ik weer hetzelfde probleem. Anderzijds, als het in Word zetten van de teksten eens 5 seconden duurt kan ik 20 seconden wachten.


EDIT 20 maart 2014 - 8:27 uur
Ik heb de macro (checktext) aangepast (zie code hieronder). Deze macro start o.b.v. de zin "Deze offerte is gemaakt met behulp van Accountview." de opmaak van de tabel. Dit werkt MAAR hij blijft hem nu continue uitvoeren......

Code:
Sub checktext()

With ActiveDocument.Content.Find
        .Text = "Deze offerte is gemaakt met behulp van Accountview."
        .Forward = True
        .Execute
        'The Do...Loop statement repeats a series of
        ' actions each time this style is found.
        Do Until .Execute = True
            If .Found = True Then
                FormatTableQuotationLines_NL
                ActiveDocument.Activate
            Else: FormatTableQuotationLines_DE
            End If
        Loop
End With
                   
End Sub
 
Laatst bewerkt:
De basisstruktuur van zo'n macro:

Code:
Sub M_snb()
    With ActiveDocument.Content.Find
        Do Until .Found = True
           .Execute "aaa"
        Loop
    End With

    MsgBox "gevonden"
End Sub
 
Ik heb e.e.a. werkend. In volgorde hoe ze uitgevoerd worden:

Op de achtergrond opent het document zich en de teksten worden erin gezet. De volgende macro wordt gestart:
Code:
Private Sub document_new()

Application.OnTime when:=Now + TimeValue("00:00:01"), Name:="checktext"
                   
End Sub

Bovenstaande macro start de macro "checktext" welke begint met zoeken naar de tekst "Deze offerte is gemaakt met behulp van Accountview.":


Code:
Sub checktext()

With ActiveDocument.Content.Find
Rem MsgBox "macro gestart met zoeken"
     Do Until .Found = True
        .Text = "Deze offerte is gemaakt met behulp van Accountview."
        .Forward = True
        .Execute
     Loop
            Rem MsgBox "tekst gevonden"
            If .Found = True Then
                FormatTableQuotationLines_NL
                ActiveDocument.Activate
            Else: FormatTableQuotationLines_DE
            End If
End With
                   
End Sub


Nu echter het volgende:

Als ik de 2 "messageboxes" van de Rem afhaal en laat tonen, dan werkt de macro en start hij de macro "FormatTableQuotationLines_NL".
Laat ik deze op de Rem staan, dan werkt e.e.a. niet en blijft het Foxpro programma hangen.


Iemand een idee hoe dit kan?




EDIT 20-03-2014 om 21:58 uur
Ik heb dus nu ook een idee waarom hij blijft hangen: zodra een nieuw document wordt geopend / aangemaakt, start de macro "document_new" hierboven. Deze start de macro "checktext" in en die voert gewoon continue aan 1 stuk door de loop uit.

Ik moet dus nu iets gaan verzinnen waarmee ik de loop iedere 3 seconden b.v. laat uitvoeren.
 
Laatst bewerkt:
Oké, we zijn weer wat verder.

Ik heb nu het volgende:


Bij het openen van een nieuw document wordt de macro "timermacro" gestart:

Code:
Sub timermacro()

    Dim dtSaveTime As Date
     
    dtSaveTime = Now + TimeValue("00:00:04")
    Application.OnTime dtSaveTime, "timermacro"
    Call checktext

End Sub


Deze "timermacro" start iedere 4 seconden de macro checktext:
Code:
Sub checktext()

With ActiveDocument.Content.Find
        .Text = "Deze offerte is gemaakt met behulp van Accountview."
        .Forward = True
        .Execute
            If .Found = True Then
                FormatTableQuotationLines_NL
                ActiveDocument.Activate
            Else: FormatTableQuotationLines_DE
            End If            
End With
                   
End Sub

Dit werkt helemaal prima, MAAR: de timer blijft nu maar doorlopen iedere 4 seconden en stopt niet.

Ik wil de macro laten stoppen zodra hij "FormatTableQuotationLines_NL" of "FormatTableQuotationLines_DE" start.


Ik ben op internet aan het zoeken, maar vind niets dat mij helpt. Weet iemand hier de oplossing?
 
Dat staat al tig keer in allerlei fora.
De instruktie 'ontime' moet gestopt worden.
Kijk ook eens in de hulpbestanden van de VBEditor; lemma 'ontime' (veel beter dan ongericht zoeken op internet)
 
Dat staat al tig keer in allerlei fora.
De instruktie 'ontime' moet gestopt worden.
Kijk ook eens in de hulpbestanden van de VBEditor; lemma 'ontime' (veel beter dan ongericht zoeken op internet)


Hartelijk dank voor de hulp. Ik heb het nagelezen. Ik moet aan "Application.OnTime dtSaveTime, "timermacro" toevoegen hoelang het mag duren voordat hij stopt. Dit is echter niet helemaal wat ik zoek....:

Ik zoek een manier waarop hij stopt zodra hij de "FormatTableQuotationLines_NL" of "FormatTableQuotationLines_DE" start.


Het kan zijn dat ik het niet goed begrijp. Zou iemand me iets meer in de juiste richting kunnen helpen?

Ik zoek dus een manier om:

- de timer te starten
- uit te laten voeren totdat hij de tekst gevonden heeft en de macro "FormatTableQuotationLines_NL" of "FormatTableQuotationLines_DE" start
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan