De VBA vers un autre langage

Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011 - 21 oct. 2011 à 11:37
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011 - 8 nov. 2011 à 13:23
Bonjour.

Il y a de cela quelque mois on m'a posé comme sujet de stage le calcul de l'incertitude du débit d'un cours d'eau à partir de données ponctuelles de vitesses.

Etant donné que j'allais avoir à étudier de nombreux points, excel me semblait tout indiqué pour sa facilité de visualisation des résultats : je dois afficher pour environ 5000 lignes de tableau des données sur 100 colonnes. je me suis donc remis au VBA histoire de coder tout ça.

Problème : le calcul de débit pour une traversée de la rivière se fait correctement, mais pour un temps de calcul de 30s à une minute pour un PC moyen ... Rien de dramatique me dirais vous sauf que le calcul d'incertitudes nécessite de refaire ce calcul 10 fois pour chaque traversée, et ce pour une dizaine de traversée ...

On m'a clairement fait comprendre que ce temps de calcul ne permettrait pas l'utilisation régulière du programme. J'ai eu beau supprimer toutes les boucles inutiles de mon code, veiller à ne réaliser à chaque fois uniquement les calculs nécessaires à l'opération, je n'arrive pas sous excel à faire moins d'une heure de calcul.

A partir de là il n'y a qu'une seule solution pour moi : migrer vers un autre langage.

Excel en lui même est loin d'être idéal lorsqu'il s'agit de multiplier les calculs, à priori à cause de l'interaction permanente entre les feuilles de calculs à remplir et les calculs à faire sous vb .
Sachant que l'entreprise ne dispose pas de matlab, et que l'utilisation d'un clone libre poserais également des problèmes (principalement par le fait que les gens dans la boite ne sont pas formés à son fonctionnement : il me faut un programme au maximum "pousse-bouton", donc un langage compilé), je dois me tourner vers des langages plus génériques.

Pour moi il faudra remplacer les feuilles de calcul excel par des tableaux dynamiques de grande taille, qui n'auront pas à être affiché (sauf pour vérification)

Ma question est donc : quel est le langage le plus approprié pour ce genre d'opérations ?

Sachant que :

[list]
[*] Les calculs sur les tableaux devront se faire trés rapidement, au moins à la vitesse de matlab sur les fichiers textes : de nombreux logiciels sont capables de traiter les données au format texte rapidement (je pense aux logiciels de calculs par éléments finis) et il me faudra me rapprocher de ce niveau.
[*] Je dois pouvoir réaliser une application fenêtrée, avec un éventuel affichage du détail du contenu des tableaux
[*] Je ne maitrise actuellement que le VB et le Pascal, mais ce ne sera pas limitatif : s'il le faut j'apprendrais sur le tas.
/list

Je suis donc à la recherche du langage idéal, libre et relativement intuitif : d'après vous vers quoi dois-je me tourner ?

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2011 à 11:48
Bonjour,

sans savoir ce que fait exactement ton appli : dur de te répondre valablement.

Je dirais par contre que Excel est bien armé en matière de calculs. Il est de surcroît un tableur !

Quant à :
Pour moi il faudra remplacer les feuilles de calcul excel par des tableaux dynamiques de grande taille, qui n'auront pas à être affiché (sauf pour vérification)


C'est souvent très vrai et ... VBA/Excel te permet de le faire très bien (avec énormément de souplesse pour passer les valeurs d'une plage dans un tableau dynamique et vice-versaz !)

Mais une autre fois : nul ne saurait te (répondre valablement sans connaître les détaiuls de ton appli, des calculs qui y sont faits et de la présentation et l'exploitation des résultats !



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
23 oct. 2011 à 09:57
Bonjour Atraxor,

Ben moi j'émettrais une autre position :

Excel, le VBA c'est pratique, mais c'est tout, car trop long lors de l'interprétation, pour ma part quand j'ai des trableaux Excel qui commencent à prednre du volume je passe en programmation vbNet, et je peux te dire que c'est le jour et la nuit...

VbNet quant à lui n'est pas si simple que ça, la manipulation des paramétrages et options déjà c'est pas évident, si tu rajoute le code à coucher dehors, tu risques, même en venant de vb6, à ne pas être opérationnel rapidement.

Alors comme tu maîtrises le VB (6 je présume), vb6 est totalement capable de faire efficacement ton programme, donc je pense que tu devrais faire ça dans ce langage que tu connais...
D'autant que vb6 pond des applications aussi performantes que vbNet, j'ai fait la transition, les logiciels vbNet ne sont pas plus performants en 32 bits en tout cas. Le seul avantage réel de vbNet est qu'il permet plus de choses, mais ce sont des choses qu'on utilise rarement, voire jamais, ou une seule fois, il ne faut pas croire que vbNet est une fusée, non, hélas...

Cordialement.

Joe.
0
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011
24 oct. 2011 à 11:13
Merci pour vos réponses !

Malheureusement je ne dispose pas de plateforme VB6, qui n'est pas libre, je vais donc devoir trouver autre chose
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 11:22
Au risque de me répéter :
Si ton appli fait principalement des calculs, le VBA d'Ecel sait les agiliser et les traiter à la même vitesse que VB !
Montre-nous donc (en la commentant) une partie du code dont tu te plains de la lenteur ert tu verras à quelle vitesse on peut obtenir le même résultat (-en passant d'ailleurs par des tableaux dynamique )

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 11:27
Pour te donner "un ordre d'idée" : j'ai fréquemment vu faire la même chose avec Excel/VBA :
- 1) par traitements directs sur la feuille de calcul
- 2) par utilisation de tableaux dynamiques
Avec, pour la 2ème méthode, des résultats atteints en entre 300 et 1000 fois moins de temps , tout en gardant tous les avantages très appréciables d'un tableur (cerise sur le gâteau).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011
24 oct. 2011 à 11:44
Voici ma procédure principale d'évaluation du débit :

Sub Evaluation(calcul)  'si calcul =1, on refait le calcul aboutissant à Qmesuré. Sinon on repart des résultats existants pour ne calculer que les Qextp.

Dim e As Integer    'e le nombre d'ensembles
Dim b As Integer    'b le nombre de bins (max) par ensemble
Dim i, ivar As Integer   'ensemble actuel
Dim j As Integer    'bin actuel
Dim k As Integer
Dim kvar As Integer
Dim a As Integer    'le nombre de bins pour l'ensemble considéré
Dim valid As Boolean 'vrai si ensemble validé
Dim l As Integer
Dim m, gauche, droite As Integer
Dim firstval As Boolean 'premier ensemble valide atteind
Dim dbens As Double 'debit total de l'ensemble actuel

Sheets("Calcul debit").Range("K13").Calculate
e = Sheets("Calcul debit").Range("K13")
b = Sheets("Calcul debit").Range("K10")
k = 4
i = 1
firstval = False
dbens = 0

If calcul = 1 Then

While i - 1 <= e
j = 1
valid = False
a = Sheets("Donnees").Cells(i, 1)

If a >= 40 Then
    MsgBox "Le problème ne peut être traité car le nombre de bins par ensembles dépasse les 40", vbOKOnly + vbExclamation, "Calcul interrompu"
    Exit Sub
End If
    
If i = 1 Then   'on ne fait ce calcul qu'une fois
    If Sheets("Donnees").Cells(i, 13 + j + 5 * a) <> -32768 Then
        Sheets("Calcul incertitudes").Range("A15") = Sheets("Donnees").Cells(i, 13 + j + 5 * a) / 1000 'On récupère la fréquence de l'appareil
    End If
    If Sheets("Donnees").Cells(i, 14 + j + 5 * a) <> -32768 Then
        Sheets("Calcul incertitudes").Range("A25") = Sheets("Donnees").Cells(i, 14 + j + 5 * a) 'On récupère le mode de l'ADCP pour l'eau
    End If
    If Sheets("Donnees").Cells(i, 15 + j + 5 * a) <> -32768 Then
        Sheets("Calcul incertitudes").Range("A23") = Sheets("Donnees").Cells(i, 15 + j + 5 * a) 'On récupère le nombre de pings pour la vitesse de l'eau
    End If
End If

    While j <= a
        k = k + 1
        Sheets("Calcul debit").Cells(k, 1) = i
        Sheets("Calcul debit").Cells(k, 2) = j
        Sheets("Calcul debit").Cells(k, 3) = Sheets("Donnees").Cells(i, 10 + j) 'vitesse sur faisceau 1
        Sheets("Calcul debit").Cells(k, 4) = Sheets("Donnees").Cells(i, 10 + j + a) 'vitesse sur faisceau 2
        Sheets("Calcul debit").Cells(k, 5) = Sheets("Donnees").Cells(i, 10 + j + 2 * a) 'vitesse sur faisceau 3
        Sheets("Calcul debit").Cells(k, 6) = Sheets("Donnees").Cells(i, 10 + j + 3 * a) 'vitesse sur faisceau 4
        Sheets("Calcul debit").Cells(k, 7) = Sheets("Donnees").Cells(i, 7) 'vitesse du fond sur faisceau 1
        Sheets("Calcul debit").Cells(k, 8) = Sheets("Donnees").Cells(i, 8) 'vitesse du fond sur faisceau 2
        Sheets("Calcul debit").Cells(k, 9) = Sheets("Donnees").Cells(i, 9) 'vitesse du fond sur faisceau 3
        Sheets("Calcul debit").Cells(k, 10) = Sheets("Donnees").Cells(i, 10) 'vitesse du fond sur faisceau 4
        Sheets("Calcul debit").Cells(k, 32) = Sheets("Donnees").Cells(i, 10 + j + 4 * a) 'profondeur du bin considéré
        Sheets("Calcul debit").Cells(k, 34) = Sheets("Donnees").Cells(i, 3) 'récupération du temps pour lequel l'ensemble a été mesuré
        If k > 5 Then
        Sheets("Calcul debit").Cells(k - 1, 33).Calculate 'Il faut le calculer immédiatement
        End If
           
        
            Call Calcul_dt(k, firstval)
            
            If Sheets("Donnees").Cells(i, 18 + j + 5 * a) = -32768 Then
                Sheets("Calcul debit").Cells(k, 38) = "BAD"
            Else
                Sheets("Calcul debit").Cells(k, 38) = (-1) * Sheets("Donnees").Cells(i, 18 + j + 5 * a) 'débit élémentaire
            End If
        
        If Sheets("Calcul debit").OptionButton7.Value = True Then
            Call V1234(k)   'Calcul des vitesses dans le repère XYZ
        Else
            Call VEarth(k)  'Transcription des vitesses données en Earth dans les colonnes suivantes
        End If
            
            Call Calcul_Vx_Vy(k, a, i) 'On calcule les vitesses horizontales du fond qu'on va utilise rpour le calcul du débit
            
            Sheets("Calcul debit").Cells(k, 20).Calculate
            
            For l = 29 To 35
                Sheets("Calcul debit").Cells(k, l).Calculate    'calcul forcé des cellules de la ligne actuelle
            Next
            
            Sheets("Calcul debit").Cells(k, 65).Calculate
            
            If Sheets("Calcul debit").OptionButton1.Value = True Then
            Call Calcul_dQsuv(k, j, a)
            Else
                If Sheets("Calcul debit").OptionButton2.Value = True Then
                Call Calcul_dQprec(k, j, a)
                Else
                Call Calcul_dQmoy(k, j, a)
                End If
            End If
            
            'If Sheets("Calcul debit").Cells(k, 3) <> -32768 And Sheets("Calcul debit").Cells(k, 4) <> -32768 And Sheets("Calcul debit").Cells(k, 5) <> -32768 And Sheets("Calcul debit").Cells(k, 6) <> -32768 Then
            If Sheets("Calcul debit").Cells(k, 18) = "OUI" Then
                valid = True 'L'ensemble est considéré par défaut comme invalidé. Il est valide dès qu'un de ses bins est valide (cad B1,B2,B3 et B4 <>-32768
                If Sheets("Calcul debit").Cells(k, 25) = "NON" Then
                    valid = False  'Mais si un bin de l'ensemble dépasse de seuil de BT error velocity, c'est le cas pour tous les bins et l'ensemble est invalidé
                End If
            End If
        
            If Sheets("Calcul debit").Cells(k, 36) <> "BAD" Then    'si on a une valeur de débit pour ce bin
                dbens = dbens + Sheets("Calcul debit").Cells(k, 36) 'on ajoute au débit total de l'ensemble concerné
            End If
            
        j = j + 1
    Wend
    
If Sheets("Donnees").Cells(i, 11 + 5 * a) <> -32768 Then
    Sheets("Calcul debit").Cells(k, 75) = Sheets("Donnees").Cells(i, 11 + 5 * a) 'On récupère flow direction
End If

If i = 1 Then
    If Sheets("Donnees").Cells(i, 12 + 5 * a) <> -32768 Then
        Sheets("Calcul debit").Cells(k, 76) = Sheets("Donnees").Cells(i, 12 + 5 * a)
    End If
    If Sheets("Donnees").Cells(i, 13 + 5 * a) <> -32768 Then
        Sheets("Calcul debit").Cells(k, 77) = Sheets("Donnees").Cells(i, 13 + 5 * a)
    End If
Else
    If Sheets("Donnees").Cells(i, 12 + 5 * a) <> -32768 And Sheets("Donnees").Cells(i - 1, 12 + 5 * a) <> -32768 Then
        Sheets("Calcul debit").Cells(k, 76) = Sheets("Donnees").Cells(i, 12 + 5 * a) - Sheets("Donnees").Cells(i - 1, 12 + 5 * a) 'On récupère East displacement
    End If
    If Sheets("Donnees").Cells(i, 13 + 5 * a) <> -32768 And Sheets("Donnees").Cells(i - 1, 13 + 5 * a) <> -32768 Then
        Sheets("Calcul debit").Cells(k, 77) = Sheets("Donnees").Cells(i, 13 + 5 * a) - Sheets("Donnees").Cells(i - 1, 13 + 5 * a) 'On récupère North displacement
    End If
End If


k = k + 1
i = i + 1
    If valid = True Then
        Sheets("Calcul debit").Cells(k, 36) = "Valide"
        firstval = True
    Else
        Sheets("Calcul debit").Cells(k, 36) = "Invalide"
    End If
    
Sheets("Calcul debit").Cells(k, 70) = dbens 'on affiche le débit pour l'ensemble
dbens = 0

Call ensemblesextrapoles(k) 'Séparer le débits des ensembles calculés du débit des ensembles extrapolés

Wend

End If
        

Sheets("Calcul debit").Range("BC16").Calculate  'On détermine le signe de la moyenne des débits élémentaires

    If Sheets("Calcul debit").Range("BC16") < 0 Then    'On diffère le cas rive gauche de départ et rive droite de départ
        Sheets("Calcul debit").Range("K19") = Sheets("Donnees").Cells(1, 17 + 5 * Sheets("Donnees").Cells(1, 1))
        Sheets("Calcul debit").Range("K22") = Sheets("Donnees").Cells(1, 18 + 5 * Sheets("Donnees").Cells(1, 1))
    Else
        Sheets("Calcul debit").Range("K22") = Sheets("Donnees").Cells(1, 17 + 5 * Sheets("Donnees").Cells(1, 1))
        Sheets("Calcul debit").Range("K19") = Sheets("Donnees").Cells(1, 18 + 5 * Sheets("Donnees").Cells(1, 1))
    End If

Call estimation_debit_non_mesure(gauche, droite)   'lancement de la procédure d'évaluation des débits sur les rives, en surface et au fond


ivar = 5

    Sheets("Calcul debit").Range("BS5").Calculate
    Sheets("Calcul debit").Range("BT5").Calculate

Do Until Sheets("Calcul debit").Cells(ivar, 1) Sheets("Calcul debit").Range("K13") And Sheets("Calcul debit").Cells(ivar + 1, 1) ""
    Sheets("Calcul debit").Cells(ivar, 78).Calculate   'On termine les calculs liés aux angles et aux sections
    Sheets("Calcul debit").Range("CA5").Calculate
    Sheets("Calcul debit").Range("CB5").Calculate
    Sheets("Calcul debit").Range("CA8").Calculate
    Sheets("Calcul debit").Range("CA11").Calculate
    Sheets("Calcul debit").Cells(ivar, 84).Calculate
    Sheets("Calcul debit").Cells(ivar, 83).Calculate
    Sheets("Calcul debit").Cells(ivar, 82).Calculate
    Sheets("Calcul debit").Cells(ivar, 81).Calculate
    Sheets("Calcul debit").Cells(ivar, 85).Calculate
    Call sensecoulement(ivar, gauche, droite)
    Sheets("Calcul debit").Cells(ivar, 88).Calculate
    Sheets("Calcul debit").Cells(ivar, 89).Calculate
    Call signevitesse(ivar)
    Sheets("Calcul debit").Cells(ivar, 92).Calculate
    Sheets("Calcul debit").Cells(ivar, 93).Calculate
    Sheets("Calcul debit").Range("CA14").Calculate
    Sheets("Calcul debit").Range("CA17").Calculate
    Sheets("Calcul debit").Range("CA20").Calculate
    Sheets("Calcul debit").Range("CA23").Calculate
    Sheets("Calcul debit").Range("CA26").Calculate
    Sheets("Calcul debit").Range("CA29").Calculate
    
    ivar = ivar + 1
Loop

    For l = 54 To 63
        Sheets("Calcul debit").Cells(5, l).Calculate    'calcul forcé des résultats finaux
    Next

Sheets("Calcul debit").Cells(9, 55).Calculate
Sheets("Calcul debit").Cells(9, 56).Calculate
Sheets("Calcul debit").Range("BC12").Calculate
Sheets("Calcul debit").Range("BC14").Calculate

Sheets("Calcul debit").Range("BL5").Calculate
Sheets("Calcul debit").Range("BM5").Calculate
Sheets("Calcul debit").Range("BP28").Calculate

Sheets("Calcul debit").Cells(5, 63) = Sheets("Donnees").Cells(e, 6) 'on récupère le débit total

Call nbensemblesinvalides   'On calcule le nombre d'ensembles invalidés

Sheets("Calcul debit").Range("BF13").Calculate
    
End Sub


Quelques autres procédures assez longues :

Sub VEarth(i)

Dim East, Beast As Double
Dim North, Bnorth As Double
Dim Up, Bup As Double
Dim Error, Berror As Double

East = Sheets("Calcul debit").Cells(i, 3)
North = Sheets("Calcul debit").Cells(i, 4)
Up = Sheets("Calcul debit").Cells(i, 5)
Error = Sheets("Calcul debit").Cells(i, 6)
Beast = Sheets("Calcul debit").Cells(i, 7)
Bnorth = Sheets("Calcul debit").Cells(i, 8)
Bup = Sheets("Calcul debit").Cells(i, 9)
Berror = Sheets("Calcul debit").Cells(i, 10)

If East <> -32768 And North <> -32768 And Up <> -32768 And Error <> -32768 And Sheets("Calcul debit").Cells(i, 1) <> "" Then
    Sheets("Calcul debit").Cells(i, 14) = East
    Sheets("Calcul debit").Cells(i, 15) = North
    Sheets("Calcul debit").Cells(i, 16) = Up
    Sheets("Calcul debit").Cells(i, 17) = Error
    If Abs(Error) <= Sheets("Calcul debit").Cells(7, 11) Then
        Sheets("Calcul debit").Cells(i, 18) = "OUI"
        Sheets("Calcul debit").Cells(i, 19) = Up
    Else
        Sheets("Calcul debit").Cells(i, 18) = "NON"
        Sheets("Calcul debit").Cells(i, 19) = ""
    End If
Else
    Sheets("Calcul debit").Cells(i, 14) = ""
    Sheets("Calcul debit").Cells(i, 15) = ""
    Sheets("Calcul debit").Cells(i, 16) = ""
    Sheets("Calcul debit").Cells(i, 17) = ""
    Sheets("Calcul debit").Cells(i, 18) = ""
    Sheets("Calcul debit").Cells(i, 19) = ""
End If

If Beast <> -32768 And Bnorth <> -32768 And Bup <> -32768 And BT4 <> -32768 And Sheets("Calcul debit").Cells(i, 1) <> "" Then
    Sheets("Calcul debit").Cells(i, 21) = Beast
    Sheets("Calcul debit").Cells(i, 22) = Bnorth
    Sheets("Calcul debit").Cells(i, 23) = Bup
    Sheets("Calcul debit").Cells(i, 24) = Berror
    If Abs(Berror) <= Sheets("Calcul debit").Cells(8, 11) Then
        Sheets("Calcul debit").Cells(i, 25) = "OUI"
        Sheets("Calcul debit").Cells(i, 26) = Bup
    Else
        Sheets("Calcul debit").Cells(i, 25) = "NON"
        Sheets("Calcul debit").Cells(i, 26) = ""
    End If
Else
    Sheets("Calcul debit").Cells(i, 21) = ""
    Sheets("Calcul debit").Cells(i, 22) = ""
    Sheets("Calcul debit").Cells(i, 23) = ""
    Sheets("Calcul debit").Cells(i, 24) = ""
    Sheets("Calcul debit").Cells(i, 25) = ""
    Sheets("Calcul debit").Cells(i, 26) = ""
End If

End Sub


Sub Calcul_dQprec(i, l, c) 'Calcul du debit, si ensemble invalides, on recupere la vitesse d avant les ensembles invalides
Dim ivar As Integer

ivar = i
If Sheets("Calcul debit").Cells(i, 1) <> "" Then

    If Sheets("Calcul debit").Cells(i, 25) "NON" Or Sheets("Calcul debit").Cells(i, 21) "" Then
        Sheets("Calcul debit").Cells(i, 36) = "BAD"
    Else

        While Sheets("Calcul debit").Cells(ivar, 36) <> "Valide" And ivar > 5   'On recule jusqu a trouver un ensemble précédent valide
            ivar = ivar - 1
        Wend
        
        ivar = ivar - 1
        
        Do      'On recule encore pour se placer au début de l'ensemble
            If Sheets("Calcul debit").Cells(ivar, 36) "Valide" Or Sheets("Calcul debit").Cells(ivar, 36) "Invalide" Then Exit Do
            If ivar <= 5 Then Exit Do
            ivar = ivar - 1
        Loop
                
        If ivar > 5 Then
            ivar = ivar + l 'On redescend pour se placer à la meme hauteur d'eau que celle de l'ensemble suivant
            
            If Sheets("Calcul debit").Cells(ivar, 30) <> "" Then
                Sheets("Calcul debit").Cells(i, 36) = Sheets("Calcul debit").Cells(ivar, 30) * Sheets("Calcul debit").Cells(i, 33) * Sheets("Calcul debit").Cells(i, 35)
            Else
                'If Sheets("Calcul debit").Cells(ivar, 18) = "NON" Then 'On ne provoque l'extrapolation sur les bins que si le bin est invalidé et WT error ...
            
                If Sheets("Calcul debit").OptionButton4.Value = True Then   'Si le bin n'a pas de valeur de vitesse, on va les chercher sur les bins sup ou inf
                    Call Calcul_dQsup(ivar, i)
                Else
                    If Sheets("Calcul debit").OptionButton5.Value = True Then
                        If l = c Then 'si et seulement si on a atteint le fond de la rivière
                            Call Calcul_dQinf(ivar, i)
                        End If
                    Else
                        If Sheets("Calcul debit").OptionButton6.Value = True Then
                            If l = c Then   'si et seulement si on a atteint le fond de la rivière
                                Call Calcul_dQmoyvert(ivar, i)
                            End If
                        Else
                            If l = c Then   'si et seulement si on a atteint le fond de la rivière
                                Call Calcul_dQcomp(ivar, i)
                            End If
                        End If
                    End If
                End If
                'Else
                    'Sheets("Calcul debit").Cells(i, 36) = "BAD"
                'End If
            End If
        Else
            Sheets("Calcul debit").Cells(i, 36) = "BAD"
        End If
        

    End If
Else
        Sheets("Calcul debit").Cells(i, 36) = ""
End If

End Sub



La procédure estimation_débits_non_mesure repère en gros la procédure d'évaluation une deuxième fois une fois les données en place.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 13:14
Bien !
on va commencer par la première procédure.
C'est quoi, tous ces "calculate" ? Tu as bourré ta feuille de formules ?
Tu as empêché quelque-part dans ton code le calcul automatique ?

Par ailleurs : tu veux travailler sur des tableaux dynamiques ? ===>>
et le premier a pour limites celles fixées par :
While i - 1 <e
alors que i commence à et e e = Sheets("Calcul debit").Range("K13").value (sil te plait : précise .Value)
Travaille alors sur le tableau toto = Sheets("Donnees").usedrange
Kif-kif en ce qui concerne l'utilisation d'un tableau dynamique pour ce qui est de ta feuille calcul.debit

Mais surtout : l'examen de ce code montre de graves défauts d'analyse, puis de conception. Tu aboutis alors forcément ainsi à une espèce d'usine à gaz, tout naturellement !
Et je ne crois pas que l'utilisation d'un autre langage azpporterait à ce code, tel qu'il est, une véritable amélioration.
Si tu penses que le fait que d'autres langages t'obligerait à utiliser des tableaux dynamiqyues, bé ===>> crée de suite sous vba les deux tableaux dynamiques suivants (grossier et pouvant être affiné) :

dim tablo1, tablo2
tablo1 = Sheets("Donnees").usedrange
'et
tablo2 = Sheets("calcul.debit").usedrange

et tu les auras, tes deux tableaux dynamiques complets (bien trop, même). et ils contiendront toutes les données de tes deux feuilles.

Ah ... mais tu vas bien évidemment être "un peu embêté" avec les formules dans les cellules ? Ouais ? Et dis-moi, alors : tes "formules Excel" , tu ne les aurais pas, non, avec un autre langage ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011
24 oct. 2011 à 13:47
Alors :

- J'ai en effet bloqué le calcul automatique sur la feuille, pour éviter de perdre du temps de calcul

- J'utilise en effet calculate car certaines opérations sont effectuées sous excel plutôt qu'avec VB, mais je devrais pouvori les reprendre sans problèmes sous VB s'il le faut (il me manquera juste une procédure simple poru calculer sous vb la somme ou la moyenne d'une colonne d'un tableau)


Code Visual Basic :While i - 1 <ealors que i commence à et e e = Sheets("Calcul debit").Range("K13").value (sil te plait : précise .Value)
Travaille alors sur le tableau toto = Sheets("Donnees").usedrange
Kif-kif en ce qui concerne l'utilisation d'un tableau dynamique pour ce qui est de ta feuille calcul.debit



Je n'arrive pas trop à comprendre le sens de ta phrase.

La procédure usedrange sert, si je comprend bien, à délimiter la taille d'une feuille excel en fonction des premières et dernières cellules. Quel rapport avec l'utilisation d'un tableau dynamique ?

Je n'ai rien contre l'utilisation de vb pour les calculs hein : ça me serait même beaucoup plus pratique si je n'utilisais les feuilles excel que pour l'affichage. L'ennui c'est qu'il me faut en gros un tableau de même type que celui que j'utilise, que je n'aurais besoin d'afficher qu'une fois les calculs terminés, et qui maximise le temps de calcul.

Pour les problèmes de conception je veux bien, je n'ai jamais prétendu être programmeur, par contre si c'est simplement pour me faire comprendre "ça marche pas bien parceque le code est tout pourri" ça ne fait pas trop avancer le schmilblick.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 18:04
C'est surtout la conception, qui n'est pas adéquate et qui rend même très malaisée la compréhension de ce qui est fait (et donc inévitablement de la maintenance !)
Je dois t"'avouer que j'ai cherché à comprendre et ai vite abdiqué (tournis).
On va donc essayer différemment :
Parle-nous de ce que tu as au départ dans chaque feuille (les données uniquement, sans nous dire à quoi elles correspondent et qui ne nous regarde point).La structure de chaque feuille, quoi (et rien d'autre)
Parle-nous ensuite des calculs que tu as à faire (à partir de quelles données et sur quelle feuille en résultat). fais-le avec clarté.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011
26 oct. 2011 à 15:36
Un topo plus complet sur le programme :

(Données de bases à traiter : on peut le résumer comme un tableau de points sur lesquels s'appliquent diverses données et dont la hauteur des colonnes est variable. Les points forment des entités appelées "cellules" et les colonnes des entités appelées "ensembles")

Fiche Données : les données de base sont formatées de manière à ce qu'une ligne regroupe toutes les infos sur chaque cellule qui la compose (on se décale d'une colonne sur cette ligne chaque fois qu'on descend d'une cellule sur l'ensemble)

Fiche Calcul debit : organisée de manière plus lisible par l'utilisateur. Une ligne correspond cette fois à une cellule, pour lesquels on va effectuer différents calculs. On change de ligne lorsqu'on passe à la cellule suivante, et on saute une ligne lorsqu'on passe à l'ensemble suivant.

Point important : on considère qu'on ne connait pas d'avance le nombre d'ensembles et surtout le nombre de cellules par ensembles. Il est en effet difficile de récupérer ce nombre

La structure de cette fiche :

- Le premier jeu de colonne récupère des données contenues dans la fiche "données" et les met en forme sur 8 colonnes. Ces données, variables pour chaque cellules, vont former les données brutes du calcul .

- Sur le second jeu de colonnes on récupère les données du premier jeu en en supprimant certaines suivant différents critères (ex : lorsque les données brutes renvoient -32768, c'est qu'on a touché le fond de la rivière : on ne récupère pas les cellules en dessous) puis on effectue certains calculs dessus

-Sur le troisième jeu on effectue des caluls dépendants du second jeu de colonnes.

Pour ces trois jeu de colonnes on effectue les calculs ligne par ligne : cad le programme part de la colonne de gauche , effectue les calculs pour les jeux de colonnes 2 puis 3 avant de passer à la colonne suivant.

-Le jeu de colonnes 4 nécessite que les calculs précédents aient été effectués pour toutes les cellules (toutes les lignes). Même structure que les colonnes précédentes : dès que tous les calculs sont terminés pour les jeux 1 à 3 on effectue les calculs à partir de la première ligne puis on descend.

-Le jeu 5 nécessite que le jeu 4 ai été totalement calculé, même structure.

-On inscrit les résultats finaux de ces calculs dans des cellules séparées.

Deux boutons sur cette feuille :

-Le premier pour charger les données depuis un fihcier ASCII vers la feuille "Donnees" avec un contrôle de type commondialog.

-Le second pour récupérer ces données dans la feuille "calcul débit"

Une série d'option buttons permet de modifier les paramètres de l'éxécution

Fiche "Calcul incertitudes" :

Le principe est d'effectuer l'opération "calcul debit" sur plusieurs fichiers différents, et pour chaque fichier suivant différents paramètres (10 variations)

Deux boutons :

-Le premier pour charger les ficheirs ASCII dans des feuilles identiques à "Donnees"

-Le second pour lancer le calcul : pour un fichier on transfert les données vers la feuille "Donnees", on effectue l'oprétion "Calcul debit "pour ce fichier, on inscrit les résultats dans la feuille "Calcul incertitudes", on change un paramètre et on recommence pour ce fichier de données, etc... jusqu'à ce que tous les paramètres aient été étudiés, puis on passe au fichier suivant ... En moyenne on va effectuer 60 fois l'opération "Calcul débit"

Fiche "Résultats incertitudes"

On fait quelques derniers calculs à partir des résultats affichés sur la feuille "Calcul incertitudes", puis on affiche les résultats sous forme de tableaux et de diagramme.

Voici, grossièrement expliqué, en quoi consiste le programme.
0
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011
2 nov. 2011 à 09:58
Je me permet de upper mon post, étant donné qu'à l'heure qu'il est je n'ai toujours pas trouvé de solutions à mon problème.

De plus en comparant les temps de calculs dans les cas de formules excel, de calculs en vb reportés directement dans le tableur et de calcul fais dans un tableau dynamique qui est ensuite recopié dans le tableur, je ne constate pas de différence confondante.

Pire la dernière solution semble la plus lente.

Une idée pour ne pas avoir à changer de langage ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 nov. 2011 à 10:40
Bonjour,

ce sont les explications que tu as données qui ne permettent pas de t'orienter, de t'aider !

y "arrivent" des "jeux de colonne" dont on se demande ce que c'est, ce que tu entends par là !
Dépose sur un site ad-hoc une image de chaque "fiche" en y montrant (dessine par dessus) ce que tu entends par tes explications. Montre aussi les données de départ et les résultats attendus
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Atraxor Messages postés 20 Date d'inscription lundi 29 août 2011 Statut Membre Dernière intervention 5 décembre 2011
8 nov. 2011 à 13:23
Bonjour.

Je répond encore une fois en retard, ce qui n'est pas trés poli et je m'en excuse.

J'ai résolu le problème lié que je croyais lié au temps de calcul : celui ci n'est pas trés différent entre un calcul direct sur le tableur et un calcul en pur code vba.

En revanche ce qui est trés gourmant en temps, c'est l'affichage des résultats dans le tableur (même sans utiliser le calcul automatique des cellules !) : en effet en effectuant tous les calculs sur un tableau vba plutôt que sur le tableur, puis en superposant ce tableau à la feuille de calcul, je m'aperçois que c'est bien cette étape qui prend le plus de temps .

La solution est simplement de ne pas afficher les résultats entre deux changements de paramètres d'entrée pour le programme qui effectue séquentilelement une centaine de calculs.

Je passe ainsi d'1h à 3 min ...

En vous remerciant pour votre aide, malgré les explications peu claires que j'aie pu fournir.
0
Rejoignez-nous