Bonjour,
Je suis novice en vba et j'ai un calcul de cap à effectuer à partir de la latitude et la longitude de 2points consecutifs fournis à partir d'un fichier Excel.
Sous Excel ça donne ça (sachant que la latitude se situe colonne 12 et la longitude colonne 11):

N1: latitude du point de départ
N2: latitude du point d'arrivée
E1:longitude du point de départ
E2:longitude du point d'arrivée
Npole=1.570796
a=Npole-N2
b=Npole-N1
c=arcos(sin(N1).sin(N2)+cos(N1).cos(N2).cos(E1-E2))

Avant correction trigonométrique:

F=(cos(a)-cos(b).cos(c))/(sin(b).sin(c))
cosA=SI(F>1;1;SI(F<-1;-1;F))
A=arcos(cos(A))
Cap1=A*57.295779 (//pour avoir le cap en degré)

Après correction eventuelle:

Cap=SI(ET(E1=E2;N2>N1);0;SI(ET(E1=E2);N2<N1);180;SI(ET(E1=E2;N2=N1;0;SI(E1<E2;Cap1;360-Cap1))))


Sous VBA j'ai fait ça (c'est surement pas très concis!):

Option Explicit

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub cap()
Dim caz As Integer
caz = 1
Const Npole = 1.570796
Dim cap1
For caz = 1 To 5000
Cells(caz, 46).Value = Npole - CStr(Cells((caz + 1), 12).Value)
Cells(caz, 47).Value = Npole - CStr(Cells(caz, 12).Value)
Cells(caz, 48).Value = Sin(CStr(Cells(caz, 12).Value)) * Sin(CStr(Cells(caz + 1, 12).Value)) + Cos(CStr(Cells(caz, 12).Value)) * Cos(CStr(Cells(caz + 1, 12).Value)) * Cos(CStr(Cells(caz, 11).Value) - CStr(Cells(caz + 1, 11).Value))
Cells(caz, 49).Value = Atn(-(Cells(caz, 48).Value) / Sqr(-(Cells(caz, 48).Value) * (Cells(caz, 48).Value) + 1)) + 2 * Atn(1)
Cells(caz, 50).Value = (Cos(Cells(caz, 46).Value) - Cos(Cells(caz, 47).Value) * Cos(Cells(caz, 49).Value)) / (Sin(Cells(caz, 47).Value) * Sin(Cells(caz, 49).Value))
If Cells(caz, 50).Value > 1 Then
Cells(caz, 51).Value = 1
ElseIf Cells(caz, 50).Value < -1 Then
Cells(caz, 51).Value = -1
Else
Cells(caz, 51).Value = Cells(caz, 50).Value
End If
Cells(caz, 52).Value = Atn(-(Cells(caz, 51).Value) / Sqr(-(Cells(caz, 51).Value) * (Cells(caz, 51).Value) + 1)) + 2 * Atn(1)
Cells(caz, 53).Value = 57.295779 * Cells(caz, 52).Value
If CStr(Cells(caz, 11).Value) = CStr(Cells(caz + 1, 11).Value) And CStr(Cells(caz + 1, 12).Value) > CStr(Cells(caz, 12).Value) Then
Cells(caz, 45).Value = 0
ElseIf CStr(Cells(caz, 11).Value) = CStr(Cells(caz + 1, 11).Value) And CStr(Cells(caz + 1, 12).Value) < CStr(Cells(caz, 12).Value) Then
Cells(caz, 45).Value = 180
ElseIf CStr(Cells(caz, 11).Value) = CStr(Cells(caz + 1, 11).Value) And CStr(Cells(caz + 1, 12).Value) = CStr(Cells(caz, 12).Value) Then
Cells(caz, 45).Value = 0
ElseIf CStr(Cells(caz, 11).Value) < CStr(Cells(caz + 1, 11).Value) Then
Cells(caz, 45).Value = Cells(caz, 53).Value
Else
Cells(caz, 45).Value = 360 - Cells(caz, 53).Value
End If
Next caz
End Sub
Mais ça marche pas!
Est-ce que je suis obligée de faire apparaitre les colonnes 46,47,48...qui ne me servent que pour le calcul du cap.
Si quelqu'un peut m'aider, merci!