• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Macro één voor één uitvoeren.

Status
Niet open voor verdere reacties.

toetsenbord

Gebruiker
Lid geworden
13 dec 2010
Berichten
158
Beste forumleden,

Ik heb een excel-document met heel wat verbindingen (externe gegevens via web). Aangezien dit veel te zwaar is voor mijn computer kan ik niet alle verbindingen tegelijk vernieuwen.

Hiervoor heb ik een macro (macro1) gemaakt, waarin de opdracht wordt gegevens om de eerste 60 verbindingen te vernieuwen. De volgende macro (macro2) is voor de volgende 60 enz...

Nu was mijn vraag of ik die macro's (macro1, macro2 ...) automatisch één voor één kan uitvoeren, waarbij excel dus wacht om macro2 uit te voeren totdat macro1 volledig uitgevoerd is, anders wordt het weer te zwaar, omdat hij ze dan weer allemaal in één keer gaat hernieuwen.

(Als ik al deze macro's (macro1, macro2, macro3 etc.) met de hand moet uitvoeren, ben ik wel zeer lang bezig)

Mvg
 
Volgens mij zou volgende moeten doen (geen rekening houdend met foutmeldingen ed.

Code:
Sub run_macros()

Call macro_1
Call macro_2
Call macro_3

end sub
 
Laatst bewerkt:
@Demeter,

1). Die doet het zo niet. :p
2). De "Call" mag je ook weglaten. ;)
 
Hans je hebt gelijk kan ook zonder de call ervoor, maar vindt het zo altijd wat netter staan ;)

Code:
Sub run_macros()
 macro1
 macro2
 macro3
 End Sub
 
Helaas werkt deze niet...

Als ik het doe met

Sub Run_macros ()
Application.Run"Map.xlsm!Macro1
Application.Run"Map.xlsm!Macro2
End Sub

etc. lukt het niet (waarschijnlijk is dit ook niet de beste manier).

Hiermee wil Excel alle verbindingen in 1 keer vernieuwen, waardoor mijn pc vastloopt.
(Ik zoek dus eigenlijk iets waardoor Excel wacht tot dat de 1e volledig is afgerond alvorens de 2e te beginnen etc.)

Mvg
 
Uiteraard worden ze zoals hierboven geschreven, één voor één uitgevoerd.
 
Met een klasse module die de afterrefresh gebeurtenis van een querytable afvangt

maak de klasse module clsModQT

zet hierin

Code:
Public WithEvents qt As QueryTable
Private Sub qt_AfterRefresh(ByVal Success As Boolean)
    klaar=true
End Sub

maak een macromodule en zet hierin de publieke variabele 'klaar'

Code:
Public klaar As Boolean

Zet in het werkblad met de querytables

Code:
Dim X As New ClsModQT

Sub initialiseer()
   for each qts in thisworkbook.sheets(1).querytables
      klaar=false

      Set X.qt = qts
      qts.refresh false

      do
        doevents
      loop until klaar=true
   next
End Sub
 

Bijlagen

Laatst bewerkt:
Snb, is dit niet dubbelop? Als je de refresh in de achtergrond uitvoert en je wilt weten of hij klaar is heb je inderdaad een klassenmodule nodig. Als je de refresh niet in de achtergrond uitvoert volstaat
qt1.refresh false
qt2.refresh false
De tweede refresh wordt pas uitgevoerd als de eerste klaar is.

Toetsenbord doet er goed aan om meer info te geven. Gebruik je wel een querytable?
 
Laatst bewerkt:
@Picxel

Dat zou je zeggen, maar ik heb situaties meegemaakt waar dit de enige remedie was om de zaak goed te laten lopen.
 
Sorry voor de late reactie.
Ik weet niet zeker wat een querytable precies is.

Ik heb zoals je in excel kan doen gedaan: Gegevens > (Externe gegevens ophalen) Van Web.
Dus tenzij Excel dit automatisch zo maakt, heb ik geen querytable volgens mij...

Ik zal de oplossing van snb eens proberen, laat jullie dan iets weten. (Of werkt deze oplossing enkel wanneer je een querytable hebt?)

Mvg
 
Zonder querytabel werkt de oplossing van snb helaas niet...

Iemand nog andere ideeën?
Als ik het doe zoals ik in het begin zei, is het precies alsof excel al die verschillende macro's in 1 macro zet en die uitvoer, waardoor hetzelfde gebeurd dan als ik op 'alles vernieuwen' klik: excel hangt vast.

Mvg
 
als jij data ophaalt op de wijze die jij beschrijft heb je alleen maar querytalbel !

Controleer maar met

Code:
sub M_snb()
  msgbox Thisworkbook.sheets(1).querytables.count
end sub
 
Ok, dan zal ik iets fout hebben gedaan...

Het probleem is wel dat ik ook zeer veel tabbladen heb (300-tal). Moet ik dan in elk werkblad die laatste code plakken (in de veronderstelling dat bij alle werkbladen een querytabel bijhoort)?

En welke macro, .... moet ik nu precies runnen om er voor te zorgen dat met één klik elke verbinding per verbinding hernieuwt wordt (en gewacht word op de vorige tot die klaar is), of die macro1, macro2 ... runt (wachtend op de vorige tot die klaar is?)
 
Zet dit ergens in je werkmap en voer het uit.
Code:
Sub t()
    Dim ws As Worksheet, qt As QueryTable
    For Each ws In ActiveWorkbook.Worksheets
        For Each qt In ws.QueryTables
            qt.BackgroundQuery = False
        Next qt
    Next ws
End Sub
Als je nu refresht worden alle querytables NA elkaar vernieuwd.
Laat een vervolgvraag svp vergezeld gaan van je bestand (gestript tot een paar verbindingen).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan