Succession de sommes partielles dans une listbox

stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010 - 25 mars 2010 à 11:59
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010 - 31 mars 2010 à 16:17
Bonjour à tous,

normalement c'est la dernière fois que je fais appel à vous avant un petit moment (j'espère en tout cas).
Je vous expose mon problème :
Dans la 4e colonne de ma listbox "liste.lstb_pts" j'ai par exemple les informations suivantes :
...
150.0 'l.1
170.5 'l.2
0.0
0.0
0.0
195.0 'l.6
200.7
210.0 'l.8
0.0
0.0
0.0
275.5 'l.12
280.6
...
C'est à dire plusieurs séries de 0 au milieu d'autre chiffres. Je ne sais pas à l'avance combien j'ai de séries de 0. J'aimerais pouvoir récupérer tout les numéros de lignes précédents et suivant une série de 0.
Par exemple ici j'aimerais récupérer d'une part la ligne 2 et la ligne 8 et d'autre part la ligne 6 et la ligne 12. Je peux éventuellement stocker ces résultats dans deux listbox distinctes (une pour les lignes précédent les 0 et une autre pour les lignes suivant les 0).

Grâce à l'aimable aide de Galain le problème est déjà résolu pour une série de zéros mais je n'arrive vraiment pas à adapter le code pour plusieurs séries de 0. Mon code pour une série est le suivant :
For i = 0 To Liste.Lstb_pts.ListCount - 1
        ' on cherche tdep
    If Liste.Lstb_pts.List(i, 3) = 0 And i > 0 Then
        tdep = Liste.Lstb_pts.List(i - 1, 3)
        td = i - 1
        Exit For
    End If
Next i
    ' on cherche tfin
For j = i + 1 To Liste.Lstb_pts.ListCount - 1
    If Liste.Lstb_pts.List(j, 3) <> 0 Then
        tfin = Liste.Lstb_pts.List(j, 3)
        tf = j
        Exit For
    End If


J'avais penser stocker dans deux listbox d'une part les lignes précédent les 0 et d'autre part les lignes suivant les 0. Mais j'ai écrit le code suivant et il semble impossible de réaliser des conditions pour if sur plusieurs indices (ici d et d-1).
Dim d As Integer
For d = 1 To Liste.Lstb_pts.ListCount
    If Liste.Lstb_pts.List(d, 3) = 0 And Liste.Lstb_pts.List(d - 1, 3) > 0 Then
    Liste.lstb_tdep.AddItem Liste.Lstb_pts.List(d - 1, 3)
    End If
Next

Donc si jamais vous pouviez m'aider, ça conclurait pour l'instant mon programme.
J'espère que j'ai pas été confus ni trop long et que vous allez pouvoir m'aider.
Merci beaucoup d'avance !!!!

28 réponses

Profil bloqué
25 mars 2010 à 13:10
Salut stick25
Ouvre un nouveau projet
Dans la form tu mets 2 Listbox : une appelée Liste et l'autre Listcontrol
Colles le code suivant dans le form.Load et c'est parti
Tu peux dans ton propre projet enlever ensuite la Listbox Listcontrol ainsi que les 3 lignes de code la concernant
ensuite adapte à ton projet

Dim debutbloc As Integer
    Dim flagdep As Boolean

    Liste.AddItem "150.0"    '1.1
    Liste.AddItem "170.5"    'l.2
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "195.0"    'l.6
    Liste.AddItem "200.7"
    Liste.AddItem "210.0"    'l.8
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "275.5"    'l.12
    Liste.AddItem "280.6"
    Liste.AddItem "282.4"
    Liste.AddItem "283.7"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "291.4"
    Liste.AddItem "292.6"
    Liste.AddItem "293.9"


    debutbloc = 0
    Do
        flagdep = False
        For i = debutbloc To Liste.ListCount - 1
            ' on cherche tdep
            DoEvents
            If Val(Liste.List(i)) = 0 And i > 0 Then
                tdep = Liste.List(i - 1)
                Listcontrol.AddItem tdep
                flagdep = True
                td = i - 1
                Exit For
            End If
        Next i
        ' on cherche tfin
        If flagdep = True Then    ' si tdep trouvé on cherché tfin
            For j = i + 1 To Liste.ListCount - 1
                DoEvents
                If Val(Liste.List(j)) <> 0 Then
                    tfin = Liste.List(j)
                    Listcontrol.AddItem tfin
                    Listcontrol.AddItem "   "
                    tf = j
                    Exit For
                End If
            Next j
        End If
        If flagdep = False Then Exit Do
        debutbloc = j + 1
        If debutbloc > Liste.ListCount - 1 Then Exit Do
    Loop




La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
25 mars 2010 à 16:06
Salut Stick25
voici un code encore mieux
Même principe que précédemment
Il permet d'avoir des valeurs nulles aussi bien au début qu'à la fin de la liste (chose qui pourrait arriver je ne sais pas)
Le RemoveItem en fin de code permet de supprimer de la liste de contrôle des couples tdep-tfin le dernier tdep qui est tout seul : il n'y a pas de tfin qui lui est associé
ainsi aucune contrainte comme expliquée dans un de mes précédents postes

Je pense qu'il aurait été plus judicieux d'utiliser une MSHFlexgrid (Grille ressemblant à un tableau Excel) que d'utiliser une listbox à plusieurs colonnes ( plus propre comme code et plus facilement gérable)

Dim debutbloc As Integer
    Dim flagdep As Boolean
    Dim flagfin As Boolean
   
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "150.0"    '1.1
    Liste.AddItem "170.5"    'l.2
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "195.0"    'l.6
    Liste.AddItem "200.7"
    Liste.AddItem "210.0"    'l.8
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "275.5"    'l.12
    Liste.AddItem "280.6"
    Liste.AddItem "282.4"
    Liste.AddItem "283.7"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"
    Liste.AddItem "291.4"
    Liste.AddItem "292.6"
    Liste.AddItem "293.9"
    Liste.AddItem "0.0"
    Liste.AddItem "0.0"


    debutbloc = 0
    Do
        If Val(Liste.List(debutbloc)) <> 0 Then Exit Do
        debutbloc = debutbloc + 1
    Loop
    Do
        flagdep = False
        For i = debutbloc To Liste.ListCount - 1
            ' on cherche tdep
            DoEvents
            If Val(Liste.List(i)) = 0 And i > 0 Then
                tdep = Liste.List(i - 1)
                Listcontrol.AddItem tdep
                flagdep = True
                td = i - 1
                Exit For
            End If
        Next i
        ' on cherche tfin
        If flagdep = True Then    ' si tdep trouvé on cherché tfin
            flagfin = False
            For j = i + 1 To Liste.ListCount - 1
                DoEvents
                If Val(Liste.List(j)) <> 0 Then
                    tfin = Liste.List(j)
                    flagfin = True
                    Listcontrol.AddItem tfin
                    Listcontrol.AddItem "   "
                    tf = j
                    Exit For
                End If
            Next j
        End If
        If flagdep = False Then Exit Do
        debutbloc = j + 1
        If debutbloc > Liste.ListCount - 1 Then Exit Do
    Loop
    If flagfin = False Then Listcontrol.RemoveItem Listcontrol.ListCount - 1



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
25 mars 2010 à 16:07
Vraiment merci beaucoup Alain !! Plus que deux ou trois étapes et j'arrive à bon port.

Maintenant je sais où se trouve mon tdep et mon tfin pour chaque liste de 0 dans ma liste de points.

En fait le but de mon programme et d'interpoler la colonne temps où il y a des séries de zéros en supposant une vitesse constante pour chaque série de 0.
Maintenant je connais tdep et tfin pour chaque série de 0 mais pour calculer une vitesse il me faut la distance parcourue. Pour ce faire j'ai une liste où figurent les distance entre chaque point successif.

J'ai écris le code suivant mais mon total s'additionne d'une série de 0 à l'autre.
Dim u, v As Integer
For u = 0 To Liste.lstb_tdep.ListCount - 1
For v = Liste.lstb_tdep.List(u) To Liste.lstb_tfin.List(u) - 1
Dim Nombre As Double
Nombre = CDbl(Liste.Lstb_dist.List(v))
total = total + Nombre
Next
Liste.lstb_somme.AddItem total
Next

Je pense qu'il faudrait que j'intègre ce calcul dans le morceau de code que tu m'as donné pour la recherche des tdep et tfin, surtout que pour calculer une vitesse il me faudra pour chaque série de 0 la valeur (tfin-tdep).
La question que je me pose est donc où insérer ce code.
J'espère avoir été clair et que tu auras un peu de temps à accorder à cette requête.
Je suis désolé et gêné d'abusé autant de ta gentillesse mais je dois mener à bien un projet et personne autour de moi n'est qualifié dans ce domaine.
Merci
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
25 mars 2010 à 16:11
Alain, je viens de voir ton précédent post, merci pour ces précisions. Dans l'utilisation que j'en ferai, il n'y aura jamais de première ou dernière valeur nulle.
Sinon j'ai utilisé une listbox parce que c'était la seule chose que je connaissais, dommage.
Merci !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
25 mars 2010 à 16:17
Pour info, si ça peut aider qqun à m'aider, mon code fonctionnant pour une seule série de 0 est le suivant :

'calcul des distances entre chaque point de la liste
Dim ii, jj As Integer
jj = Lstb_pts.ListCount - 2
For ii = 0 To jj
distance = Sqr((Liste.Lstb_pts.List(ii, 0) - Liste.Lstb_pts.List(ii + 1, 0)) ^ 2 + (Liste.Lstb_pts.List(ii, 1) - Liste.Lstb_pts.List(ii + 1, 1)) ^ 2 + (Liste.Lstb_pts.List(ii, 2) - Liste.Lstb_pts.List(ii + 1, 2)) ^ 2)
Lstb_dist.AddItem distance
Next


'repère du temps précédent et suivant la liste de 0 // essayer de faire pour plusieurs séries de 0
Dim i, j As Integer
    For i = 0 To Liste.Lstb_pts.ListCount - 1
        ' on cherche tdep
        If Liste.Lstb_pts.List(i, 3) = 0 And i > 0 Then
            tdep = Liste.Lstb_pts.List(i - 1, 3)
            td = i - 1
            Exit For
        End If
    Next i
    ' on cherche tfin
    For j = i + 1 To Liste.Lstb_pts.ListCount - 1
        If Liste.Lstb_pts.List(j, 3) <> 0 Then
            tfin = Liste.Lstb_pts.List(j, 3)
            tf = j
            Exit For
        End If
    Next j


'on fait la somme des distances de la liste distance // essayer de faire avec plusieurs séries de 0
Dim u As Integer
For u = td To (tf - 1)
Dim Nombre As Double
Nombre = CDbl(Liste.Lstb_dist.List(u))
total = total + Nombre
vitesse = total / (tfin - tdep)
Next


'interpolation du temps et remplissage de la colonne t de la liste des points
Dim uu, vv As Integer
vv = Liste.Lstb_pts.ListCount - 1
For uu = 0 To vv
If Liste.Lstb_pts.List(uu, 3) = 0 Then
Liste.Lstb_pts.List(uu, 3) = Liste.Lstb_pts.List(uu - 1, 3) + Liste.Lstb_dist.List(uu - 1) / vitesse
End If
Next

Merci ...
0
Profil bloqué
25 mars 2010 à 17:00
Reprenons que j'essaie de comprendre
Les temps Les distances
150.0 'l.1---------10
170.5 'l.2---------15.5<-- tdep
0.0----------------19
0.0----------------22
0.0----------------28
195.0 'l.6---------32<-- tfin
200.7--------------36
210.0 'l.8---------41.5<-- tdep
0.0----------------48
0.0----------------56
0.0----------------62
275.5 'l.12--------68<-- tfin
280.6--------------78

Les distances sont dans l'exemple :(32 - 15.5) et (68 - 41.5) soit 16.5 et 26.5

entre 170.5 et 195.0 on parcoure une distance d en un temps t = à 195.0 - 175.5 soit 19.5 unités de temps ( je ne sais pas en quoi tu comptes le temps)
tu as une autre liste où tu as la distance parcourue à chaque point
tu voudrais la distance parcourue entre chaque tdep et tfin si j'ai bien compris
Dans ta liste des distances y-a-t il le même nombre de lignes que la liste à 4 colonnes avec laquelle nous travaillons et point important : la ligne 0 de la liste des distances correspond-elle à la ligne 0 de la liste à 4 colonnes et ainsi de suite
Rassures-toi tu ne me déranges point du tout : j'ai une semaine de vacances et suis disponible sur le forum


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
25 mars 2010 à 17:08
Je crois que je me suis planté
Au niveau de la distance c'est la distance entre chaque point successif et non la distance cumulée entre les points

donc il faut additionner la distance de tedp + 1 à tfin pour trouver la distance totale entre tdep et tfin

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
25 mars 2010 à 17:28
J'ai ce code comme ébauche de solution à ton problème
quand on trouve tdep on met distance = 0
Dans la boucle de recherche de tfin on ajoute à chaque fois la distance entre 2 points successifs à la distance totale
quand on sort de cette boucle on calcule la vitesse


    dim distance as integer

    debutbloc = 0
    Do
        flagdep = False
        For i = debutbloc To Liste.ListCount - 1
            ' on cherche tdep
            DoEvents
            If Val(Liste.List(i)) = 0 And i > 0 Then
                tdep = Liste.List(i - 1)
                Listcontrol.AddItem tdep
                flagdep = True
                distance 0 ' on initialise distance 0 car on a trouvé tdep
                Exit For
            End If
        Next i
        ' on cherche tfin
        If flagdep = True Then    ' si tdep trouvé on cherché tfin
            For j = i + 1 To Liste.ListCount - 1
                DoEvents
                ' on additionne les distances au fur et à mesures                    
                distance  = distance + CDbl(Liste.Lstb_dist.List(j))
                If Val(Liste.List(j)) <> 0 Then
                    tfin = Liste.List(j)
                    Exit For
                End If
            Next j
        End If
        ' ici on calcule la vitesse 


        If flagdep = False Then Exit Do
        debutbloc = j + 1
        If debutbloc > Liste.ListCount - 1 Then Exit Do
    Loop



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
25 mars 2010 à 17:45
Alors, les distances ne sont pas cumulées et j'ai une ligne de moins dans ma liste distance comme l'illustre l'exemple suivant :

lignes temps / lignes distance
0.------130.0 /
1.------150.0 / 0.------10 (distance entre ligne 0 et 1 de la liste où figure le temps)
2.------170.5 / 1.------15.5 <-- tdep
3.------0.0 / 2.------19
4.------0.0 / 3.------22 (distance entre ligne 3 et 4)
5.------0.0 / 4.------18
6.------195.0 / 5.------12 <-- tfin
7.------200.7 / 6.------19
8.------210.8 / 7.------11.5 <-- tdep
9.------0.0 / 8.------15
10.-----0.0 / 9.------20
11.-----0.0 / 10.------26
12.-----275.5 / 11.------14 <-- tfin
13.-----280.6 / 12.------22

(les valeurs sont ici mises juste pour l'exemple)

le résultat que je cherche à obtenir est la colonne temps suivante :
130
150
170,5 première série de 0 : v1=(19+22+18+12)/(195-170.5)=2.90
177,06 (=170.5+19/v1)
184,65
190,86
195
200,7
210,8 deuxième série de 0 : v2=1.16
223,74
240,99
263,42
275,5
280,6

Voila, j'espère qu'avec cet exemple numérique, détaillé, tu pourra m'aider.
Ma colonne temps est la 4e colonne de la listbox Liste.lstb_pts et mes distances sont dans une listbox Liste.lstb_dist

Merci beaucoup
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
25 mars 2010 à 17:48
Je n'ai pas vu l'ébauche que tu as posté avant de poster à mon tour... Je vais regarder
0
Profil bloqué
25 mars 2010 à 18:00
Merci pour les précisions
Je m'en occupe tout de suite

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
25 mars 2010 à 22:01
Salut stick25
Ouvre un nouveau projet
Dans la form tu mets 3 Listbox : une appelée Liste , une appelée Listdistance et la dernière Listvitesse
Colles le code suivant dans le form.Load et c'est parti
ensuite adapte à ton projet

Attention les variables td et tf que tu avais définies deviennent des tableaux (ils indiquent les numéros de lignes de tdep et tfin dans la liste Liste
Listvitesse peut être supprimée dans ton projet : je ne m'en servais que comme liste pour controle de la bonne marche de la procédure
J'ai aussi supprimé les lignes de code qui géraient les contraintes ( une liste ne commence ni ne finit jamais par un "0,0")
J'ai repris l'exemple que tu m'as donné et cela me donne des résultats corrects

Dim i As Integer, j As Integer
    Dim debutbloc As Integer
    Dim flagdep As Boolean
    Dim flagfin As Boolean
    Dim distance As Single
    Dim vitesse() As Single
    Dim td() As Integer
    Dim tf() As Integer
    Dim temps As Single
    Dim temps1 As Single
    Dim temps2 As Single
    Dim valeur As String
    Dim indice As Integer ' pour le tableau des vitesses
    
    Liste.AddItem "130,0"
    Liste.AddItem "150,0"    '1.1
    Liste.AddItem "170,5"    'l.2
    Liste.AddItem "0,0"
    Liste.AddItem "0,0"
    Liste.AddItem "0,0"
    Liste.AddItem "195,0"    'l.6
    Liste.AddItem "200,7"
    Liste.AddItem "210,8"    'l.8
    Liste.AddItem "0,0"
    Liste.AddItem "0,0"
    Liste.AddItem "0,0"
    Liste.AddItem "275,5"    'l.12
    Liste.AddItem "280,6"
    Listdistance.AddItem "10"
    Listdistance.AddItem "15.5"
    Listdistance.AddItem "19"
    Listdistance.AddItem "22"
    Listdistance.AddItem "18"
    Listdistance.AddItem "12"
    Listdistance.AddItem "19"
    Listdistance.AddItem "11.5"
    Listdistance.AddItem "15"
    Listdistance.AddItem "20"
    Listdistance.AddItem "26"
    Listdistance.AddItem "14"
    Listdistance.AddItem "22"
    
    debutbloc = 0
    ReDim vitesse(0)
    ReDim td(0)
    ReDim tf(0)
    indice = 0
    Do
        flagdep = False
        distance = 0
        For i = debutbloc To Liste.ListCount - 1
            ' on cherche tdep
            DoEvents
            If Val(Liste.List(i)) = 0 And i > 0 Then
                tdep = Liste.List(i - 1)
                distance = distance + Val(Listdistance.List(i - 1)) ' on ajoute la première distance
                flagdep = True
                td(indice) = i - 1
                Exit For
            End If
        Next i
        ' on cherche tfin
        If flagdep = True Then    ' si tdep trouvé on cherché tfin
            flagfin = False
            For j = i + 1 To Liste.ListCount - 1
                distance = distance + Val(Listdistance.List(j - 1)) ' on rajoute les suivantes
                DoEvents
                If Val(Liste.List(j)) <> 0 Then
                    tfin = Liste.List(j)
                    flagfin = True
                    tf(indice) = j
                    Exit For
                End If
            Next j
        End If
        If flagdep = False Then Exit Do
        ' on calcule la vitesse
        temps = CSng(Liste.List(tf(indice))) - CSng(Liste.List(td(indice)))
        vitesse(indice) = distance / temps
        Listvitesse.AddItem Str$(vitesse(indice))
        indice = indice + 1
        ReDim Preserve vitesse(0 To indice)
        ReDim Preserve td(0 To indice)
        ReDim Preserve tf(0 To indice)
        debutbloc = j + 1
        If debutbloc > Liste.ListCount - 1 Then Exit Do
    Loop
    ReDim Preserve vitesse(0 To indice - 1)
    ReDim Preserve td(0 To indice - 1)
    ReDim Preserve tf(0 To indice - 1)
    For i = 0 To UBound(vitesse)
        For j = td(i) + 1 To tf(i)
            temps1 = CSng(Liste.List(j - 1))
            temps2 = CSng(Listdistance.List(j - 1)) / vitesse(i)
            temps = temps1 + temps2
            valeur = Format$(temps, "#0.00")
            Liste.List(j) = LTrim$(Replace(valeur$, ".", ","))
            Liste.Refresh
        Next j
    Next i



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
26 mars 2010 à 08:59
Bonjour Alain,
merci bcp pour ton code ! Pour l'instant j'essaie de le faire marcher tel quel mais quelques petites erreurs...
Il m'affiche le message "erreur de compilation : projet ou bibliothèque introuvable" pour les éléments suivants :
- tdep et tfin ; je les ai déclarés en single et plus de message d'erreur
- str$ ; dans l'aide l'outil pour convertir en string est "str" mais j'ai quand même un message d'erreur avec "str"
- Format$
- LTrim$

et j'ai l'erreur "erreur de compilation : membre de méthode ou de données introuvable" pour "Liste.Refresh"

J'espère vraiment que ces erreurs sont contournables !!!

Encore merci pour ton aide !
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
26 mars 2010 à 09:22
Alors j'ai essayé le code sous word et il marche, à l'exception de l'erreur sur "liste.refresh" mais en mettant cette ligne en commentaire ça marche et les résultats sont bons.

Moi je développe sous vba mais à partir d'AutoCad, un logiciel de dessin. J'ai utilisé AutoCad car j'ai découvert VBA à partir de ce logiciel et je me suis rendu compte qu'il y a une licence qui n'est pas disponible depuis word par exemple : c'est "CommonDialog1" qui me permet d'importer mes listes de points et d'exporter. Je pense que c'est la seule différence.

Donc si jamais tu a un code pour importer un fichier, je pense que je pourrai importer mon code sous word et le code pour les vitesses et les listes de zéros marchera...

Donc sois je reste sous Autocad si tu sais comment résoudre les erreurs, soit je passe sous word si tu sais comment importer une liste de points dans ma listbox.

Vraiment merci d'avance pour ta généreuse aide...
0
Profil bloqué
26 mars 2010 à 11:30
Moi je croyais que tu développais sous Visual Basic 6.0 et non sous VBA.
si je comprends bien Autocad intègre en interne VBA et permet de créer des programmes (un peu comme Excel avec VBA)
Je comprends mieux pourquoi dans ce cas tu as utilisé une Listbox et une une grille

- La ligne avec str$ n'est pas obligatoire ( elle ne concerne que la listbox des vitesses qui me sert de contrôle)
- Format$(temps$, "#0.00") permet de garder une variable avec 2 chiffres décimaux : si temps$ = "12,12458" on le transforme en 12,12
- Ltrim$ enlève les espaces devant une chaine de caractères

J'utilise très peu VBA
Moi je te conseillerai de rester sous AutoCad
Remplace la fin du code que je t'ai donné par celui-ci et dis-moi ce qu'il en est

For i = 0 To UBound(vitesse)
        For j = td(i) + 1 To tf(i)
            temps1 = CSng(Liste.List(j - 1))
            temps2 = CSng(Listdistance.List(j - 1)) / vitesse(i)
            temps = temps1 + temps2
            Liste.List(j) = Replace(valeur$, ".", ",")
        Next j
    Next i



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.



GRENIER Alain
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
26 mars 2010 à 12:05
Merci Alain, je sens que ça vient bon !
Il ne reste plus qu'une seule erreur ; "incompatibilité de type" au niveau de la ligne "temps1 = CSng(Liste.List(j - 1))".
J'ai déjà essayé d'y réfléchir un peu, mais là j'ai repas donc je m'y remettrai en début d'après midi, en espérant arriver enfin à faire marcher tout ceci.
Merci
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
26 mars 2010 à 14:32
J'ai écris le code suivant et cela semble marcher !!
    For i = 0 To UBound(vitesse)
        For j = td(i) + 1 To tf(i)
            temps1 = CSng(Liste.List(j - 1))
            temps2 = CSng(listdistance.List(j - 1)) / vitesse(i)
            temps = temps1 + temps2
            Liste.List(j) = Replace(temps, ".", ",")
        Next j
    Next i

Donc peux-tu me dire si ça te semble juste, si cela ne posera pas de problème pour le fonctionnement général de mon programme.
J'espère que c'est juste. Je vais essayer d'adapter le code à mon programme.
Merci une nouvelle fois.
0
stick25 Messages postés 64 Date d'inscription jeudi 4 mars 2010 Statut Membre Dernière intervention 17 juin 2010
26 mars 2010 à 16:00
Je pensais que ça venait bon mais une nouvelle erreur s'est présentée...

J'ai fait un nouveau test avec la série suivantes mais le résultat obtenu est faux :

temps:
10
0
0
0
100
120
150
0
0
0
250
260

distances:
25,08
3,74
3,74
22,20
4,90
6,71
7,14
10,34
10,44
7,55
5,39

résultat obtenu:
10
52,4528
58,7358
65,0188
102,717
120
150
170,8824
201,1765
231,7647
253,8235
260

il y a un problème au niveau de tfin. Je sais pas pourquoi avec les chiffres précédents ça marchait et plus maintenant...
Ca vient bon jsp !!
merci si tu vois un problème dans le code
0
Profil bloqué
26 mars 2010 à 17:50
Salut stick25
Il n'y a pas de problème au niveau de tfin
Le fait que tu n'obtiens pas le même résultat est dû à mon avis à la précision des calculs
Je vais regardé comment faut-il faire en VBA pour que les nombres soient écrits avec uniquement 2 chiffres apès la virgule et faire des tests
Je te tiendrais au courant
A+


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
26 mars 2010 à 18:13
Tfin était modifiée vu que dans le boucle on le recalculait à nouveau
Le fait que c'était une nouvelle valeur était dû à la précision des calculs ainsi qu'à la suite des calculs en boucle
Exemple : 11.5 * 100 1150 et 11.59 * 100 1159 soit un écart de 9 unités pour une décimale supplémentaire

 For i = 0 To UBound(vitesse)
        For j = td(i) + 1 To tf(i) -1 ' <-- Code modifié (on laisse tfin identique)
            temps1 = CSng(Liste.List(j - 1))
            temps2 = CSng(listdistance.List(j - 1)) / vitesse(i)
            temps = temps1 + temps2
            Liste.List(j) = Replace(temps, ".", ",")
        Next j
    Next i



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Rejoignez-nous