Perhaps I've missed the point but its not that hard.
There are two approaches
Use a timer tick and DoEvents.
Sub Form_Load() 'Disable controls that have to wait for your long process. cmdThatUsesData.enabled = false 'Set timer interval to something low and enable it DBLoadingTimer.interval = 1 DBLoadingTimer.enabled = true DoEvents ' do the rest of your form loading End Sub Sub DBLoadingTimer_Timer() 'Disable the timer DBLoadingTimer.enabled = false 'Do the long process but put doevents every so often 'Enable the controls cmdThatUsesData.enabled = true End SubUse a timer tick and Do heavy stuff in separate activeX exe component
The timer set up if the same but the time calls a method on an object in a separate activeX exe component
You use an Event to signal completion of the task
Sub DBLoadingTimer_Timer() 'Disable the timer DBLoadingTimer.enabled = false DBLoader.Loadstuff End Sub Sub DBLoader_StuffDone() 'Enable the controls cmdThatUsesData.enabled = true End SubThis code is off the top of my head, so probably not exactly right.
The first approach can lead to a jerky GUI if the steps between DoEvents are not small, if they are small the DoEvents introduce a fair bit of overhead.