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 :

Array + sum if : correction de code [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Par défaut Array + sum if : correction de code
    Bonjour,

    Voici mon code qui me permet d'effectuer une sumif à partir d'une array(). Mon code rencontre un problème de poids.

    En effet, lorsque j'utilise Array() avec un loop For X= 1 to Ubound (Z) la fonction array () considère Ubound est considéré à 4. Conséquemment, j'ai une limite qui se situe entre 0 et 4 au lieu de 1 à 5.

    Comme puis-je corriger ce petit problème?

    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 calcul_sumif()
     
    Dim I As Integer
    Dim Caridal As String
    Dim Count_nb, region as variant
     
    count_nb = WorksheetFunction.CountA(Sheets("data").Range("a:a"))
    Cardinal = Array("East", "North", "South", "West", "Central")
     
    For I = 0 To UBound(Cardinal) ''''Mon problème ce trouve ici
        region = WorksheetFunction.SumIf(Range("b1: b" & count_nb), Range("f" & I).Value, Range("c1: c" & count_nb))
        Range("g" & I) = region '''' en effet, G0 n'existe pas sur une feuille excel => Erreur 
    Next I
     
    End Sub

  2. #2
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,

    euh ben simplement en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For I = 1 To UBound(Cardinal)+1
    non?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Par défaut
    Tu es tout simplement excellent! Le code cours 5 fois à la place de 4.

    Bon j'attaque les arrays () à 2 dimensions ... A partir ce code, je souhaite organiser les résultats en fonction du mois et de la région, puis les coller dans une feuille précise pour me sortir un graph.

    J'ai pas fini de m'épanouir avec ce nouvel instrument!

  4. #4
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    a noter que tu devrais changer cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("g" & I) = region '''' en effet, G0 n'existe pas sur une feuille excel => Erreur
    pour plutot faire comme ça (enfin c'est ce que je ferais moi en tout cas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For I = 1 To UBound(Cardinal)+1 ''''Mon problème ce trouve ici
        region = WorksheetFunction.SumIf(Range("b1: b" & Count_nb), Range("f" & I).Value, Range("c1: c" & Count_nb))
    Next I
    Range("G1:G5") = region 'cette plage ne changera pas donc... pas besoin de la mettre dans la boucle

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For I = 1 To UBound(Cardinal)+1 ''''Mon problème ce trouve ici
        region = WorksheetFunction.SumIf(Range("b1: b" & Count_nb), Range("f" & I).Value, Range("c1: c" & Count_nb))
    Next I
    Range("G1:G5") = region 'cette plage ne changera pas donc... pas besoin de la mettre dans la boucle
    J'avais essayé, mais j'obtenais 0 dans les cellules. D'où l'insertion dans la boucle...

  6. #6
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    au temps pour moi, je dis une grosse bétise
    fait comme si j'avais rien dis!

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Par défaut
    Est-ce que si je modifies ceci dans le loupe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    region = WorksheetFunction.SumIf(Range("b1: b" & Count_nb), Range("f" & I).Value, Range("c1: c" & Count_nb))

    par cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    region = WorksheetFunction.SumIf(Range("b1: b" & Count_nb), Cardinal(I), Range("c1: c" & Count_nb))
    Le problème avec cette méthode, si Cardinal (I) n'existe pas dans la plage de référence, il me sort une erreur. J'ai contourné le problème par une autre écriture. (celle ci-dessus)

  8. #8
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bon je me reveille peu à peu

    une question
    pourquoi ne pas mettre directement les formules dans les cellules excel?

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Par défaut
    C'est une idée. Je suis en phase débutant sur VBA, j'utilise tout ce que je peux afin de passer le grade supérieur et devenir plus autonome.

    Etant donnée que je maîtrise excel, je revois mes fichiers afin de les écritures en VBA. Finis les > +1MO. J'utilise un bouton de commande et en quelques secondes le travaille est fait :-). J'ai plus qu'à les analyser et écritures le rapport.

    Est-ce que tu sais pourquoi lorsque l'on utilise array () I doit toujours être égal à 0 avec de considérer l'ensemble des données?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Cardinal = Array("East", "North", "South", "West", "Central")
     
    For I = 0 To UBound(Cardinal) ''''Mon problème ce trouve ici
        region = WorksheetFunction.SumIf(Range("b1: b" & count_nb), Range("f" & I).Value, Range("c1: c" & count_nb))
        Range("g" & I) = region '''' en effet, G0 n'existe pas sur une feuille excel => Erreur 
    Next I
    For I = 0 To UBound(Cardinal)

    For I = 1 to ubound(cardinal)
    Si je mets 1, cardinal considère "North" à la place de "East?

    For I = 1 to ubound(cardinal)+1
    J'obtiens la même chose, 1 = "North"

    Mais si I = 0, alors ma variable comprends l'ensemble des éléments array(). Pourquoi?

    Bon, c'est peut-être une question assez lourde pour le ptt' déj. Mais si tu as une idée, je suis preneur.

  10. #10
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    par défaut un tableau commencera par 0
    si tu veux qu'il commence par 1
    en début de module dans la partie Declaration, tu dois mettre

    juste en dessous de tout les tabeau commenceront a partir de 1 par défaut

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

Discussions similaires

  1. correction du code
    Par fraisa1985 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/07/2008, 15h55
  2. Correction du code
    Par punisher999 dans le forum Langage
    Réponses: 8
    Dernier message: 28/01/2007, 21h26

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