Function AGN(ByVal Nb1 As String, ByVal Nb2 As String) As String
'ADDITION SIGNEE DE 2 GRANDS NOMBRES

'Info sur les longueurs des termes
Dim L1 As Long, L2 As Long
L1 = Len(Nb1): L2 = Len(Nb2)

'Recherche des signes et conversion en nombre positif
Dim S1 As Long, S2 As Long
S1 = 1: S2 = 1
If Left$(Nb1, 1) = "-" Then S1 = -1: Nb1 = Right$(Nb1, L1 - 1): L1 = L1 - 1
If Left$(Nb2, 1) = "-" Then S2 = -1: Nb2 = Right$(Nb2, L2 - 1): L2 = L2 - 1
     
'Recherche de la décimale et conversion en entier
Dim P1 As Long, P2 As Long, Virgule As Long, PS1 As Long, PS2 As Long
Dim Z As String 'optimisation pour les string$ qui suivent
Z = "0"
  
    'Recherche emplacement de la virgule
    P1 = InStr(1, Nb1, ",") + InStr(1, Nb1, ".")
    P2 = InStr(1, Nb2, ",") + InStr(1, Nb2, ".")
    'Recompose en entier
    Dim Nb1Prov As String, Nb2Prov As String
    PS1 = 0: PS2 = 0
    If P1 > 0 Then
        PS1 = L1 - P1
        Nb1Prov = Left$(Nb1, P1 - 1)
    End If
    If P2 > 0 Then
        PS2 = L2 - P2
        Nb2Prov = Left$(Nb2, P2 - 1)
    End If
    If PS1 > PS2 Then
        Nb1 = Nb1Prov & Right$(Nb1, L1 - P1)
        Nb2 = Nb2Prov & Right$(Nb2, L2 - P2) & String$(PS1 - PS2, Z)
      ElseIf PS1 < PS2 Then
        Nb1 = Nb1Prov & Right$(Nb1, L1 - P1) & String$(PS2 - PS1, Z)
        Nb2 = Nb2Prov & Right$(Nb2, L2 - P2)
      Else
        Nb1 = Nb1Prov & Right$(Nb1, L1 - P1) & String$(PS2 - PS1, Z)
        Nb2 = Nb2Prov & Right$(Nb2, L2 - P2) & String$(PS1 - PS2, Z)
    End If
    'Retrouve les bonnes longueurs
    L1 = Len(Nb1): L2 = Len(Nb2)
    'Trouve la bonne position de la décimale du résultat
    Virgule = IIf(PS2 > PS1, PS2, PS1)
  
'Comparaison des termes si soustraction
If S1 <> S2 Then
Dim Pgdd As Long, Lmax As Long
'Renvoi 1 si Nb1>Nb2, sinon -1 ou Revoi 0 si égalité avec Nb1 et Nb2 >=0
Lmax = L1
If L1 < L2 Then Lmax = L2
Pgdd = StrComp(String$(Lmax - L1, Z) & Nb1, String$(Lmax - L2, Z) & Nb2)
If Pgdd = 0 Then AGN = "0": Exit Function 'égalité
End If
  
'Transformation en longueur multiple de Multiple
Dim Multiple As Long
Multiple = 14

Dim lgmul As Long
lgmul = (IIf(L1 < L2, L2, L1) \ Multiple + 1) * Multiple
Nb1 = String$(lgmul - L1, Z) & Nb1
Nb2 = String$(lgmul - L2, Z) & Nb2

'Variables
Dim Total As String
Dim t As Long
Dim V1 As Double, V2 As Double, R As Double, Ret As Long
Dim lr As Long
Dim ln10 As Double
ln10 = Log(10)
    
'Déclare le résultat à la longueur maxi
Total = String$(lgmul, Z)

'Fait l'opération puis met en forme
If S1 = S2 Then
    'Addition
    For t = lgmul - Multiple + 1 To 1 Step -Multiple
        V1 = Mid$(Nb1, t, Multiple)
        V2 = Mid$(Nb2, t, Multiple)
        R = V1 + V2 + Ret
        lr = Fix(Log(R + 0.11) / ln10) + 1
        If lr = Multiple + 1 Then Ret = 1 Else Ret = 0
        Mid$(Total, t - lr + Multiple, lr) = CStr(R)
    Next t
    'Replacement de la virgule
    If Virgule <> 0 Then Total = Left$(Total, Len(Total) - Virgule) & "," & Right$(Total, Virgule)
    'Mise en forme
    AGN = ZeroGN(Total)
    'Règle des signes
    If S1 = -1 And AGN <> "0" Then AGN = "-" & AGN
Else
    'Soustraction
    Dim Base As Double
    Base = 10 ^ (Multiple + 1)
    For t = lgmul - Multiple + 1 To 1 Step -Multiple
        V1 = Mid$(Nb1, t, Multiple)
        V2 = Mid$(Nb2, t, Multiple)
        R = V1 - V2 + Ret
        Ret = 0
        If Sgn(R) <> Pgdd And R <> 0 Then
            R = Pgdd * Base + R
            Ret = -Pgdd
        End If
        lr = Fix(Log(Abs(R) + 0.11) / ln10) + 1
        Mid$(Total, t - lr + Multiple, lr) = CStr(Abs(R))
    Next t
    'Replacement de la virgule
    If Virgule <> 0 Then Total = Left$(Total, Len(Total) - Virgule) & "," & Right$(Total, Virgule)
    'Mise en forme
    AGN = ZeroGN(Total)
    'Règle des signes
    If Pgdd * S1 = -1 Then AGN = "-" & AGN
End If

End Function