Tienes que forzar un 'refresh'... pero mejor que dentro del bucle (que puede ralentizar aún más la operación y que puede depender de cuanto tarde en ejecutarse cada ciclo, es usar un timer.... ajustando su evento a 1 segundo (timProgreso.Interval = 1000)...
Cada minuto, al mismo tiempo actualizas el formulario completo, suele ponerse en blanco...
Private Sub TimProgreso_Timer()
Static segs As Byte
' Si usas un progressbar....
progressbar.Value = X ' este será un valor relativo previamente calculado en el bucle
progressbar1.Refresh
' O si usas un simple label o textbox...
labprogreso.Caption = "Registro: " & cstr(x) & " de " & cstr(y)
labprogreso.Refresh
DoEvents
segs = (segs + 1)
If (segs = 60) Then ' Cada minuto, refresca todo el formulario...
segs = 0
form1.Refresh
DoEvents
End If
End Sub
Nota que no afectamos al bucle, así puede ser llamado desde diferentes funciones que tengan tareas pesadas, en vez de meter código excesivo en cada función, simplemente antes del bucle ponemos el timer en marcha (ponemos a cero el valor de la barra de progreso, etc...), y al término lo desactivamos (y ocultamos el control encargado de mostrar el progreso), vamos que se necesita una función con un parámetro de activación y alguno opcional para señalar el valor máximo y mínimo al comienzo y tal vez el valor de avance) ... El contador del bucle debería ser accesible, es decir declarado a nivel de módilo, para que el timer lo tenga disponible.
En fin, no creo que haga falta señalar detalles específicos...