IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Accélération code trajectoire gravité


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Accélération code trajectoire gravité
    Bonjour,
    Je cherche à afficher les trajectoires de trois corps suivant les formules de la loi de la Gravitation.

    Le code que j'ai développé est très long, est-il possible d'accélérer le temps de traitement?

    Le code:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    Option Explicit
    Sub Chemin()
     
    'On Error GoTo Handler
     
     
     MA = Range("A2").Value
     MB = Range("B2").Value
     MC = Range("C2").Value
     G = 6.67408 ^ 10 - 11
     
     
    If Range("A15").Value = "OK" Then
     
     
    Range("D3:AD100000").Clear
     
    i = 3
    jusk = Range("B10").Value
    While i <= jusk
     
     
     
    Range("B11").Value = ActiveCell.Row / jusk * 100
     
     
     
     Range("D" & i).Select
     
     xA = Range("D" & i - 1).Value
     yA = Range("E" & i - 1).Value
     zA = Range("F" & i - 1).Value
     xB = Range("G" & i - 1).Value
     yB = Range("H" & i - 1).Value
     zB = Range("I" & i - 1).Value
     xC = Range("J" & i - 1).Value
     yC = Range("K" & i - 1).Value
     zC = Range("L" & i - 1).Value
     vxA = Range("M" & i - 1).Value
     vyA = Range("N" & i - 1).Value
     vzA = Range("O" & i - 1).Value
     vxB = Range("P" & i - 1).Value
     vyB = Range("Q" & i - 1).Value
     vzB = Range("R" & i - 1).Value
     vxC = Range("S" & i - 1).Value
     vyC = Range("T" & i - 1).Value
     vzC = Range("U" & i - 1).Value
     
     
    axA = G * (((MA * MB * (xB - xA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (xC - xA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
    ayA = G * (((MA * MB * (yB - yA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (yC - yA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
    azA = G * (((MA * MB * (zB - zA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (zC - zA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
    axB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (xC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
    ayB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (yC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
    azB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (xC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
    axC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
    ayC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
    azC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
     
     Range("V" & i).Value = axA
     Range("W" & i).Value = ayA
     Range("X" & i).Value = azA
     Range("Y" & i).Value = axB
     Range("Z" & i).Value = ayB
     Range("AA" & i).Value = azB
     Range("AB" & i).Value = axC
     Range("AC" & i).Value = ayC
     Range("AD" & i).Value = azC
     
    DEMIT = Range("AE" & i).Value
     
    vxA = vxA + axA * DEMIT
    vyA = vyA + ayA * DEMIT
    vzA = vzA + azA * DEMIT
    vxB = vxB + axB * DEMIT
    vyB = vyB + ayB * DEMIT
    vzB = vzB + azB * DEMIT
    vxC = vxC + axC * DEMIT
    vyC = vyC + ayC * DEMIT
    vzC = vzC + azC * DEMIT
     
     Range("M" & i + 1).Value = vxA
     Range("N" & i + 1).Value = vyA
     Range("O" & i + 1).Value = vzA
     Range("P" & i + 1).Value = vxB
     Range("Q" & i + 1).Value = vyB
     Range("R" & i + 1).Value = vzB
     Range("S" & i + 1).Value = vxC
     Range("T" & i + 1).Value = vyC
     Range("U" & i + 1).Value = vzC
     
     T = Range("AE" & i + 1).Value
     
     xA = xA + vxA * T
     yA = yA + vyA * T
     zA = zA + vzA * T
     xB = xB + vxB * T
     yB = yB + vyB * T
     zB = zB + vzB * T
     xC = xC + vxC * T
     yC = yC + vyC * T
     zC = zC + vzC * T
     
     Range("D" & i + 1).Value = xA
     Range("E" & i + 1).Value = yA
     Range("F" & i + 1).Value = zA
     Range("G" & i + 1).Value = xB
     Range("H" & i + 1).Value = yB
     Range("I" & i + 1).Value = zB
     Range("J" & i + 1).Value = xC
     Range("K" & i + 1).Value = yC
     Range("L" & i + 1).Value = zC
     
     i = i + 2
     
     Wend
     
     
     
    Else
     
     
    MsgBox Range("A10").Value & " doit être " & Range("A11").Value & " " & Range("A12").Value
    Exit Sub
     
     
    End If
     
    End Sub
    Avec, pour être complet:

    - en A13;
    - en A14;
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ET(A13=1;A14=0);"OK";"NOK")
    en A15;
    - Une MEFC d'après la valeur de B11, Barre de données.

    Merci beaucoup d'avance.


    PS: Question subsidiaire: existerait-il un moyen pour estimer un temps de traitement au début du code?????? (Excel peut tout faire a priori ;-)!!!!!)

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Alors là, j'ai clairement rallongé la sauce:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    Option Explicit
    Sub Chemin()
     
     
     
     
     MA = Range("A2").Value
     MB = Range("B2").Value
     MC = Range("C2").Value
     G = 6.67408 ^ 10 - 11
     
     
    If Range("A15").Value = "OK" Then
     
     
    Range("D3:AD100000").Clear
    Range("B8:B10").Clear
    Range("B11").ClearContents
     
    i = 3
    jusk = Range("B10").Value
    While i <= jusk
     
     
     
    Range("B11").Value = ActiveCell.Row / jusk * 100
     
     
     
     Range("D" & i).Select
     
     
     Select Case i
     
    Case Is = 3
     
    Dim temps_debut As Single
       Dim duree As Single
     
       temps_debut = Timer
     
     
     
     
     
     xA = Range("D" & i - 1).Value
     yA = Range("E" & i - 1).Value
     zA = Range("F" & i - 1).Value
     xB = Range("G" & i - 1).Value
     yB = Range("H" & i - 1).Value
     zB = Range("I" & i - 1).Value
     xC = Range("J" & i - 1).Value
     yC = Range("K" & i - 1).Value
     zC = Range("L" & i - 1).Value
     vxA = Range("M" & i - 1).Value
     vyA = Range("N" & i - 1).Value
     vzA = Range("O" & i - 1).Value
     vxB = Range("P" & i - 1).Value
     vyB = Range("Q" & i - 1).Value
     vzB = Range("R" & i - 1).Value
     vxC = Range("S" & i - 1).Value
     vyC = Range("T" & i - 1).Value
     vzC = Range("U" & i - 1).Value
     
     
    axA = G * (((MA * MB * (xB - xA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (xC - xA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
    ayA = G * (((MA * MB * (yB - yA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (yC - yA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
    azA = G * (((MA * MB * (zB - zA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (zC - zA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
    axB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (xC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
    ayB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (yC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
    azB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (xC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
    axC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
    ayC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
    azC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
     
     Range("V" & i).Value = axA
     Range("W" & i).Value = ayA
     Range("X" & i).Value = azA
     Range("Y" & i).Value = axB
     Range("Z" & i).Value = ayB
     Range("AA" & i).Value = azB
     Range("AB" & i).Value = axC
     Range("AC" & i).Value = ayC
     Range("AD" & i).Value = azC
     
    DEMIT = Range("AE" & i).Value
     
    vxA = vxA + axA * DEMIT
    vyA = vyA + ayA * DEMIT
    vzA = vzA + azA * DEMIT
    vxB = vxB + axB * DEMIT
    vyB = vyB + ayB * DEMIT
    vzB = vzB + azB * DEMIT
    vxC = vxC + axC * DEMIT
    vyC = vyC + ayC * DEMIT
    vzC = vzC + azC * DEMIT
     
     Range("M" & i + 1).Value = vxA
     Range("N" & i + 1).Value = vyA
     Range("O" & i + 1).Value = vzA
     Range("P" & i + 1).Value = vxB
     Range("Q" & i + 1).Value = vyB
     Range("R" & i + 1).Value = vzB
     Range("S" & i + 1).Value = vxC
     Range("T" & i + 1).Value = vyC
     Range("U" & i + 1).Value = vzC
     
     T = Range("AE" & i + 1).Value
     
     xA = xA + vxA * T
     yA = yA + vyA * T
     zA = zA + vzA * T
     xB = xB + vxB * T
     yB = yB + vyB * T
     zB = zB + vzB * T
     xC = xC + vxC * T
     yC = yC + vyC * T
     zC = zC + vzC * T
     
     Range("D" & i + 1).Value = xA
     Range("E" & i + 1).Value = yA
     Range("F" & i + 1).Value = zA
     Range("G" & i + 1).Value = xB
     Range("H" & i + 1).Value = yB
     Range("I" & i + 1).Value = zB
     Range("J" & i + 1).Value = xC
     Range("K" & i + 1).Value = yC
     Range("L" & i + 1).Value = zC
     
     
     
       duree = Timer - temps_debut
     
     
       Range("B8").Value = Format(duree / 86400, "hh:mm:ss")
       Range("B9").Value = Format(duree * jusk / 86400, "hh:mm:ss")
     
     
       Case Is <> 3
     
     i = i + 2
     
     
     End Select
     
     Wend
     
     
    Else
     
     
    MsgBox Range("A10").Value & " doit être " & Range("A11").Value & " " & Range("A12").Value
    Exit Sub
     
     
    End If
     
    End Sub
    Avec une ébauche d'estimation de la durée de traitement.....

Discussions similaires

  1. [XL-2010] Fomat de cellules / Accélération du code
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/11/2015, 21h43
  2. éliminer les valeurs de gravité de données d'accélération brutes
    Par newbie20 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/05/2014, 00h09
  3. Accélération code dans interface
    Par susie dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 05/05/2012, 18h37
  4. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo