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 :

Création d'une boucle VBA pour la fonction SOMME.SI


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Créer des boucles dans VBA
    Bonjour

    J'aimerais creer sous VBA , une macro qui respecte les conditions suivantes

    si colonne 1 = A et si colonne 2 = T alors somme dans la colonne 3
    dans ce cas pour A = 8 (voir piece jointe pour l'explication du "8" )

    si colonne 1 = B et si colonne 2 = T alors somme dans la colonne 3
    dans ce cas pour B = 10

    idem pour C,D,...

    J'ai mis en piece jointe une exemple de classeur pour visualiser les exemples ci dessus.

    Je sais qu'il faut faire des If... then... Else et des boucles de conditions mais je suis vraiment un petit débutant pour cela.


    J'ai simplifié le pb car dans mon fichier j'ai environ 40 000 lignes et 150 colonnes de données donc difficile de traiter cela cas par cas avec des filtres automatiques.


    Merci d'avance pour votre aide

    Cordialement
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut choudoudou15 et le forum
    Bienvenue
    Une image, on ne peut que voir ce qu'il y a dessus, pas regarder les formules, les autres onglets, etc..
    si colonne 1 = A et si colonne 2 = T alors somme dans la colonne 3
    dans ce cas pour A = 8 (voir piece jointe pour l'explication du "8" )
    Pas d'explication du 8...
    si colonne 1 = B et si colonne 2 = T alors somme dans la colonne 3
    dans ce cas pour B = 10
    Et la suite de la question ?
    Finit un cas, avec les données précises du départ, le travail que doit effectuer la macro, et ce que tu attends en final.
    Quel est le but de la macro, et la plage à traiter.
    N'oublie pas que si toi tu sais ce qu'est le problème, ici, il y a peu de télépathes ou de magiciens. Seulement des personnes qui ont une certaine connaissance sur excel, et qui ne peuvent travailler sur ce que tu as dans la tête.

    et on doit recommencer avec C ??? donc, on retraite la colonne où il n'y a que des chiffres ???

    A+
    PS Quelle est la différence entre un canard ?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Merci pour tes remarques Gorfeal

    je vais essayer d'être plus précis en mettant en piece jointe un fichier excel avec la formule que j'ai utilisé pour faire le calcul mais que je voudais passer sous forme de macro

    L'objectif de faire la somme des chiffres de la colonne C lorsque qu'ils ont la même lettre dans la colonne A et contient la lettre "T" dans la colonne B

    En espérant avoir été plus précis dans ma demande

    Merci d'avance
    Fichiers attachés Fichiers attachés

  4. #4
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour choudoudou Gorfael le forum comme j ai compris
    a chaque fois T dans la colonne b & caractere dans colonne a

    dans l evenement de ta feuille
    Option Explicit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Application.Intersect(Target, Range("b:b")) Is Nothing Then
    If Target = "T" Then CALC
    End If
    End Sub
    dans un module standard
    Option Explicit
    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 CALC()
    Dim nom, x, c, p, z, ch As Variant ' a adapter
    Application.ScreenUpdating = False
    nom = Selection.Offset(0, -1).Value
    If nom = "" Then Exit Sub
    x = ActiveCell.Row
    Set ch = [A:A]
    Set c = ch.Find(nom, LookIn:=xlValues, LookAt:=xlWhole)
    If Not c Is Nothing Then
    p = c.Address: Do: If c.Offset(0, 1).Value <> "" Then z = z + c.Offset(0, 2).Value
    Set c = ch.FindNext(c)
    Loop While Not c Is Nothing And c.Address <> p
     End If
    Cells(x, 3) = z: Cells(x, 3).Select
    End Sub
    SALUTATIONS

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut choudoudou15 et le forum
    Une tentative.
    J'ai ajouté une ligne de titre en Rows(1) et avec une macro de ce style, peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim Cel As Range
    ActiveSheet.AutoFilterMode = False
    For Each Cel In Range([E2], [E65536].End(xlUp))
        ActiveSheet.AutoFilterMode = False
        With [A1].CurrentRegion
            .AutoFilter Field:=2, Criteria1:="T"
            .AutoFilter Field:=1, Criteria1:=Cel
            Cel.Offset(0, 1) = WorksheetFunction.Sum(Range([C1], [C65536].End(xlUp)).SpecialCells(xlCellTypeVisible))
        End With
    Next Cel
    ActiveSheet.AutoFilterMode = False
    End Sub
    A+

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Création d'une boucle VBA pour la fonction SOMME.SI
    Bonjour,

    Dans le fichier ci joint , j'utilise une formule qui me permet de faire une décrémentation en fonction de plusieurs critere . J'aimerais passer cette formule sous la forme VBA avec des boucles si possible.

    "=SI(D19<>"";SI(D19-SOMME.SI($A9:$A18;$A19;E9:E18)>=C19;C19;D19-SOMME.SI($A9:$A18;$A19;E9:E18));0)"

    Je suis débutant dans ce domaine et en programmation.

    J'ai mis en piece jointe mon fichier de calcul qui sera plus parlant pour comprendre la formule à passer en VBA

    J'ai simplifié au maximum ce que je désirais car mon fichier d'origine fait environ 40 000 lignes et Excel a du mal à calculer avec une simple formule.

    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    Salut,

    Une solution qui necessite que le tableau soit trie sur la colonne A

    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
     
    Option Explicit
     
    Sub Calcul()
        Dim CptLig As Long
        Dim Somme As Double
     
        Somme = 0
        For CptLig = 2 To Feuil2.Range("A65536").End(xlUp).Row
     
            If Somme + Feuil2.Range("C" & CptLig).Value <= Feuil2.Range("D" & CptLig).Value Then
                Feuil2.Range("E" & CptLig).Value = Feuil2.Range("C" & CptLig).Value
            Else
                Feuil2.Range("E" & CptLig).Value = Feuil2.Range("D" & CptLig).Value - Somme
            End If
     
            Somme = Somme + Feuil2.Range("E" & CptLig).Value
            If Feuil2.Range("A" & CptLig).Value <> Feuil2.Range("A" & CptLig + 1).Value Then Somme = 0
        Next
    End Sub
    Dans ton tableau exemple tu as 2 valeurs (Col D) a atteindre pour le meme code (Col A), est-ce normal??

    ++
    Minick
    ++
    Minick

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup Minick, c'est génial.

    J'ai galéré deux jours pour créer ce code. Tu me sauves la vie :-)

    Pour répondre à ta question, c'est une erreur de ma part pour les 2 valeurs (Col D) a atteindre pour le meme code (Col A).

    Encore merci pour ton aide

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

Discussions similaires

  1. création d'un module vba pour une mise à jour access
    Par ponpon99 dans le forum VBA Access
    Réponses: 4
    Dernier message: 27/12/2013, 13h37
  2. [XL-2007] création d'une boucle pour une série
    Par amauri dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/07/2012, 16h41
  3. [XL-2010] boucle vba pour une formule
    Par pilounet54 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/01/2012, 21h00
  4. [Débutant] Création d'une boucle pour récupérer des informations
    Par youcef60 dans le forum MATLAB
    Réponses: 15
    Dernier message: 02/03/2010, 22h31
  5. création d'une boucle for pour interrogation requête sql
    Par philder62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/12/2007, 15h14

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