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 :

somme par compteur mais avec conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 24
    Points
    24
    Par défaut somme par compteur mais avec conditions
    Bonjour à tous,

    j'ai toujours obtenu des réponses très satisfaisantes par ici, je me tourne donc une nouvelle fois vers vous.

    Mon problème cette fois m'apparait un peu compliqué de par les conditions auxquelles il doit répondre, je m'explique:

    je réalise par maccro un croisement entre des produits (lignes) impactés par des contraintes (colonnes). 1 à l'intersection implique la contrainte agit sur le produit.
    ça ressemble à:

    ...................c1....c2....c3
    p1....A...p1....1......0......0
    p2....B...p1....1......1......0
    p3....C...p1....1......0......0
    p4....D...p1....0......0......0
    p5....A...p5....1......0......0
    p6....A...p6....0......0......0
    p7....A...p7....0......0......1
    p8....B...p7....0......0......0
    p9....C...p7....0......0......0
    p10...A..p10...1......1......1

    etc

    p les produits les lettres A, B etc correspondants à des stades. A étant le stade majeur, les autres sont des composés antérieurs apparentés au A précédent (d'où la 3e colonne qui marque le produit final)
    Une contrainte portant sur un produit B impactera donc le produit p correspondant au stade A qui le précède (même si elle ne doit pas être renseignée par le tableau)

    C'est pourquoi je voudrais indiqué par une somme en dessous de chaque colonne le nombre de produits A impactés par la contrainte de cette colonne.

    Exemple: pour la c1 il y a 3 produits de stade A impactés, 2 pour la c2

    J'espère que j'ai été assez clair...

    voilà ce que j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Debutextract = 5
    Finextract = wsh.Range("A30000").End(xlUp).Row
    PremiereligneR = 5
    Ligne = PremiereligneR
    Cpt = 0
     
    For K = 5 To DerniereCol - 1
        For I = Debutextract To Finextract
          If wsh.Cells(I, 2) = "A" Then Ref = wsh.Cells(I, "A").Value: If wsh.Cells(I, K) = "1" Then Cpt = Cpt + 1 _
          Else: wsh.Cells(Ligne, "C").Value = Ref
          Feuilreçu.Cells(DerniereligneR + 3, K) = Cpt 
        Next I
    Next K
    toutefois je vois bien qu'il y a un problème mais je ne parviens pas à réguler le compteur afin qu'il ne compte qu'une contrainte par groupe de filiation de produit...

    merci bien d'avance pour votre aide

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    J'espère que j'ai été assez clair...
    euh !!

    j'avoue que je n'ai pas tout compris dans ton code, en attendant

    Un bout de code pour additionner les contraintes par colonnes si A et écriture en bas de chaques colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For K = 5 To DerniereCol - 1
        For I = Debutextract To Finextract
            If wsh.Cells(I, 2) = "A" Then Cpt = Cpt + wsh.Cells(I, K)
        Next I
        wsh.Cells(Finextract + 1, K) = Cpt
    Next K
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    ^^' / :s oui désolé à froid j'imagine bien que ça n'est pas évident...

    pour essayer d'être plus précis, par rapport à ce que tu m'a donné,
    le but en fait c'est d'ajouter 1 au compteur par groupe.

    A est le fils du groupe, si A est impacté on compte cpt +1 donc.

    Par contre si le fils n'est pas impacté directement dans le tableau, il peut l'être par ce qui le précède. (idée de filiation)
    Donc si éventuellement B et/ou C impacté, cpt + 1 aussi (relatif au même A bien entendu...)

    Relatif au même A, c'est à dire au maximum cpt +1 par groupe (même si A, B et C sont impacté binairement dans le tableau)


    j'ose espérer que c'est mieux... :s

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    Ca parrait plus clair

    je n'ai pas pu tester mais ça devrait ressembler à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    For K = 5 To DerniereCol - 1
        cpt = 0
        For I = Debutextract To Finextract
            If wsh.Cells(I, 2) = "A" Then
              cpt = cpt + cpttemp
              cpttemp = wsh.Cells(I, K)
              wsh.Cells(I, "C").Value = wsh.Cells(I, "A").Value
            Else
              If cpttemp = 0 Then cpttemp = wsh.Cells(I, K)
              wsh.Cells(I, "C").Value = wsh.Cells(I - 1, "C").Value
        Next I
        wsh.Cells(Finextract + 1, K) = cpt
    Next K
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Ca semble pas mal oui : )

    donc merci bien.

    Il y a cependant 1 colonne pour laquelle il affiche 1 en bas, alors qu'il n'y a vraiment aucun 1 dans mon tableau!!!
    Au moins 1 disons, mais celle ci est facilement repérable
    (j'ai une ligne supplémentaire qui affiche le résultat d'une somme complète par colonne, qui affiche 0 bien sur, et en plus j'ai vérifié 20 fois à la main?!?!)

    une idée d'explication?


    ps: je ne demandais pas d'action sur la colonne "C"

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    Effectivement il y avait un problème (car je n'avais pas pu tester le code)

    Ce coup ci j'ai crée sur une feuille un tableau par rapport à ton premier post et j'ai pu le tester

    j'ai remplacé le compte temporaire par un Boolean et ça marche

    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
    Dim Serie As Boolean 'variable ajouté
     
    For K = 5 To DerniereCol - 1
        cpt = 0
        For I = Debutextract To Finextract
            If wsh.Cells(I, 2) = "A" Then
              Serie = False
              If wsh.Cells(I, K) = 1 Then
                cpt = cpt + 1
                Serie = True
              End If
            ElseIf Serie = False And wsh.Cells(I, K) = 1 Then
                cpt = cpt + 1
                Serie = True
            End If
        Next I
        wsh.Cells(Finextract + 1, K) = cpt
    Next K
     
    'j'ai ajouté ça aussi pour finir proprement
    Set wsh = Nothing
    ps: je ne demandais pas d'action sur la colonne "C"
    euh !! si, indirectement ici dans ton premier post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wsh.Cells(Ligne, "C").Value = Ref
    mais bon je l'ai supprimé !
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    ça fonctionne, je te remercie!

    par contre je viens de le lancer avec les données du boulot... c'est long! bien plus qu'avant il me semble. (mais des fois ça dépend du réseau)

    Tu penses normal que cela allonge assez significativement la maccro?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    je viens de refaire le code en passant par un tableau, ça accélèreras le traitement sinon ça viens du réseau.

    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
     
    Dim Serie As Boolean 'variable ajouté
    Dim TabTra()
     
    TabTra = wsh.Range(Cells(Debutextract, 1), Cells(Finextract, DerniereCol)).Value
     
    For K = 5 To DerniereCol
        cpt = 0
        For I = 1 To Finextract - Debutextract + 1
            If TabTra(I, 2) = "A" Then
              Serie = False
              If TabTra(I, K) = 1 Then
                cpt = cpt + 1
                Serie = True
              End If
            ElseIf Serie = False And TabTra(I, K) = 1 Then
                cpt = cpt + 1
                Serie = True
            End If
        Next I
        wsh.Cells(Finextract + 1, K) = cpt
    Next K
     
    'j'ai ajouté ça aussi pour finir proprement
    Set wsh = Nothing
    tiens moi au courant
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

Discussions similaires

  1. [MySQL] Classer par ordre mais avec des séparations
    Par Vinuto dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/02/2010, 11h13
  2. valeur MIN mais avec condition "pair" ou "impaire"
    Par litacan dans le forum Excel
    Réponses: 2
    Dernier message: 31/10/2009, 11h09
  3. éliminer doublons mais avec condition
    Par _debutant dans le forum VBA Access
    Réponses: 5
    Dernier message: 03/10/2008, 13h52
  4. Réponses: 2
    Dernier message: 08/05/2008, 12h36
  5. envoi d'un etat par mail mais avec une variable
    Par franckserpico dans le forum Access
    Réponses: 4
    Dernier message: 28/02/2007, 14h03

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