Dim flag As Boolean 'mémorise la variable (bloque la MsgBox de la macro RAZ)
Sub Calcul()
Dim dur#, RT#, dmax&, t, ub&, Ncombi&, resu$(), f$, i&, Lat#, Lon#, sinLat#, cosLat#, Latmax#, j&, combi&, da#, x$, n&
dur = Timer
RT = 6378.137 'rayon terrestre en km
dmax = Int(Val(Feuil1.[P1])) 'distance maximum retenue en km, cellule à adapter éventuellement
With Feuil1.[A1].CurrentRegion.Offset(1)
If .Rows.Count = 1 Then Exit Sub
.Sort .Columns(3), xlAscending, Header:=xlNo 'tri croissant sur les latitudes, pour accélérer
t = .Resize(.Rows.Count - 1)
ub = UBound(t)
Ncombi = Application.Combin(ub, 2) 'nombre de distances à calculer
'---tableau des résultats---
ReDim resu(1 To ub, 1 To 1)
f = String(Len(CStr(dmax)), "0") & ".0 k\m " 'format des distances
For i = 1 To ub - 1
Lat = t(i, 3): Lon = t(i, 4): sinLat = Sin(Lat): cosLat = Cos(Lat)
Latmax = Lat + dmax / RT
For j = i + 1 To ub
If t(j, 3) > Latmax Then combi = combi + ub - j + 1: Exit For 'test sur les latitudes
combi = combi + 1
da = sinLat * Sin(t(j, 3)) + cosLat * Cos(t(j, 3)) * Cos(Lon - t(j, 4)) 'cosinus de la distance angulaire
da = Atn(Sqr(Abs(1 - da ^ 2)) / da) 'distance angulaire en radian
If da * RT < dmax Then
x = Format(da * RT, f)
resu(i, 1) = resu(i, 1) & x & t(j, 1) & "#"
resu(j, 1) = resu(j, 1) & x & t(i, 1) & "#"
If n Mod 10000 = 0 Then Application.StatusBar = "Temps écoulé " & Format((Timer - dur) / 86400, "hh:mm:ss") & _
" Réalisé " & Format(combi / Ncombi, "0.0 %") 'affichage de la progression dans la barre d'état
n = n + 1
End If
Next j, i
'---restitution---
flag = True: Call RAZ: flag = False
.Cells(1).Resize(ub, 2).Copy Feuil2.[A2]
Feuil2.[D2].Resize(ub) = resu
Feuil2.[A2].Resize(ub, 4).Sort Feuil2.[A2], xlAscending, Header:=xlNo, Orientation:=xlTopToBottom 'tri alphabétique
Feuil2.Activate
.Sort .Cells(1), xlAscending, Header:=xlNo 'tri alphabétique
End With
dur = (Timer - dur) / 86400
MsgBox "Nombre de distances retenues " & Format(n, "#,##0") & vbLf & "Durée du calcul " & Minute(dur) & " min " & Second(dur) & " s"
Application.StatusBar = ""
End Sub