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 :

Matrice qui devrait être symétrique n'est pas symétrique ( pb d'arrondis de calcul?)


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Matrice qui devrait être symétrique n'est pas symétrique ( pb d'arrondis de calcul?)
    Salut, c'est déja ma troisième question (vba me pose beaucoup de problèmes) j'espère ne pas abuser de la gentillesse des membres de ce forum! ^^.

    Mon problème est cette fois que quand je calcule une matrice de covariance celle-ci n'est pas rigoureusement symétrique, exemple le coin supérieur droit est de la forme
    1 0,0005686 0,000789
    0,000572 2 0,000326
    0,000742 0,000295 3


    Donc je crois qu'il y a un problème avec la précision des calculs, mais je ne vois pas très bien quand comment puisque de toute facon vba est sensé faire les même approxiamtions de parts et d'autres non?
    Je vous fournis mon code:
    ' moy(int i) calcul la moyenne sur la colonne i
    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
     
    Sub covariance()
       Dim help As Double
       Dim aux As Double
       Dim rep As Double
    For m = 1 To 11
          For n = 1 To 11
                   Feuil4.Activate
                   Dim ko As Double
                   Dim koko As Double
                   ko = moy(m)
                   koko = moy(n)
     
                   For i = 665 To 1353
                        help = Cells(i, m) - ko
                        aux = Cells(i, n) - koko
                        rep = rep + help * aux
                 Next
                 rep = rep / (1353 - 665 + 1)
                 Feuil6.Activate
                Cells(m, n) = rep
         Next
    Next
    End Sub

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour, bonjour !

    VBA se contentant d'exécuter le code, l'erreur provient souvent de la conception ‼
    Regrouper les déclarations de variables en en-tête de procédure aide aussi à s'y retrouver …

    Commencer par ajouter Option Explicit au début du module, le seul conseil possible avec un code incomplet !

    Et pourquoi ne pas utiliser la fonction Excel COVARIANCE ?‼

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Donc je crois qu'il y a un problème avec la précision des calculs
    Peut être vous faut-il déclarer vos variables en type Variant puis, au sein du traitement, les convertir en Decimal avec la fonction CDec.

    Extrait de l'aide
    CDec Decimal
    +/-79 228 162 514 264 337 593 543 950 335 pour les nombres sans décimales. La plage de valeurs des nombres à 28 décimales est
    +/-7,9228162514264337593543950335. Le plus petit nombre différent de zéro est 0,0000000000000000000000000001.

    Note La fonction CDec ne renvoie pas un type de données isolé, mais un type Variant dont la valeur a été convertie en sous-type Decimal
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim rep As Variant
    rep = CDec(rep)
     
    rep = CDec(rep) + CDec(help) * CDec(aux)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    J'ai mis l'option explicit mais sans trop de surprises ca ne change rien.

    J'ai aussi mis des CDec un peu partout mais excel ne reconnait pas la fonction (sub or function not defined) pourtant quand je l'écris il fait les ajustements typographiques ( et je croyais que ca voulais dire qu'il reconnaissait la fonction justement.)

    En dernier ressort je peux utiliser la fonction covariance mais ce serait dommage maintenant que j'ai écrit ce code, ce n'est pas sensé être très difficile..

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour

    Il faut déclarer As Double. Le type Decimal n'existe pas. Par contre la fonction de conversion Cdec existe depuis Excel 2000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim LDecimal As Double
     
    LDecimal = CDec(8.45 * 0.005 * 0.01)
    Cordialement

    Docmarti.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre aide.
    J'ai du changer de version d'excel depuis ce week end. Pour le post précédent j'utilisais une version anglaise c'est surement pour ca que ca ne marchait pas? Maintenant je suis passé à une version francaise 2003. J'ai mis tous les cdec ( qui sont reconnus) mais ca ne change rien.

    Autre problème: j'ai essayé la fonction covariance , j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    covariance(A1:A10 ;B1:B10)
    mais ca m'indique "mettez une ) ou un séparateur de liste". Pourtant j'ai fais un copier coller de la fonction sur la feuille de calcul et elle marche très bien...

    ps: Suis je le seul à penser qu'excel vba n'est pas très bien foutu? j'ai l'impression d'avoir un problème à chaque ligne,et les messages d'erreur ne m'aide pas bcp..

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    covariance(A1:A10 ;B1:B10)
    Bonjour,

    Essayez le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub aa() 'Inscrit la formule dans la feuille
    Range("D1").Formula = "=COVAR(" & "a1:a10" & "," & "b1:b10" & ")" & ""
    End Sub
     
    Sub bb() 'Inscrit le résultat dans la feuille et NON PAS la formule
    Range("D2") = Application.WorksheetFunction.Covar(Range("a1:a10"), Range("b1:b10"))
    End Sub

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup! Ca marche, mais maintenant je n'arrive pas à implémenter en parcourant les colonnes et lignes: voila ce que j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To 11
            For j = 1 To 11
     
    Cells(i, j) = Application.WorksheetFunction.Covar(Feuil4.Range(i & "665" & ":" & i & "1353"), Feuil4.Range(j & "665" & ":" & j & "1353"))
    Ca me dit impossible de lire la propriété covar de la classe workfunctionsheet...

    D'une manière générale avec range (au lieu de cells ) je ne peux pas itérer sur les colonnes (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i=1 to 10 a= range( "a"& i)
    marche mais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for i=1 to 10 a =range(i&"5")
    j'ai trouvé sur internet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each col In Range("A1: J10").Columns
         For Each c In col.Cells
            c.Value = "jhkjhkj"
            Next
    Next
    mais ce n'est pas réutilisable dans mon cas..

    j'ai aussi utilisé ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To 11
            For j = 1 To 11
     
    Cells(i, j) = Application.WorksheetFunction.Covar(Feuil4.Range(Cells(i, 665), Cells(i, 1345)), Feuil4.Range(Cells(j, 665), Cells(j, 1345)))
    mais ca ne marche, erreur définie par l'application ou l'objet

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    for i=1 to 10 a =range(i&"5")
    Pour avoir une référence correcte i devrait être une lettre.
    Essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i=1 to 10 
    a =cells(5,i)
    eric

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre aide, mais mon problème est que je dois utilisé Range dans la fonction 'covar' (j'ai essayé avec cells plus haut mais ca ne marche pas) car je ne connais la syntaxe de covar qu'avec range. bref un problème de syntaxe qui s'éternise..

    Pour résumé, j'ai un tableau de 10 colonnes avec des chiffres et je voudrais écrire sur une autre feuille la matrice de varaince covariance. Pour l'instant je n'arrive pas à utiliser correctement 'covar'

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    si i=3, cells(5,i) te défini un range exactement de la même façon que range("C5").
    Note que l'ordre des paramètre est cells(ligne,colonne). A voir certains de tes essais je me demande si tu n'inversais pas.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Août 2015
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Oui j'avais fini par inverser colonnes et lignes dans la methode cell...Cela dit ca ne marche toujours pas..
    Je sais que cells et range sont censé etre equivalent , en tout cas je ne trouve pas la bonne syntaxe avec cette méthode covar

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour (1 fois par jour ça se fait...),

    Tu pourrais déposer un fichier de travail avec une matrice et ton code pour tester.
    eric

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/03/2013, 12h19
  2. Requête HTTP qui devrait être toute simple !
    Par fagma dans le forum GWT et Vaadin
    Réponses: 11
    Dernier message: 27/09/2012, 13h23
  3. Réponses: 1
    Dernier message: 20/04/2011, 18h03
  4. hover(), l'objet qui devrait être visible reste caché
    Par moumous24 dans le forum jQuery
    Réponses: 1
    Dernier message: 25/01/2011, 22h26
  5. Gridview qui est vide (et qui devrait pas)
    Par SkyBack dans le forum ASP.NET
    Réponses: 6
    Dernier message: 16/09/2008, 12h12

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