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 :

Multiplication avec deux boucles [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Par défaut Multiplication avec deux boucles
    Bonjour,

    Je suis entrain de travailler sur vba et je me retrouve avec une colle.
    Mon souci est le suivant:

    J'ai une feuille qui à une colonne avec des valeur en pourcentage.
    Dans une autre feuille j'ai des valeurs historiques de plusieurs titres en ligne. Les titres sont eux en colonne.

    Ce que je désire c'est pour chacun des titres je multiplie par le pourcentage de la première feuille chaque jours et de chaque titre. Et en faire la moyenne.

    Si je schématise :

    jours 1 : %1 * titre1 + %2 * titre2+...
    jours 2 : %1 * titre1 + %2 * titre2+...
    jours 3 : %1 * titre1 + %2 * titre2+...
    ...

    à la fin je fais la moyenne de l'ensemble.

    Ce que j'avais pensé c'était d'utilisé deux boucles for avec une variable x et y mais je ne sais pas trop comment m'y prendre.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Est-ce que tu pourrais donner un exemple avec des nombres ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Par défaut
    Je te montre le fichier.

    J'ai mis les résultat attendu avec les formules excel.

    J'avais essayé comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For y = 1 To 345
    For i = 1 To range("a1").Value
    total = total + Cells(i + 2, 6).Value * Cells(y + 1, i+12).Value
    Cells(y + 2, 8).Value = total
    Next i
    Next y

    Mon problème c'est que quand je fais cette procédure il m'additionne à chaque fois aussi les précédentes.

    Ce que je voudrais c'est que dans la colonne h il y a les rendement pour chaque jours avec la pondération pour chaque titres. et dans la cellule i3 j'aimerais faire la moyenne des résultats de la colonne h
    Fichiers attachés Fichiers attachés

  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
    Sans vba

    En H2, tu mets la formule matricielle (à valider par Ctrl Shift Enter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD($F$3:$F$15;TRANSPOSE($L2:$X2))
    Tu tire la formule vers le bas

    Bien sur la disposition des titres doivent correspondre entre lignes et colonnes comme c'est le cas sur ton fichier

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Par défaut
    merci mercatog même si c'est pas du vba, je me suis inspiré de ce que tu m'as dis et j'ai essayé de faire une boucle différente la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To 200
    Transpose = Application.WorksheetFunction.Transpose(range("l2:x2"))
     
    Worksheets("Feuil2").Cells(i + 2, 12).Value = WorksheetFunction.SumProduct(.range("F3:f15").Value, Transpose)
    Next i
    Cela marche mais seulement pour 1, j'aimerais que et soit remplacé par un i pouvoir faire les autre jours aussi.

  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
    Ici une autre approche (utilisation des formules Excel par vba)
    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
    Sub Test()
    Dim Moy As Double
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        .Range("G2").FormulaArray = "=SUMPRODUCT($F$3:$F$15,TRANSPOSE(L2:X2))"
        .Range("G2").AutoFill .Range("G2:G345")
        With .Range("G2:G345")
            .Value = .Value
            Moy = Application.Average(.Value)
            .ClearContents
        End With
        .Range("G1") = Moy
    End With
    End Sub
    La moyenne est inscrite en G1, le formules en G2:G345 et ensuite effacées.
    Si tu désires garder les formules, il suffit de supprimer la ligne 11 du code

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Par défaut
    merci beaucoup.

    mais comment je pourrais renommer "($F$3:$F$15,TRANSPOSE(L2:X2)" si maintenant je voudrais avoir la possiblité de changer le nombre de titre ?

    Dans cette exemple il'y en avait 13 mais si maintenant j'ai seulement 4 ou bien 20.

  8. #8
    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
    C'est possible, il suffit de décrire la disposition de ton fichier d'une façon plus générale et de faire ressortir les paramètres changeants et ceux fixes?

    Exemple, tes titres sont toujours en B3:Bxx où xx variable, et de la colonne L jusqu'à la colonne YY variable

    Tes statistiques s'arrêtent toujours en ligne 345 ou variables...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Par défaut
    merci mercatog mais cela ne fonctionne pas.

    Finalement j'essaye avec la fonction produit mat et j'ai écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim matrice1, matrice2 As range
     
    matrice1 = range(Cells(3, 6), Cells(range("a1").Value + 2, 6))
    matrice2 = range(Cells(2, 12), Cells(345, range("a1").Value+ 12))
     
     
     
    range(Cells(3, 10), Cells(347, 10)).Value = Application.WorksheetFunction.MMult(matrice2, matrice1)


    Mais cela bug en me soulignant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matrice1 = range(Cells(3, 6), Cells(range("a1").Value + 2, 6))

  10. #10
    Membre émérite Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Par défaut
    bonjour
    Dim matrice1, matrice2 As range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim matrice1 as range, matrice2 As range
    sinon matrice1 est variant

  11. #11
    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
    Le code précédent adapté

    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
    Sub Test()
    Dim N As Integer, M As Integer
    Dim Moy As Double
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        N = .Cells(.Rows.Count, "B").End(xlUp).Row
        M = .Cells(.Rows.Count, "L").End(xlUp).Row
     
        .Range("G2").FormulaArray = "=SUMPRODUCT($F$3:$F$" & N & ",TRANSPOSE(" & .Range("L2").Resize(1, N - 2).Address(0, 0) & "))"
        .Range("G2").AutoFill .Range("G2:G" & M)
        With .Range("G2:G" & M)
            .Value = .Value
            Moy = Application.Average(.Value)
            '.ClearContents
        End With
        .Range("G1") = Moy
    End With
    End Sub

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Par défaut
    Merci meratog Malheureusement j'obtiens pas les mêmes résultats

    Par contre j'ai suivi les instructions de keygen08 en nommant les variables "variant" mais cela bug. par contre lorsque j'inscris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim matrice1, matrice2 As Variant
     
     
     matrice1 = Range("f3:F15")
     matrice2 = Range("l2:x200")
     
     
     
    Range(Cells(3, 10), Cells(347, 10)).Value = Application.WorksheetFunction.MMult(matrice2, matrice1)
     
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    au lieu de Dim matrice1, matrice2 As Variant
     
    matrice1 = Range(Cells(3, 6), Cells(Range("a1").Value + 2, 6))
    matrice2 = Range(Cells(2, 12), Cells(345, Range("a1").Value + 12))
     
     
     
     
    Range(Cells(3, 10), Cells(347, 10)).Value = Application.WorksheetFunction.MMult(matrice2, matrice1)
     
    End Sub



    Pourtant cela veux dire la même chose. Est-ce que vous voyez le problème ?

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/02/2012, 18h24
  2. Problème avec deux boucles
    Par Akim13 dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2011, 05h12
  3. Problème avec deux boucles do whiles imbriquées
    Par breizh297 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/11/2010, 08h37
  4. Recherche avec deux conditions et deux boucles?
    Par neiluj26 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/10/2008, 19h49
  5. Réponses: 3
    Dernier message: 24/05/2007, 17h56

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