Calcul de somme sous condition en VBA

superbaptbapt Messages postés 32 Statut Membre -  
superbaptbapt Messages postés 32 Statut Membre -
Bonjour a tous

Je suis tout nouvo alors bonjour tous le monde.
Je travail actuellement sur un simulateur de controle aérien, et j'ai quelque problème avec mon VBA, énormément. J'ai débuter le VBA, il y a 2 semaines.

Bon voila mon problème

Je doit déterminer le nombre d'avion ayant un changement par période de 2 minutes.

https://www.cjoint.com/?hrkqNxXF6V

voila pour l'instant le début de mon programme VBA

Pour cela je doit déterminer quelque condition
regarder si mon avion est bien compris dans l'interval de temps, regarder si c'est un avion du secteur aérien pris en compte, la sa va pour le moment, sa j'ai réussi.

Maintenant la partie qui bloque le plus pour moi.
Je doit déterminer combien d'avion ont eu un changement de +ou- 15°
sur la colonne D
et en faire la somme, des avions bien sur(le prog que j'ai fai, j'ai pluto l'impression qu'il somme les dégré lui)

je doit donc determiner si mon avion a eu cette modification, et vérifier que cette modification est bien celle de cette avion

TBS_EW FS 16:44:15 _ 85
TBS_EW FS 16:44:20 _ 75
TBS_EW FS 16:44:25 _ 73
TBS_EWC FS 16:44:25 _ 85
TBS_EW FS 16:44:30 _ 61
TBS_EWC FS 16:44:30 _ 75
TBS_EW FS 16:44:35 _ 49
TBS_EWC FS 16:44:35 _ 73

La sur cet exemple l'avion TBS_EW a eu une varion supérieur a 15°
TBS_EWC a eu aussi une variation, mais pas de 15°
Donc 1 avion ici

Le problème que je rencontre c'est comment faire pour mettre en place ces conditions, et avec l'itération, quand on passe a la deuxième ligne, vérifier que l'avion sur lequel les calculs sont fait, n'a pas déja été pris en compte.

donc quand on ai en ligne 2, on verifie que le nom de l'avion n'est pas le meme que les lignes précédentes, et ainsi de suite

ligne 4, on regarde ligne3,ligne2, ligne1
...

Merci

32 réponses

  • 1
  • 2
Résumé de la discussion

Le fil porte sur un simulateur de contrôle aérien et sur l’utilisation de VBA pour compter les avions présentant une déviation de 15° dans un intervalle de 2 minutes, tout en vérifiant l’unicité des entrées. Plusieurs propositions techniques visent le tri par temps plutôt que par angle, l’utilisation de la colonne D ou C, et le recalcul de la déviation via Max-Min pour éviter le double comptage d’un avion. Des échanges évoquent aussi le tri par temps pour garantir l’ordre d’arrivée, la vérification de l’unicité en évitant les récounts dans les intervalles suivants, et l’exclusion des sauts d’angle supérieurs à 345°.

Bobot (l'IA à votre service)
  1. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    Hello superbaptbapt,

    En VBA, tu peux faire un truc de ce genre :
    - trier tes lignes sur n° avion (colonne A) / angle (colonne D) (et l'heure en second peut-être ? à toi de voir)
    - balayer tes lignes : pour un avion donné, noter la valeur d'angle de début et fin
    - voir si la différence est >= 15 ou <= -15
    - remettre tes lignes dans le bon ordre.

    Pour éviter les mouvements d'écran, tu mets un
    Application.ScreenUpdating = False
    devant ton premier tri , et tu remets à True après le 2ème.

    Avant de trier tes lignes, numérote-les dans une colonne inutilisée, de façon à les retrier sur ce critère pour les remettre dans l'ordre initial.

    Y'a sûrement d'autres façons de faire... Celle-là est facile à décrire.
    0
  2. superbaptbapt Messages postés 32 Statut Membre
     
    Facile en théorie oui

    J'ai commencé le VBA, il y a 2 semaines, pour moi c'est un peu flou la.

    'Heading Change
    Dim z As Range, y%
    Dim cel As Range, c%

    Range("G2:G" & Range("G65536").End(xlUp).Row).Select
    Selection.ClearContents

    For p = 2 To Range("B65536").End(xlUp).Row
    For Each z In Range("E2:E" & i + 1)
    If Cells(p, 3).Value >= Range("E" & z.Row).Value Then
    If Cells(p, 3).Value < Range("F" & z.Row).Value Then
    If Cells(p, 2).Value = "FS" Then
    For q = 2 To Range("A65536").End(xlUp).Row
    For Each cel In Range("A2:" & Cells(q, 1).Address(0, 0))
    ' regarde si variation de +15°/-15°
    If Cells(q, 4).Value <= Range("D" & cel.Row).Value - 15 Or Cells(q, 4).Value >= Range("D" & cel.Row).Value + 15 Then
    If Cells(p, 1).Value = Cells(q, 1).Value Then
    Cells(cel.Row, 7).Value = Cells(cel.Row, 7).Value + 1
    Exit For
    End If
    End If
    Next cel
    Next q
    End If
    End If
    End If
    Next z
    Next p

    Voila ma macro, mais elle ne me donne pas du tout les bonnes valeurs. Je pense,qu'elle me calcul la somme des angles ou il y a eu un changement
    0
    1. superbaptbapt Messages postés 32 Statut Membre
       
      Ok le tri me parait bien comme solution, mais je ne sais pas faire.
      Comment faire un tri par nom d'avion, alors que l'on ne les connait pas a l'avance.

      Si quelqu'un peut me montrer comment trier mes données.
      Et me dire comment mettrele trie de mes données sur la feuille 2, et non pas sur la feuille 1, c'est simplement pour faciliter la lecture.

      La vrai feuille de simulation, fait du 5000 lignes sur 30 colonnes, et la encore c'est aussi du simplifier

      Merci
      0
  3. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    Re,

    Regarde si ça te convient :
    https://www.cjoint.com/?hroRJ7MkuO

    C'est la macro Avions. Résultats dans Feuil2.

    P.S. J'ai oublié un Plage.Cells.Clear pour virer la numérotation des lignes pour le tri...
    0
    1. superbaptbapt Messages postés 32 Statut Membre
       
      Merci, tu me sauve la vie

      Part contre c'était le tri que je voulais en feuille 2, mais sa je devrais pouvoir le changer de place tous seul.

      Je comprend pas comment le système fait pour trouver quel est la valeur de départ.
      Et ne serait t'il pas plus simple de laisser les valeurs dans le sens de départ, mais uniquement trié par nom
      0
      1. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529 > superbaptbapt Messages postés 32 Statut Membre
         
        En fait, tout se fait dans Feuil1. En résultat dans Feuil2, je mets les avions dont la déviation (en colonne B) est supérieure ou égale à 15°.

        Je comprends que tu voudrais dans Feuil2 la liste de Feuil1, mais triée, c'est ça ? Le plus simple, c'est de copier Feuil1 dans Feuil2, et de trier ensuite Feuil2.
        0
      2. superbaptbapt Messages postés 32 Statut Membre > Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention  
         
        Y a t'il une fonction qui peut copier de la colonne A à i
        sur une page x, en VBA?

        Et comment modifier ton progamme afin d'avoir les données dans leur ordre d'arrivée et non plus dans l'ordre croissant des angles, il faut que je modifie la ligne
        key2:=range("C2"),order:=xlAscending
        que je remplace l'angle par le temps
        et la je devrai obtenir par valeur de temps.

        Car les calculs d'angle donnent la valeur entre le max et le min

        alors que cela doit etre fait a partir de la valeur de départ.

        c'est pour cela, que je veu le mettre par ordre de temps
        0
  4. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    C'est tout à fait ça : en mettant C2 au lieu de D2 tu auras le critère Temps dans ton tri.

    Pour la copie de colonnes, voici un petit code simple :
    Sub CopieCols()
    
      ' copie des colonnes C à F de Feuil1
      ' dans Feuil3 à partir de la colonne G
      Sheets("Feuil1").Activate
      Columns("C:F").Copy
      Sheets("Feuil3").Select
      Columns("G:G").Select
      ActiveSheet.Paste
      Range("A1").Select
      
    End Sub
    0
    1. superbaptbapt Messages postés 32 Statut Membre
       
      J'ai essayer de modifier, je ne comprend pas, le tri ne se fait pas.
      du moins pas dans le bon sens

      AIRONLY FS 16:45:25 316
      AIRONLY FS 16:45:30 316
      AIRONLY FS 16:45:35 316
      AIRONLY FS 16:45:40 316
      AIRONLY FS 16:45:45 316
      AIRONLY FS 16:45:50 316
      AIRONLY FS 16:45:55 316
      AIRONLY FS 16:45:20 319
      AIRONLY FS 16:45:15 322
      AIRONLY FS 16:45:10 325
      AIRONLY FS 16:45:05 332
      AIRONLY FS 16:45:00 339
      AIRONLY FS 16:44:55 343

      y a une petite erreur dans les temps, il prend toujours en compte la colonne D
      0
      1. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529 > superbaptbapt Messages postés 32 Statut Membre
         
        Normalement, si tu as :
        Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, _
                         Key2:=Range("C2"), Order2:=xlAscending, _
                         Header:=xlYes
        ça doit trier par heures.
        0
      2. superbaptbapt Messages postés 32 Statut Membre > superbaptbapt Messages postés 32 Statut Membre
         
        C'est bon, je vien de le lancer sur une nouvelle page, et les résultats sont bon.

        Par contre, il me recopie un peu trop de ligne, exemple; la mise en place des heures, mais je vai modifier ma macro de départ, car je n'ai pas spécifier ou copier cette comparaison, donc a mon avis, c'est pour cela qui me recopie tout mes données a chaque fois.


        Merci de ton aide.

        Je reviendrais de toute façon.

        La se n'était que les données métriques les plus simple, que l'on m'a demandés de calculer, maintenant sa va etre les calculs en coordonnées spériques.

        Un régal

        Merci a toi
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. superbaptbapt Messages postés 32 Statut Membre
     
    Dernier renseignement

    Je vien de revoir les calculs

    comment modifier les formules, pour qu'il prenne en compte la valeur min ou max, et non la dernière valeur

    Car qaund on prend
    TBS_EW initial 85
    TBS_EW final 29

    on obtient -59, c'est juste

    mais la valeur min que l'on a
    c'est
    TBS_EW min 26
    et on obtient alors -56

    Le sytème va donc tomber sur un os, si la valeur initial est égale à la valeur final.
    Il va donc dire, qu'il n'y a pas eu de changement

    A moins que se soit juste pour connaitre le nombre final après toute les modifications, alors dans se cas, c'est moi qui me trompe
    0
  7. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    Me rev'là... j'avais à vaquer un peu...

    Donc je gère le Min et le Max, et calcule la déviation avec (Max-Min).
    Regarde si ça fait ce que tu veux.
    https://www.cjoint.com/?hrs0oRogoC
    0
  8. superbaptbapt Messages postés 32 Statut Membre
     
    Bonjour Armojax

    C'est quasiment sa,j'avais fait une erreur d'explication, c'est entre 2 valeurs, que je doit déterminer si il y a eu un changement.

    Ce que je veu savoir c'est s'il y a eu une variation de plus de 15 degre a un moment?

    valeur initial 85
    valeur2 75
    valeur3 60

    entre valeur inital et valeur2, on a 10, donc pas de changement conséquent.
    par contre entre valeur2 et valeur3, on a 15, d'ou changement.
    le programme doit alors arreter, compter un changement, et passer a l'avion suivant.

    Sa doit déja etre mieu expliqué la.

    Sinon, j'ai remarqué queque chose, quand je modifie la valeur de TBS_EW, l'avion TBS_EWC change aussi, il prenne toujours les meme valeurs alors que ce n'est pas le meme avions?

    bizard

    merci
    0
  9. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    Bonjour superbaptbapt,

    Une nouvelle mouture, que j'espère plus conforme...
    https://www.cjoint.com/?hskcSMTB7Q

    Donc là, on constate l'écart de 15° entre deux valeurs successives, et non pas entre un Min et un Max.

    Je suis surpris pour ce que tu dis de TBS_EW et TBS_EWC...

    Tiens-moi au courant... Mais je dois m'absenter un peu dans la matinée.
    0
  10. superbaptbapt Messages postés 32 Statut Membre
     
    Tout compte fait, la macro avec la difference entre max et min, convient a mes supérieurs.

    Par contre j'aimerai rajouter quelque ligne de code, mon système se fesant entre interval de temps et secteur donnée.

    For r = 2 To Range("B65536").End(xlUp).Row
    For Each a In Range("E2:E" & I + 1)
    If Cells(r, 3).Value >= Range("E" & a.Row).Value Then
    If Cells(r, 3).Value < Range("F" & a.Row).Value Then
    If Cells(r, 2).Value = "FS" Then

    qui me permet de savoir si mon avion est dans tel interval ou un autre et dans le secteur FS

    est'il possible de les rajouter
    0
  11. superbaptbapt Messages postés 32 Statut Membre
     
    https://www.cjoint.com/?hsk7dzhSCz

    je vien de modifier la macro, pour quel le tri se fasse en feuil2 et les résultats en 3

    mais comment ajouter le temps et le secteur

    et retirer que lorsque je lance ma macro prog, le temps se mette sur la feuille 2

    faut'il que je lui disse, copie le prog temps sur la feuille x
    0
  12. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    J'ai modifié :
    - Feuil1 ne bouge pas
    - la liste triée se trouve dans Feuil2
    - les résultats sont dans Feuil3

    J'ai adapté les 2 macros :
    - EcartMinMax : écarts entre Mini et Maxi
    - EcartsConsec : écart entre deux mesures consécutives
    Comme ça tu as le choix.

    Dans ta macro prog, j'ai rajouté Application.ScreenUpdating en début et fin, pour éviter la mise à jour écran.

    J'espère qu'on progresse... Je ne maîtrise pas vraiment ton sujet, évidemment...

    https://www.cjoint.com/?hsoB2m0NC6
    0
  13. superbaptbapt Messages postés 32 Statut Membre
     
    Bonjour Armojax

    Désolé de ne pas avoir pu répondre plus tot, le réseau de toute l'entreprise a des ratés.

    Ne tend fait on progresse très vite, pour cet algorithme.
    Je t'explique, plus en détail, tu est en train de m'aider a développer un algorithme fourni par la NASA (pour de vrai), et oui c'est possible.

    Je te donne leur algorithme
    _Heading Change.The number of aircraft that made a heading change of greater than 15 degrees during a 2-minute interval.

    Et voila comment on devient la plus grande puissance mondial, pas d'explication. Il faut donc analyser, et faire les bons choix.

    Par contre, je rencontre déja des problèmes avec cjoint, est oui page excel de 2.80 MO, un peu trop gros

    Maintenant, se qu'il faut rajouter, c'est l'élément 2 minutes, sur l'ensemble des valeurs, la première page que j'ai fourni ne contenant que les valeurs du premier interval.

    https://www.cjoint.com/?htiytqPUL3

    la j'ai mis ma nouvelle macro, j'ai tou mis sur une meme page VBA, sa évite d'éffacer les anciennes valeurs, et les opérations se font maintenant dans l'ordre que je veux.

    https://www.cjoint.com/?htiFENcEkk

    et la, la page complete de donnée

    Par contre je n'est pas mis encore les résultats.
    J'ai essayer de mettre en place les modifications sur le balayage sur une période et sur un secteur.
    Mais étant données que je n'est pas encore, fait les résultats.
    Pour les résultats, je ne les veu plus en page 3, mais en 2, a la suite, en colonne H.

    Tu vera en lancant la macro, sa devrais se mettre en place.

    Merci de ton aide
    0
  14. superbaptbapt Messages postés 32 Statut Membre
     
    Ne serait'il pas possible de mettre l'affichage des résultats dans la boucle de balayage

    Entre next b et next c

    mettre
    Sheet("Feuil2").Cells(c,8).Value=J-2

    le sytème ne devrais t'il pas alors calculer la bonne valeur.
    Enfin, j'ai essayer, mais sa na pas fonctionné, j'ai des -2 partout
    0
  15. superbaptbapt Messages postés 32 Statut Membre
     
    https://www.cjoint.com/?htj0xPu5UT

    Avec cette page, c'est un peu plus facile, j'ai retirer énormément de valeur.

    Et je n'est pris que 2 interval de temps.

    J'ai mis les valeurs théoriques que l'on doit obtenir
    en couleur
    0
  16. superbaptbapt Messages postés 32 Statut Membre
     
    Il y a une modification a faire dans le code, mais meme avec sa je n'arrive pas a avoir les résultats

    For c=2 To Range("C65536")....

    C au lieu de B
    0
    1. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
       
      Hello,

      Gros orage juste au-dessus, alors j'ai laissé ma bécane un moment...

      Maintenant que je pige mieux le PB, j'ai tout cassé et je reprends à zéro.
      En fait, ce qu'il me manque maintenant, c'est exactement les restitutions que tu veux.

      J'ai noté :
      - le nombre d'avions présents dans un secteur, par tranches de 2 minutes : en faut-il la liste, ou seulement le nombre ?
      - les avions pour lesquels on a décelé une déviation de 15° au moins (mesurée entre le Mini et le Maxi), et ce indépendamment des tranches de 2 minutes.

      C'est bien ça ?
      0
  17. superbaptbapt Messages postés 32 Statut Membre
     
    -le nombre d'avions présents dans un secteur, par tranches de 2 minutes : en faut-il la liste, ou seulement le nombre ?

    juste le nombre, la liste est inutile

    - les avions pour lesquels on a décelé une déviation de 15° au moins (mesurée entre le Mini et le Maxi), et ce indépendamment des tranches de 2 minutes.

    en ce qui concerne les déviations, il faut le faire par tranche de 2 minutes

    comme indiqué sur le dernier exemple que j'ai joint

    les valeurs en G, c'est le nombre de fois ou il y a eu un changement des paramètres avions, sur un secteur voulu
    0
  18. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    Bon, j'ai une nouvelle propale avec un fichier complet.
    Jette un oeil et dis-moi si on touche au but.
    https://www.cjoint.com/?htoaSNsrrS
    0
  19. superbaptbapt Messages postés 32 Statut Membre
     
    Quasiment, par contre la debut des heures, doit etre un nombre en 00 a la fin, et non pas la première valeur que j'orai

    la colonne A et B sont inutile, je pense
    il y est affiché la valeur max-min?
    0
  20. superbaptbapt Messages postés 32 Statut Membre
     
    Je vien d'essayer sur mon classeur1

    https://www.cjoint.com/?htosTxCx30

    le système ne prend qu'un interval de
    16:44:15 4:46:14 PM

    alors que je devrais avoir de 16:44:00 à 16:46:00
    ou 16:44:00 à 16:45:59, afin de ne pas avoir aprendre ne compte 2 fois les avions qui serait sur une valeur juste

    de plus, le nombre d'avion calculer en H, correpond au nombre d'avion dans le secteur qui est différent du nombre d'avion ayant eu un déviation

    Nombre

    4

    et

    Nombre d'avions : 3
    Avion Angle
    EFL41 41
    TBS_EW 45
    TBS_EWC 59

    il faudrait mettre le "Nombre d'avions" a la place de l'autre en H
    0
  21. superbaptbapt Messages postés 32 Statut Membre
     
    J'ai vérifier les valeurs sur celui que tu m'as envoyer

    de
    Tranche Début Fin Nombre

    1 4:44:15 4:46:14 8

    le nombre réel est 7

    et sur celui de toute a l'heure, la calcul donne 4, alors qu'on devrait avoir 3

    Il y a peut etre besoin de retirer 1.

    Je vai voir en comptant la période 2
    0
  • 1
  • 2