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

VBA Discussion :

Calcul élément de trajectoire, dans boucle multiple


Sujet :

VBA

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ah oui j'avais pas fait gaffe que tu lui donnait ca...

    c'est sur qu'il fera pas d'operation sur cette chaine... pour lui il va prendre ca comme un string je pense et non pas un nombre... moi je ne sais pas du tout comment tu fais le calcul à la main mais à mon avis tu dois traduire 54:44:36:N en nombre non???

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    J'ai trouver comment convertir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    52:00:49
    on fait 52+00/60+49/3600  et on a la valeur en décimal
    par contre en VBA, je suis plus la, parti envolé

    de plus N correspond a +
    et S à -

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok 2 dernieres confirmations...

    imaginons 52:00:14:N, donc on va dire 1:2:3:N, tu fais 1+2/60+3/3600 tout le temps??

    c'est bien ca le calcul où manque t'il des () :

    (1+2)/(60+3)/3600 ??


    Les donénes que tu as sont toujours comme dans ta feuil4 ? tu n'aura jamais de cellule vide dnas la colonne A? (je veux savoir ca pour moi compter le nombre de lignes... j'ai besoin d'avoir une colonne qui a toujours une valeur quelque soit la ligne)

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Pas de ()

    c'est bien 1 + 2/60 + 3/3600 avec signe + ou -

    les données sont bien comme en feuill4
    sinon, utilise plutot la colonne D, il est possible d'avoir résultat vide si l'avion a attérit soit 0 en A

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok, donc le code que je t'ai envoyé fonctionne (donne le bon résultat)

    je le colle (si quelqu'un veut l'ameliorer... est interessé...)

    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
    Sub ConvertirPos()
     
        Dim DerniereLigne As Long
        Dim NomFeuilleSource As String
        Dim NomFeuilleCopy As String
     
     
        NomFeuilleSource = "feuil4"
        NomFeuilleCopy = "Position convertie"
     
        'on vérifie qu'une feuille du nom nomFeuilleCopy n'existe pas déjà
        For i = 1 To Worksheets.Count
            If Worksheets(i).Name = NomFeuilleCopy Then
                If MsgBox("Une feuille : " & NomFeuilleCopy & " existe déjà, la supprimer?", vbYesNo) = vbNo Then
                    MsgBox "Action annulée"
                    Exit Sub
                Else
                    Application.DisplayAlerts = False
                    Worksheets(NomFeuilleCopy).Delete
                    Application.DisplayAlerts = True
                    Exit For
                End If
            End If
        Next
     
        'on calcule le N° de la derniere ligne utilisée
        DerniereLigne = Worksheets(NomFeuilleSource).Range("D1").End(xlDown).Row
     
        'on ajoute une feuille
        Sheets.Add
        ActiveSheet.Name = NomFeuilleCopy
     
        'on copie les données
        Sheets(NomFeuilleSource).Activate
        Sheets(NomFeuilleSource).Range(Cells(1, 1), Cells(65536, 256)).Copy
        Sheets(NomFeuilleCopy).Paste
     
     
    Application.ScreenUpdating = False
     
        'on selectionne la feuille
        Sheets(NomFeuilleCopy).Activate
     
        'on comence à convertir à la ligne 2 car la ligne 1 contient les entetes
        For i = 2 To DerniereLigne
     
    ''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''' LATITUDE '''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''
     
            'il faut prévoir le cas où la premiere valeur vaut <10 (on a un caactere de moins)
            'cas <10 (chaine de 9 caracteres)
            If Len(Cells(i, 2)) = 9 Then
                'il faut voir le signe !
                If UCase(Right(Cells(i, 2), 1)) = "N" Then
                    Debug.Print Left(Cells(i, 2), 1)
                    Debug.Print Left(Cells(i, 2), 1)
                    Debug.Print Mid(Cells(i, 2), 3, 2)
                    Debug.Print Mid(Cells(i, 2), 6, 2)
                    Cells(i, 2) = Left(Cells(i, 2), 1) + Mid(Cells(i, 2), 3, 2) / 60 + Mid(Cells(i, 2), 6, 2) / 3600
                Else
                    Cells(i, 2) = -(Left(Cells(i, 2), 1) + Mid(Cells(i, 2), 3, 2) / 60 + Mid(Cells(i, 2), 6, 2) / 3600)
                End If
            'Cas de 10 caracteres
            Else
                If UCase(Right(Cells(i, 2), 1)) = "N" Then
                    Cells(i, 2) = Left(Cells(i, 2), 2) + Mid(Cells(i, 2), 4, 2) / 60 + Mid(Cells(i, 2), 7, 2) / 3600
                Else
                    Cells(i, 2) = -(Left(Cells(i, 2), 2) + Mid(Cells(i, 2), 4, 2) / 60 + Mid(Cells(i, 2), 7, 2) / 3600)
                End If
            End If
     
     
    ''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''' LONGITUDE ''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''
     
            If Len(Cells(i, 3)) = 9 Then
                'il faut voir le signe !
                If UCase(Right(Cells(i, 3), 1)) = "E" Then
                    Cells(i, 3) = Left(Cells(i, 3), 1) + Mid(Cells(i, 3), 3, 2) / 60 + Mid(Cells(i, 3), 6, 2) / 3600
                Else
                    Cells(i, 3) = -(Left(Cells(i, 3), 1) + Mid(Cells(i, 3), 3, 2) / 60 + Mid(Cells(i, 3), 6, 2) / 3600)
                End If
            'Cas de 10 caracteres
            Else
                If UCase(Right(Cells(i, 3), 1)) = "E" Then
                    Cells(i, 3) = Left(Cells(i, 3), 2) + Mid(Cells(i, 3), 4, 2) / 60 + Mid(Cells(i, 3), 7, 2) / 3600
                Else
                    Cells(i, 3) = -(Left(Cells(i, 3), 2) + Mid(Cells(i, 3), 4, 2) / 60 + Mid(Cells(i, 3), 7, 2) / 3600)
                End If
            End If
     
        Next
    Application.ScreenUpdating = True
     
    End Sub
    voilà maitenant il faut savoir calculer la distance entre 2 avions grace aux valeurs de longitude et latitudes calculées dans cette nouvelle feuille excel "Position convertie".

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    J'ai ajouter se code dans le mien et ai lancé pour voir si les calculs se fesait avec uniquement les équations et des valeurs de cellules choisi.

    Sa fonctionne parfaitement

    Latitude/longitude, on y touche plus maintenant

    passons a la boucle

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Oui mais bon...

    moi avoir les latitudes et longitudes ca m'avance pas...

    comment convertir ca en distance??

    en fait là il faut comparer à un instant t la distance (lati et longi) de l'avion avec les autres et ca pour chaque avion (chaque "i" comme on les a appelés...). mais comment faier pour savoir si c'est < 5 miles?

  8. #28
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Bonjour bonjour

    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
    Sub calu()
     
    Const Pi = 3.141592654
    Const DegToRad = 0.017453292
    Const FeetToNm = 5278.8713
    Const EarthRadius = 636000
    Const MetresToNm = 0.000622
     
    Dim i As Long
    Dim j As Long
    Dim wS As Worksheet
    Dim wD As Worksheet
    Dim Derlig As Long
    Dim NbTr As Integer
     
    Do
        NbTr = InputBox("Entrez une valeur de 1 à 256", "Nb Tranches de 2 minutes", 10)
    Loop Until (Val(NbTr) > 0) And (Val(NbTr) < 257)
     
    Sheets.Add
    ActiveSheet.Name = "Result"
     
    Set wS = Sheets("Result")
    Set wD = Sheets("Position convertie")
     
    i = 2
    j = 2
     
    Sheets("Position convertie").Select
    Derlig = wD.Cells(65536, 10).End(xlUp).Row
    For t = 1 To NbTr
        For i = 2 To Derlig
            If Cells(i, 6).Value <> "" _
            And Cells(i, 11).Value = t Then
                For j = 2 To Derlig
                 If Cells(j, 10).Value = Cells(i, 10).Value _
                 And Cells(i, 6).Value <> Cells(j, 8).Value Then
                    lati = (DegToRad / 10000) * Cells(i, 2).Value
                    latj = (DegToRad / 10000) * Cells(j, 2).Value
                    loni = (DegToRad / 10000) * Cells(i, 3).Value
                    lonj = (DegToRad / 10000) * Cells(j, 3).Value
                    cj = Cos(latj)
                    ci = Cos(lati)
                    sj = Sin(latj)
                    si = Sin(lati)
                    cij = Cos(loni - lonj)
                    res = (si * sj) + (ci * cj * cij)
                    GDist = MetresToNm * EarthRadius * (Atn(-res / Sqr(-res * res + 1)) + 2 * Atn(1))
                    ADiff = Abs(Cells(j, 1).Value - Cells(i, 1).Value) * 100 / FeetToNm
                    Adist = Sqr((GDist * GDist) + (ADiff * ADiff))
                    wS.Cells(j, 1).Value = Adist
                    wS.Cells(j, 4).Value = wD.Cells(j, 11).Value
                    If Adist < 5 Then
                        wS.Cells(j, 2).Value = wD.Cells(j, 8).Value
                    End If
                    If Adist >= 5 And Adist < 10 Then
                        wS.Cells(j, 3).Value = wD.Cells(j, 8).Value
                    End If
                  End If
                Next j
            End If
        Next i
    Next t
     
    End Sub
    J'ai modifier énormément mon code, il ma donne se que je veu maintennat, quasiment, encore beaucoup de boulot dessus.

    J'ai un problème de vitesse pour le traitement des données, trop long, j'ai accéléré le système avec Derlig, mais c'est encore beaucoup trop long, si quelqu'un a une solution

    De plus j'aimerai modifier ma page Result qui contient le resultat de toute mes tranche et la remplacer par NbTr page qui contiendrait chaque tranche.

    Comment copier uniquement les données de la valeur t, corespondant à la feuille, je sais qu'il faut faire une copie, mais quand je l'ai fait, je n'avais que les données de la tranche1, pas des autres tranches

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Calcul du temps passé dans une boucle for
    Par Hydro999 dans le forum R
    Réponses: 3
    Dernier message: 28/07/2009, 19h39
  2. Boucle multiple dans tWriteXMLField
    Par chris1024fr dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 18/05/2009, 12h07
  3. [XL-2003] Calculer le temps passé dans une boucle for
    Par mancired dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2009, 15h06
  4. Calcul d'une matrice dans une boucle for
    Par david_Montreal dans le forum MATLAB
    Réponses: 7
    Dernier message: 11/07/2007, 17h17
  5. Réponses: 5
    Dernier message: 23/11/2006, 15h52

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