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 :

problème de boucle


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 87
    Par défaut problème de boucle
    Bonjour à tous,

    Je sollicite l'aide du forum car je suis bloquée depuis quelques jours sur la création d'une fonction...
    Mon fichier que vous trouverez en pièce jointe contient 4 fonctions :
    -une fonction Rectangle qui renvoie à un tableau que j’ai appelé mtxrectangle et qui se trouve sur la « Sheet1 ». (je l’ai coloré en bleu sur la feuille)
    -une fonction Aciers qui renvoie à un tableau que j’ai appelé mtxAciersXY et qui se trouve sur la « Sheet1 ». (je l’ai coloré en vert sur la feuille, la partie en vert clair étant celle que je souhaite récupéré)
    -une fonction Recap1 qui renvoie à un tableau que j'ai appelé mtxRecap1 récapitule certaines des données issues des 2 tableaux précédents et qui se trouve sur la « Sheet1 ». (je l’ai coloré en jaune sur la feuille)
    -une fonction generale qui renvoie à un tableau que j’ai appelé mtxgenerale et qui se trouve également sur la « Sheet 1 ». cette fonction fait appel aux tableaux issus des 3 premières fonctions et à un tableau devant être renseigné par l’utilisateur que j’ai coloré en orange (le tableau mtxgenerale est coloré en rouge sur la feuille).
    Mon problème se trouve sur la fonction generale et plus particulièrement sur cette boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    For l = 3 To 39
                For j = 2 To mtxAciersXY.Count / 76
                  y = mtxAciersXY(j, l)
                  d = mtxAciersXY(j, 2)
                  e = (ec - est) / (yaciermin - ymax) * (y - y2) + est
                       If Abs(e / 1000) < tbldonnees(9, 4) Then
                      sigma1 = e / 1000 * tbldonnees(8, 4)
                  Else
                      sigma1 = tbldonnees(7, 4)
                  End If
                  Ns = Ns + (Pi * d ^ 2 / 4) * sigma1
                Next
              Next
    Je m'explique..Pour calculer Ns j'ai besoin des valeurs du tableau en vert très clair:
    La deuxième colonne du tableau (où apparaissent les valeurs suivantes : 0.032,0.032,0.032,etc etc etc) correspond au "d"
    Toutes les autres colonnes qui suivent correspondent au "y".
    Pour chaque ligne i du tableau en vert clair je dois obtenir un Nsi. ainsi Ns correspond à la somme des Nsi
    Le problème est que je n'obtiens pas la valeur attendu pour Ns, le soucis venant de ma boucle

    J'espère avoir été claire . merci d'avance à ceux qui prendront la peine d'y répondre..

    PS: autres chose, l'exécution de ma fonction "générale" mets un temps fou..est-il possible de régler ce problème?
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Je n'ai pas regardé le fichier joint, mais je pense qu'il manque quelque chose ici
    mtxAciersXY.Count
    Peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mtxAciersXY.Rows.Count 
    'ou
    mtxAciersXY.Columns.Count

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 87
    Par défaut
    Merci à toi d'avoir pris le temps de répondre! en effet il y avait ce problème mais cela ne regle pas entièrement le soucis que j'ai.. Voici mon nouveau code après modifications..

    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
    Function generale(tbldonnees, mtxRectangle As Variant, mtxAciersXY As Variant, mtxRecap1 As Variant)
    PrécisionAlpha = 5
    NbrCoupure = 5
    Lignes2 = 15
    Pi = Application.WorksheetFunction.Pi()
    Nbrbarres = WorksheetFunction.Sum(Sheet1.Range("CM11:CM34"))
    ReDim mtxgenerale(Lignes2, (180 / PrécisionAlpha + 1))
    Ns = 0: Ms = 0: Nb = 0: Mb = 0: Ni = 0: Mi = 0
     
    For i = 0 To 180 / PrécisionAlpha
    alpha = i * PrécisionAlpha
    mtxgenerale(0, i + 1) = alpha
      For k = 1 To Lignes2
      ec = (tbldonnees(13, 2) * (1 + tbldonnees(19, 2))) / 1000
      est = -tbldonnees(9, 4) / 1000
      ymax = mtxRecap1(3, i + 2)
      yaciermin = mtxRecap1(6, i + 2)
      Halpha = mtxRecap1(2, i + 2)
     
        For m = 2 To Nbrbarres + 1
        y = mtxAciersXY(m, i + 3)
        d = mtxAciersXY(m, 2)
        e = ((ec - est) / (ymax - yaciermin)) * (y - yaciermin) + est
        If Abs(e) < (tbldonnees(9, 4) / 1000) Then
        sigma1 = e * tbldonnees(8, 4)
        sigma1 = tbldonnees(7, 4)
        End If
     
       Ns = Ns + (Pi * d ^ 2 / 4) * sigma1
    mtxgenerale(0, 0) = "Angle"
    mtxgenerale(1, 0) = "ec"
    mtxgenerale(2, 0) = "est"
    mtxgenerale(3, 0) = "ymax"
    mtxgenerale(4, 0) = "yaciermin"
    mtxgenerale(5, 0) = "sigmac"
    mtxgenerale(6, 0) = "sigmast"
    mtxgenerale(7, 0) = "Halpha"
    mtxgenerale(8, 0) = "Ns"
    mtxgenerale(9, 0) = "Ms"
    mtxgenerale(10, 0) = "Nb"
    mtxgenerale(11, 0) = "Mb"
    mtxgenerale(1, i + 1) = ec
    mtxgenerale(2, i + 1) = est
    mtxgenerale(3, i + 1) = ymax
    mtxgenerale(4, i + 1) = yaciermin
    'mtxgenerale(5, i + 1) = sigmac
    'mtxgenerale(6, i + 1) = sigmast
    mtxgenerale(7, i + 1) = Halpha
    mtxgenerale(8, i + 1) = Ns
    'mtxgenerale(9, i + 1) = Ms
    'mtxgenerale(10, i) = Nb
    'mtxgenerale(11, i) = Mb
    generale = mtxgenerale
    Next
      Next
      Next
    End Function
    je souhaiterai obtenir une valeur "Ns = Ns + (Pi * d ^ 2 / 4) * sigma1" pour chaque colonne. la première colonne étant 0, la seconde 5, la troisème 10 et ainsi de suite..
    seulement en mettant un espion je me rends compte que la manière dont j'ai écrit mes boucles ne convient pas. j'ai essayé d'inverser les boucles, d'ajouter des compteurs mais rien n'y fait j'ai toujours le même problème

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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