la primera opcion que es facil es mientras el programa este buscando los puertos poner el boton cmdempezar.enabled=false hasta que temine el for .

Private Sub CmdEmpezar_Click()
On Error GoTo Errores
'Inicializamos el control progress bar
CmdEmpezar.Enabled = False
PB.Visible = True
PB.Min = TxtPuertoIni.Text
PB.Max = TxtPuertoFin.Text
Me.MousePointer = 11
Lista.Clear
CmdSalvar.Enabled = False
'Montamos el bucle q recorrerá todos los puertos intetando conectar
For i = TxtPuertoIni.Text To TxtPuertoFin.Text
WS.Close
lPuerto = i
PB = lPuerto
WS.Connect TxtIP.Text, lPuerto
DoEvents
'Salimos si se pulsa cancelar
If bSalir Then
Reiniciar
Exit Sub
End If
Next
'MsgBox "Final del escaneo de Puertos", vbInformation, "Información"""
CmdEmpezar.Enabled = True
Reiniciar
Me.MousePointer = 0
Exit Sub
Errores:
MsgBox "Error en alguno de los parámetros", vbCritical, "Error"
End Sub

Muy facil no

Para cuando el boton este desactivado. Hay unas propiedades de los botones que permiten dependiendo del estado en que esté dicho control establezcan diferentes imagenes.
Por ejemplo: cmdempezar.disabledpicture= ruta de la imagen (que en este caso sería la misma imagen en vez de verde en gris

Saludos.