Perhaps I've missed the point but its not that hard. There are two approaches '''Use a timer tick and D''''''oEvents.''' 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 D''''''oEvents ' 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 Sub '''Use 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 Sub This 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 D''''''oEvents are not small, if they are small the D''''''oEvents introduce a fair bit of overhead.