Don’t fill your code with unnecessary DoEvents statements, especially within time-critical loops. If you can’t avoid that, at least you can reduce the overhead by invoking DoEvents only every N iterations of the loop, using a statement like this:
If (loopNdx Mod 10) = 0 Then DoEvents
Alternatively, if you use DoEvents just to trap mouse and keyboard activity, you can call it only if there are pending items in the event queue; you can check this condition with the GetInputState API function:
Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long' ...If GetInputState() Then DoEvents