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.SI en Macro sans répétition de calcul (Fichier exemple joint)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 1
    Par défaut SOMME.SI en Macro sans répétition de calcul (Fichier exemple joint)
    Bonjour,

    Je suis assistant comptable et j'aimerais apporter quelques améliorations sur des tableaux de répartition de frais utilisés par mon entreprise.
    Voilà le topo :

    Il y a une bonne centaines de lignes téléphoniques auxquelles je dois rattacher la somme dûe pour le mois.
    Par la suite les responsables d'affaires me donnent par mail des numéros ,selon l'employé concerné, sur lesquels je dois imputer des frais.

    J'aimerais utiliser une macro qui me calculerais automatiquement les sous-totaux par numéro d'affaires
    Mais le problème est qu'avec une fonction somme.si basique le sous total est calculé plusieurs fois par nombre d'affaires, et puis j'apprécie travailler avec des macros même si mon niveau est encore assez basique en VBA

    Je joint un fichier exemple où j'ai masqué les noms, le calcul que j'aimerais effectuer par Macro se trouve dans la colonne G.

    Merci d'avance pour toute aide apporté !
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Bonjour,

    Je te propose de faire cela:
    1°) Tu fais une copie de ta feuille, car on est jamais trop prudent
    2°) On fait un tri sur le numéro de numéro d'affaire
    3°) Tu fais un IF. Tu dis que si le numéro de série est est identique au numéro de série du dessus alors tu fais la somme en G
    4°) Tu supprimes les doublons

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Salut Tykkle,

    Alors je ne sais pas si je vais accéder à ta requête exacte, mais moi j'aurais fait un truc du type :
    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
    Option Explicit
     
    Sub tykkle()
    Dim i, j As Integer
    Dim rng_ori As Range
    Dim table()
    Dim rd As Integer
    Dim bool As Boolean
     
    With Worksheets("Feuil1")
        Set rng_ori = .Range("F2")
        rd = 1
        ReDim table(1 To 2, 1 To rd)
        table(1, rd) = rng_ori
        table(2, rd) = rng_ori.Offset(0, -1)
        For i = 1 To .Columns(6).Find("*", , , , , xlPrevious).Row
            If rng_ori.Offset(i, 0) <> "" Then
                bool = True
                For j = LBound(table, 2) To UBound(table, 2)
                    If rng_ori.Offset(i, 0) = table(1, j) Then
                        table(2, j) = table(2, j) + rng_ori.Offset(i, -1)
                        bool = False
                    End If
                Next j
     
                If bool Then
                    rd = rd + 1
                    ReDim Preserve table(1 To 2, 1 To rd)
                    table(1, rd) = rng_ori.Offset(i, 0)
                    table(2, rd) = rng_ori.Offset(i, -1)
                End If
            End If
        Next i
    End With
     
    With Worksheets("Feuil2")
        .UsedRange.ClearContents
        .Range("A1") = "N° AFFAIRE"
        .Range("B1") = "Total par AFF"
     
        Set rng_ori = .Range("A1")
     
        For i = LBound(table, 2) To UBound(table, 2)
            rng_ori.Offset(i, 0) = table(1, i)
            rng_ori.Offset(i, 1) = table(2, i)
        Next i
    End With
     
    End Sub
    Je te fais un résumé en "Feuil2" de tes numéros d'affaire et de leur totaux.
    A savoir, peut-être qu'en passant par les filtres c'est plus pratique.

    N'hésite pas revenir vers moi.

    Cordialement,
    Kimy

  4. #4
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Bonjour,

    Tykkle tu veux créer un programme pour la NASA???

    Je pense que le code ci-dessous suffit largement

    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
    Sub t()
     
    Dim i As Integer
    'Tu fais une copie de la feuille 1 à la feuille 2
    Sheets("Feuil1").Range("A1:S1").Copy Destination:=Sheets("Feuil2").Range("A1:S1")
     
     
     
    Sheets("Feuil2").Select
     
                  Range("A2:R3000").Sort key1:=Range("F2"), order1:=xlAscending
     
    With ThisWorkbook.Sheets("Feuil1")
    'Précisez le nom de votre feuille
                For i = .Range("F" & .Rows.count).End(xlUp).Row To 2 Step -1
    'je travaille sur la colonne F
    'Rows.count permet de retourner le nombre de ligne de la plage range
                            If .Range("F" & i).Value = .Range("F" & i - 1).Value Then
                            'Je dis que si la valeur de la cellule F et égale à la valeur de la celule précédente alors
     
                                        .Range("G" & i).Value = .Range("G" & i - 1).Value + .Range("E" & i).Value
                                   'La valeur de la case G vaut la valeur de la cellule au dessous plus la valeur correspondant dans la colonne F
                                   Else
     
                                     .Range("G" & i).Value = .Range("E" & i).Value
                                     'Si les valeurs sont différentes alros je revoins simplement la valeur de la colonne E
                            End If
                Next i
    End With
     
    End Sub

  5. #5
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 572
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 572
    Par défaut
    Bonjour

    On peut simplement modifier la formule ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.SI($F$2:$F2;F2)=1;SOMME.SI($F$2:$F$21;F2;$E$2:$E$21);"")
    Mais on est en 2014, tu as Excel 2010, les tableaux (au sens 2007-2013) et tableaux croisés dynamiques sont 1000 fois plus pratiques pour faire cela sans avoir besoin de tri, saut de lignes... avec en prime des segments pour focaliser, si besoin, sur un responsable ou une affaire...
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Citation Envoyé par 78chris Voir le message
    Mais on est en 2014, tu as Excel 2010, les tableaux (au sens 2007-2013) et tableaux croisés dynamiques sont 1000 fois plus pratiques pour faire cela sans avoir besoin de tri, saut de lignes... avec en prime des segments pour focaliser, si besoin, sur un responsable ou une affaire...
    Héhé !

    J'suis un peu bête de pas y avoir pensé !

    C'est ça la solution ! ^^

    Kimy

Discussions similaires

  1. somme colonne avec exception sans macro est ce possible?
    Par dkmix dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/12/2007, 12h01
  2. [Excel]Faire une somme avec une macro
    Par Chlo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/01/2006, 19h53
  3. [vbexcel]Comment stopper une macro sans la planter.
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/11/2005, 14h45
  4. affichage sans répétitions
    Par devdébuto dans le forum C
    Réponses: 24
    Dernier message: 19/11/2005, 15h28
  5. affichage sans répétitions
    Par devdébuto dans le forum C
    Réponses: 10
    Dernier message: 16/11/2005, 22h10

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