Wow sorry, somehow I totally missed the part about you already trying .Sleep() and not liking the 'gui freeze.'
I guess the easiest way (without having to explain a whole lot) would be to do as pootuba said and making a custon wait function: the key part is calling Application.DoEvents()
..from post above..
Code:
Sub Wait(ByVal cTime As Long)
Dim sTime As Long
sTime = GetTickCount + cTime
Do While sTime >= GetTickCount
Application.DoEvents()
Loop
End Sub
the parameter cTime is the number of "ticks" to wait, a tick being some very small fraction of a second. (idk off top of my head..) This is probably the easiest way. Replace all of the System.Threading.Sleep() calls with a call to the above Sub.