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

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

Macros et VBA Excel Discussion :

Calcul suivi d'un tri [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut Calcul suivi d'un tri
    Bonjour,

    Dans ma feuille, j'ai 3 colonnes A, B et C.

    Dans A --> 1 à i.
    Dans les colonnes B et C, des nombres aléatoires.

    Ce que je cherche à faire :

    (1)Colonne D, pour Di je calcule Bi+Ci-C(i+1).
    Si Di <0, j'affiche 0, sinon j'affiche 1 (donc si Di >= 0).

    (2)Lorsque dans la colonne D, il y a un 1, j'aimerais intervertir les plages (Ai:Ci) et (A(i+1):C(i+1))

    (3)A nouveau étapes (1) puis (2) jusqu'à ce que la colonne D ne comporte que des 0.

    Bien sûr, c'est faisable à la mimine, mais lorsque i est important, cela devient ingérable...
    C'est pourquoi j'aimerais bien me créer une petite macro !

    Et comme vous pouvez vous en douter, je ne suis absolument pas ami avec Excel et ses macros ...

    Merci d'avance pour vos pistes de résolution.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    (3)A nouveau étapes (1) puis (2) jusqu'à ce que la colonne D ne comporte que des 0.
    Une première question, es tu sûr que ton petit algorithme ne diverge pas (c'est à dire si tu es sûr d'avoir des 0 en D)

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut
    Alors oui pour répondre à ta question.

    En fait, pour plus de précisions.

    -le véritable petit algo :

    Di = [Bi*C(i+1)*(P+Ci)] - B(i+1)*Ci*(P+C(i+1))]

    Donc pour D1 = B1*C2*(P+C1) - B2*C1*(P+C2)

    Avec P une constante,
    Bi et Ci nombres aléatoires entre 1 et n (je fixe n dans le tirage, en général n = 100).
    P, Bi et Ci ont entre 10 et 20 décimales.

    Donc en théorie, l'algo peut diverger effectivement, mais en pratique à priori non du fait des nombres tirés.
    Mais cela peut arriver... Je n'avais pas pensé à ce contrôle.

    -En consultant le forum, j'ai vu qu'il était possible de déterminer le temps d'éxécution de l'algo (avec plus ou moins de précisions).
    Est-il possible de déterminer le nombre d'itérations également ?

    Merci.

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tu peux mettre un fichier pour pouvoir tester?

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut
    Et voivi.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Essaies avec la sub Tester
    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
    Sub TESTER()
    Dim Bi As Double, Ci As Double, Bii As Double, Cii As Double, Di As Double, P As Double
    Dim CTR As Integer, Limit As Integer
    Dim LastLig As Long, i As Long
    Dim Encore As Boolean
    Dim S As Single
    Dim Tb
     
    Application.ScreenUpdating = False
    Limit = 2000                                                                                       'Limite des itérations pour éviter la boucle infinie en cas de divergence
    S = Timer                                                                                          'Pour compter le temps d'exécution
    P = Application.Pi()                                                                               'Ici j'ai pris Pi comme variable pour P
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        Tb = .Range("A1:C" & LastLig)
        Do
            Encore = False
            For i = 1 To UBound(Tb, 1) - 1
                Bi = Tb(i, 2)
                Ci = Tb(i, 3)
                Bii = Tb(i + 1, 2)
                Cii = Tb(i + 1, 3)
                Di = Bi * Cii * (P + Ci) - Bii * Ci * (P + Cii)
                If Di > 0 Then
                    Permut Tb, i, i + 1
                    Encore = True
                End If
            Next i
            CTR = CTR + 1
        Loop Until Not Encore Or CTR >= Limit
        .Range("A1:C" & LastLig) = Tb
    End With
    If CTR = Limit Then
        MsgBox "Solution non trouvée en " & CTR & " boucles (" & Timer - S & " secondes)"
    Else
        MsgBox "Traitement terminé en " & CTR & " boucles (" & Timer - S & " secondes)"
    End If
    End Sub
     
    'Permet de permuter les lignes i et j
    Private Sub Permut(T As Variant, i As Long, j As Long)
    Dim Tmp As Double
    Dim k As Byte
     
    For k = 1 To UBound(T, 2)
        Tmp = T(i, k)
        T(i, k) = T(j, k)
        T(j, k) = Tmp
    Next k
    End Sub

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut
    Erreur d’exécution 13 : incompatibilité de type ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tri par ordre croissant SUIVI d'un tri custom (Low,Medium, High)
    Par thierryakaguy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/07/2009, 11h13
  2. Pb de tri/critère sur un champ calculé
    Par Sakalam dans le forum Access
    Réponses: 6
    Dernier message: 10/01/2006, 18h24
  3. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24
  4. tri et calcul sur un champ
    Par PAUL87 dans le forum Access
    Réponses: 11
    Dernier message: 17/10/2005, 21h35
  5. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23

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