Hey folks! Don't use sleep when you already have a loop with doevents, it's like having two cakes on one birthday party or something... At least sleep is not the right one.
Code:
Private Sub Skate(ifSkate As Boolean)
    'makes the guy skate
    
    Do Until ifSkate = False
        If SkateVar = 1 Then Player.DC = picPlayer.hDC
        If SkateVar = -1 Then Player.DC = picPlayer2.hDC
        Dealy  100
        SkateVar = Val(SkateVar) * (-1)
        ifSkate = False
    Loop
End Sub
What you do is replace the sleep call with Dealy instead, now if it goes too slow or too fast you just change the amount of milliseconds to pass on Dealy.