• 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.

Opgelost VBA code naar volgende stap nadat alles is gerefreshed

Dit topic is als opgelost gemarkeerd

peter59

Terugkerende gebruiker
Lid geworden
21 mei 2007
Berichten
2.759
Besturingssysteem
Windows 11
Office versie
Office 365
Ik ben bezig met een VBA-code die enkele seconden wacht, zodat alles de tijd krijgt om te verversen.
De onderstaande code is opgenomen met de macrorecorder, maar helaas loop ik daar vast.
Wie kan mij verder helpen? Alvast bedankt!
Code:
Sub Macro1()

    ActiveSheet.Unprotect
    ActiveWorkbook.RefreshAll
    
'wacht +/- 5 sec. zodat alles gerefreshed is en dan pas de beveiliging erop zetten
    
    ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
    
End Sub
 
Zet in de properties van de query dat background refresh niet toegestaan is(Vinkje uitzetten). De code wacht dan ook
 
Dat is natuurlijk niet de bedoeling.

Het werkblad bevat verschillende lijsten en tabellen, waaronder een querytabel.
In het hele werkblad zijn de cellen beveiligd of geblokkeerd, behalve de betreffende querytabel.
Deze heeft wat tijd nodig om te verversen, maar de VBA-code loopt gewoon door, waardoor de tabel niet de tijd krijgt om te verversen en het proces wordt afgebroken.
 
zet er 1 of meerdere doevents achter
Uitgebreid (BBCode):
 ActiveWorkbook.RefreshAll
 doevents:doevents:doevents
 
Waarom is dat niet de bedoeling dan? Het doet verder niets anders.
 
Inderdaad.
Dat vinkje uit, dan wacht de code tot de query gereed is.
 
Gewoon vinkje uitzetten. Sterker nog, wanneer de query eens langer werk heeft dan normaal, zal hij alsnog falen bij gebruik van ingebouwde wachttijden
 
Gebruik desnoods een klassemodule (bijv clsModQT) voor de afhandeling van het bijwerken.
Maak een instantie van de klassemodule.
Wijs de Querytabel toe aan de klassemoduleinstantie.

Code:
Public WithEvents qt As QueryTable
Private Sub qt_AfterRefresh(ByVal Success As Boolean)
    MsgBox qt.Destination
End Sub


' in het werkblad
Code:
Dim X As New ClsModQT

Sub initialiseer()
  Set X.qt = ThisWorkbook.Sheets(2).QueryTables(1)
End Sub
 
@Alle helpers

Helaas niet gelukt.

@edmoor en @JEC.
Wat bleek? Het vinkje bij de eigenschappen van de query met betrekking tot background refresh stond al uit.

@cow18 en @mvdvlist
Gestoeid met de DoEvent en OnTimeSerial en de application.wait.

@snb
Het geheel nog niet getest.

Hoe heb ik dit tot nu toe opgelost?
Door een hulpblad te maken - dat wordt verborgen met xlSheetVeryHidden - waar de querytabel wordt ververst.
De tabel in het beveiligde blad is verwijderd en op die plek is een koppeling naar het hulpblad geplaatst. Het hele blad is volledig beveiligd, op een paar cellen na.
Deze code wordt later aan een knop gekoppeld. Dit is nu de eenvoudige code; er wordt later nog een wachtwoord aan toegevoegd.

Code:
Sub RefreshData()
    ActiveWorkbook.RefreshAll
End Sub

Allen, nogmaals dank voor het meedenken.
 
Heel vreemd dat het niet werkt zonder background refresh. Heb je soms meerdere queries lopen bij refresh.All? Zo ja, vink bij alle queries die optie uit
 
Het gaat om 2 query's en bij beide staat de achtergrondvernieuwing uitgeschakeld.
Ik heb van alles geprobeerd, zoals de 2 query's één voor één verversen, maar helaas zonder succes.
Het vreemde is dat wanneer ik F8 gebruik en de code handmatig regel voor regel doorloop, de onderstaande code gewoon werkt.
Code:
Sub Macro1()

    ActiveSheet.Unprotect
    ActiveWorkbook.RefreshAll
    ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
    
End Sub
 
Hoeveel connecties zijn er aanwezig in je bestand? Zijn er connecties welke niet geladen zijn?
 
Terug
Bovenaan Onderaan