Sumproduct

cibleo

XLDnaute Impliqué
Bonsoir le forum,

La formule ci-dessous me fait la somme des montants de février situées en colonne E, les dates se trouvant en colonne A.
=SOMMEPROD((MOIS($A$2:$A$500)=2)*$E$2:$E$500)

En faisant un essai avec l'enregistreur de macro, j'obtiens ceci :
ActiveCell.FormulaR1C1 = "=SUMPRODUCT((MONTH(R2C1:R500C1)=2)*R2C5:R500C5)"
Dans le code ci-dessous, l'instruction en rouge me fait la somme de tous mes montants de l'année sans discerner les mois. Cela se fait de façon dynamique, ce code est une macro de Recherche. 2 totaux en colonne 4 et 5.

Comme vous le voyez, j'aimerais y rajouter 12 lignes d'instructions pour me faire un total pour chaque mois de l'année.
Code:
Private Sub CommandButton1_Click()
  Dim VSearch As String
  ShtR.[F4].Value = CmbChauffeurs.Value
  If CmbChauffeurs.Value = "" Then Exit Sub
  Application.ScreenUpdating = False
  x = 1
  VSearch = Me.CmbChauffeurs.Value
  For Each Ws In ThisWorkbook.Worksheets
    With Ws
      DerLiS = .Range("C65536").End(xlUp).Row
      If Left(.Name, 6) = "Caisse" Then
        i = Len(CmbChauffeurs.Value)
        For Each Cellule In .Range("C7:C" & DerLiS)
          If InStr(1, Cellule, VSearch, vbTextCompare) > 0 Then
              trouve = True
                DerLiR = ShtR.Range("A65536").End(xlUp).Row + 1
                For col = 1 To 5
                  ShtR.Cells(DerLiR, col).Value = Ws.Cells(Cellule.Row, col).Value
                Next
                [COLOR=blue]Total(1) = Total(1) + ShtR.Cells(DerLiR, [B]4[/B]).Value[/COLOR]
[COLOR=blue]Total(2) = Total(2) + ShtR.Cells(DerLiR, [B]5[/B]).Value[/COLOR]
                x = x + 1
            End If
        Next Cellule
      End If
     End With
  Next Ws
  For col = 4 To 5
    [COLOR=red]ShtR.Cells(DerLiR + 2, col).FormulaLocal = "=SOMME(" & ShtR.Cells(7, col).Address & ":" & ShtR.Cells(DerLiR, col).Address & ")"[/COLOR]
  Next
  [COLOR=blue]With ShtR.Cells(DerLiR + 2, 2)[/COLOR]
    [COLOR=blue].Value = "Total "[/COLOR]
    .HorizontalAlignment = xlRight
    .VerticalAlignment = xlCenter
  End With
  If trouve = False Then MsgBox "Pas de trace !"
  Unload Me
  Application.ScreenUpdating = True
End Sub

J'aimerais donc trouver la bonne formule pour ce calcul en me basant sur celle surlignée en rouge et d'autre part restructurer mon code en modifiant les parties en bleu si j'ai bien compris.

Si quelqu'un pouvait me trouver la solution pour 1 mois donné dans la formule et dans la structure de mon code, cela m'arrangerait, après je pense pouvoir me débrouiller pour le reste.:rolleyes:

Le code initial est dans le fichier joint dans le formulaire "Rechercher".
Celui présenté ci-dessus est une version légèrement modifié mais la structure est identique.

Merci de votre aide Cibleo
 

Pièces jointes

  • 2009V10.zip
    36.2 KB · Affichages: 84
  • 2009V10.zip
    36.2 KB · Affichages: 85
  • 2009V10.zip
    36.2 KB · Affichages: 86

Excel-lent

XLDnaute Barbatruc
Re : Sumproduct

Bonjour Cibleo,

Voici ci-dessous un code faisant la MEME chose que la formule
=SOMMEPROD((MOIS($A$2:$A$500)=2)*$E$2:$E$500)

La variable "MontantMoisFévrier" contient ton résultat

Code:
Sub MontantPourFévrier()
' Macro enregistrée par Excel-lent

Dim cel As Range
Dim MontantMoisFévrier As Long
Dim Ligne As Integer

MontantMoisFévrier = 0
Ligne = 2

   For Each cel In Range(Cells(2, 1), Cells([COLOR="Blue"]500[/COLOR], 1))
     If Month(cel) = 2 Then MontantMoisFévrier = MontantMoisFévrier + Cells(Ligne, 5)
     Ligne = Ligne + 1
   Next cel

End Sub

Personnellement j'écrirais plutôt :

Code:
Sub MontantPourFévrier()
' Macro enregistrée par Excel-lent

Dim cel As Range
Dim MontantMoisFévrier As Long
Dim Ligne[COLOR="Blue"], DernièreLigne[/COLOR] As Integer

MontantMoisFévrier = 0
Ligne = 2
[COLOR="Blue"]DernièreLigne = Sheets("recherche").Range("A65536").End(xlUp).Row[/COLOR]


   For Each cel In Range(Cells(2, 1), Cells([COLOR="Blue"]DernièreLigne[/COLOR], 1))
     If Month(cel) = 2 Then MontantMoisFévrier = MontantMoisFévrier + Cells(Ligne, 5)
     Ligne = Ligne + 1
   Next cel

End Sub

-> en bleu les différences

Avantage, si ton tableau ne fait que 200 lignes, la macro n'ira QUE jusqu'à la 200ème ligne. (elle s'adapte automatiquement à la hauteur de ton tableau, macro plus rapide, ...)

Si tu as le temps, attends les vrai spécialiste du VBA, ils trouveront surement un code plus court et plus simple que moi.

Sinon, tu peux utiliser celle ci les yeux fermé, je l'ai testé sur ton fichier, elle fonctionne nickel.

Bon Dimanche à tous
 
Dernière édition:

cibleo

XLDnaute Impliqué
Re : Sumproduct

Bonsoir le forum,
Bonsoir Excel-lent,

Comme je le disais plus haut, la formule en rouge me fait la somme de tous les montants situés en colonnes 4 et 5 quel que soit leur nombre et place leurs totaux en bout de ces colonnes automatiquement 2 lignes en dessous le dernier montant inscrit.

Or je reviens sur cette formule pour l'adapter en Sommeprod. (Calcul des montants de Février par exemple)

En faisant des recherches, je l'ai remplacée par la formule ci-dessous, mais celle-ci ne prend en compte que les montants situés de la ligne 2 à 5, elle ne s'adapte pas dynamiquement mais place bien le total 2 lignes en dessous.

Ce que je n'arrive pas à réaliser c'est d'ajuster ma plage afin de prendre en compte tous mes montants inscrits quels que soit leurs nombres.
J'aimerais donc l'adapter en reprenant la syntaxe de ma formule initiale (en rouge dans mon code plus haut) en quelque sorte.

Si quelqu'un pouvait m'aider :(

De plus, je découvre qu'il existe Formula, FormulaLocal, FormulaR1C1 et FormulaR1C1Local, lequel est le + pratique à utiliser selon vous ?

ShtR.Cells(DerLiR + 2, col).FormulaR1C1 ="=SUMPRODUCT((MONTH(R2C1:R5C1)=2)*R2C5:R5C5)"

=SOMMEPROD((MOIS($A$2:$A$5)=2)*$E$2:$E$5)

Sinon Excellent, je n'ai pas réussi à faire fonctionner ton code (le 2ème), je l'ai pourtant placé dans un module standard et placé l'instruction "Call MontantPourFévrier" juste avant l'instruction "Application.ScreenUpdating = True" dans le code de mon premier post.

J'ai encore dû oublier quelque chose :rolleyes:

Merci de votre aide Cibleo
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : Sumproduct

J'ai essayé d'insérer mon code dans le tiens, en le faisant ...

Dans ta macro
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim Ligne As Integer
  Dim LigVide As Long, VMois As String
  ' Vérifier si la feuille est une feuille : Encais xxx
  If Left(Sh.Name, 6) = "Encais" Then
    ' Tester si saisie dans la bonne colonne
    If Not Intersect(Target, Range("E2:E200")) Is Nothing Then
      If Target.Value <> "" Then
        ' Récupérer la valeur du mois
        VMois = Mid(Sh.Name, InStr(1, Sh.Name, " ") + 1, 255)
        With Sheets("[COLOR="Red"][B]Caisse [/B][/COLOR]" & VMois)


Tu ne voulais pas écrire
Code:
With Sheets("[COLOR="Red"][B]Encais "[/B][/COLOR] & VMois)
?
 
Dernière édition:

cibleo

XLDnaute Impliqué
Re : Sumproduct

Bonsoir à tous,
Bonsoir Excel-lent,

Déjà, je te remercie de consacrer beaucoup de temps à mon problème.

Sinon sur ton avant dernier post, tu faisais fausse route, cette macro événementielle placée dans Thisworkbook marche à merveille, elle copie des données présentes en feuille 'Encais" vers mes feuilles "Caisse" selon 1 critère donné.
Mais comme mon fichier est allégé, toutes les feuilles ne sont pas présentes, tu ne peux donc pas en apprécier le résultat.

J'en reviens au problème initial.
Je joins à nouveau mon fichier dans lequel j'ai placé ta macro dans le Module1 et copié l'instruction suivante "Call MontantPourFévrier" dans le code du module du formulaire "Rechercher".

Maintenant dans la feuille de calcul "Recherche" cliques sur le bouton "Rechercher un mot" puis saisis le mot "Cpam" par exemple et valide.

Apparaissent alors toutes mes lignes de la feuille "Encais" où figurent le mot "Cpam" accompagnées de leurs dates en colonne A.
En ligne 26 s'affichent automatiquement les totaux des colonnes E, F et G.

J'aimerais maintenant afficher les totaux de février en ligne 27, puis mars en ligne 28 etc....

En fait je veux décomposer mon total mois par mois : voilà la problèmatique, c'est pourquoi je m'orientais vers un sommeprod décliné en VBA d'où le titre de mon post.:rolleyes:

Après cette explication fastidueuse, je continue mes recherches sur le forum avec les mots-clés suivants "somme +VBA" ou "worksheetfunction" en espérant trouver une solution.

Sinon Excel-lent, n'hésites pas à rectifier le tir dans mon fichier joint si j'ai commis un oubli ou des erreurs.

Encore merci pour votre aide Cibleo

Ps : Dans le lien ci-dessous, j'ai trouvé un fichier de cbea qui se rapproche de mon problème.
https://www.excel-downloads.com/threads/code-vba-pour-sommation-par-mois.95993/
 

Pièces jointes

  • 2009V10.zip
    37.4 KB · Affichages: 58
  • 2009V10.zip
    37.4 KB · Affichages: 66
  • 2009V10.zip
    37.4 KB · Affichages: 56
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : Sumproduct

Bonsoir Cibleo,


cibleo à dit:
J'aimerais maintenant afficher les totaux de février en ligne 27, puis mars en ligne 28 etc....

En fait je veux décomposer mon total mois par mois : voilà la problèmatique, c'est pourquoi je m'orientais vers un sommeprod décliné en VBA d'où le titre de mon post.

En effet, la formule SOMMEPROD serait l'idéal, mais j'ai encore qq lacune en VBA. D'où mon astuce.

Je pensais que tu sauras l'adapter d'où mon code incomplet.

A partir de ton dernier fichier, j'ai terminé mon code (dans "module 1"). Il fait maintenant exactement ce que tu veux (cliquer sur le bouton "sous totaux par mois" et la macro se lance).

Ton code faisant allusion à une feuille inexistante m'a perturbé, j'ai pensé, à tort, à une erreur! dsl

Bonne fin de soirée
 

Pièces jointes

  • SousTotauxParMois.zip
    37.4 KB · Affichages: 53

Gael

XLDnaute Barbatruc
Re : Sumproduct

Bonjour à tous,

Une autre solution avec les formules crées en macro:

Code:
...
For col = 5 To 7
    ShtR.Cells(DerLiR + 2, col).FormulaLocal = "=SOMME(" & ShtR.Cells(2, col).Address & ":" & ShtR.Cells(DerLiR + 1, col).Address & ")"
    For i = 1 To 12
    ShtR.Cells(DerLiR + 2 + i, col).FormulaR1C1 = "=SUMPRODUCT((MONTH(R2C1:R" & DerLiR & "C1)=" & i & ")*R2C" & col & ":R" & DerLiR & "C" & col & ")"
        With ShtR.Cells(DerLiR + 2 + i, 3)
            .Value = Format("01/" & i & "/2008", "mmmm")
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlCenter
        End With
    Next i
  Next col
...

Par ailleurs, j'aurais directement intégré les macros traitement et modif dans la macro de recherche pour améliorer les temps de réponse:

Code:
  For Each Ws In ThisWorkbook.Worksheets
    With Ws
      DerLiS = .Range("C65536").End(xlUp).Row
      DerLiR = 1
      If Left(.Name, 6) = "Encais" Then
    Set plage = .Range("C2:C" & DerLiS)
    With plage
      Set Cel = .Find(VSearch, LookAt:=xlPart)
      If Not Cel Is Nothing Then
      trouve = True
          Adrdeb = Cel.Address
          Do
            DerLiR = DerLiR + 1
            Range(Ws.Cells(Cel.Row, 1), Ws.Cells(Cel.Row, 7)).Copy
            ShtR.Cells(DerLiR, 1).Select
            ActiveSheet.Paste
        
        Pos = InStr(1, ShtR.Cells(DerLiR, 3).Text, VSearch, vbTextCompare)
        
        With ShtR.Cells(DerLiR, 3).Characters(Start:=Pos, Length:=Len(VSearch)).Font
        .FontStyle = "normal"
        .ColorIndex = 3     'rouge
        End With
              Set Cel = .FindNext(Cel)
          Loop While Not Cel Is Nothing And Adrdeb <> Cel.Address
      End If
     End With
     End If
     End With
  Next Ws

@+

Gael
 

cibleo

XLDnaute Impliqué
Re : Sumproduct

Bonjour à tous,
Bonjour Gael, Excel-lent,

Excel-lent, tu disais plus haut ceci :

Si tu as le temps, attends les vrai spécialiste du VBA, ils trouveront surement un code plus court et plus simple que moi.

Et bien le travail de Gael est vraiment Génial, cela marche du premier coup.

Excel-lent, tu as été le fil conducteur de mon post ce qui m'a permis d'avancer et de trouver la solution avec "Sumproduct" que je commençais à délaisser.
Mille mercis à toi.

Quant à toi Gael, comment te remercier : :):):):):):)

Sinon, j'analyse la deuxième partie de ta réponse et donne des nouvelles un peu plus tard.

Un grand Merci à vous deux.

Cibleo
 

Gael

XLDnaute Barbatruc
Re : Sumproduct

Bonsoir à tous,

Ci-joint une version un peu modifiée pour améliorer le temps de réponse lors de la recherche car je le trouvais vraiment lent surtout pour un utilisateur amené à faire plusieurs recherches à la suite.

En fait la lenteur de traitement est essentiellement due aux changements effectués dans la mise en page. J'ai donc supprimé ces changements qui sont intégrés dans la macro évènementielle "...before_print" avec la définition de la zone d'impression pour la feuille "Recherche"

Pour le reste, les évènements sont désactivés en début de procédure et réactivés en fin pour éviter de lancer l'évènement "...Worksheetchange" à chaque modif.

Enfin la création du nom des mois a été déplacée pour ne s'exécuter qu'une fois en même temps que "Total" et non pas à chaque changement de colonne.

Dis-moi si cela te convient.

@+

Gael
 

Pièces jointes

  • 2009V10_V1.zip
    39.8 KB · Affichages: 64

cibleo

XLDnaute Impliqué
Re : Sumproduct

Bonsoir le forum,
Bonsoir Gael,

Toutes les modifications pour optimiser le code initial seront les bienvenues.

Mais je t'avouerai que je n'ai pas eu le temps de tester tout cela sur mon fichier original.

A première vue, cela fonctionne du tonnerre, j'ai vu que tu utilises la structure Select Case dans le BeforePrint pour remplacer les structures If-Then.

Le reste je vais l'analyser plus en profondeur d'ici la fin de la semaine et te donner des nouvelles au plus tôt.
Tu sais, il me faut beaucoup de temps pour comprendre, je suis profane en la matière.

Sinon pour compléter ce code, serait-il possible de rajouter une autre formule déclinée en VBA qui me permettrait de calculer le nombre de valeurs dans mes colonnes.
Celles-ci venant s'intercaler sous chacun de mes sous-totaux mensuels.

Par exemple dans ton fichier joint, il y a 3 valeurs pour janvier en colonne E et F, et 0 en colonnne G.

La formule serait =NB(E2:E7)

Merci de ton aide Cibleo
 

cibleo

XLDnaute Impliqué
Re : Sumproduct

Bonjour le forum,
Bonjour Gael,

Pour mémoire, à partir d'un mot-clé saisi dans la feuille "Recherche", la macro élaborée par Gael effectue une recherche dans la colonne C de toutes les feuilles nommées "Encais...09" (soit 12) puis affiche les lignes concernées par ce mot-clé en y effectuant les sous totaux par mois.

Gael, dans le fichier joint ci-dessous, j'ai recopié ton travail et effectué des tests.

Dans le feuille "Recherche", j'ai fait un essai avec le mot "Gare" et ceci avec mon fichier initial qui comporte 12 feuilles de calcul (1 par mois) nommées ainsi "Encais Janv09" ; "Encais Fev09" etc... jusqu'à Dec09.

Comme tu peux le remarquer, la recherche s'est faite en ordre décroissant, elle commence au 02 juillet et finit au 30 avril. (Les feuilles d'Août à Décembre sont vierges) et le résultat escompté n'est pas formidable :eek: (Voir les valeurs d'erreur)

Par contre, si je lance une nouvelle fois la recherche avec le mot "Gare", ta macro fonctionne à merveille :) car j'ai allégé mon fichier qui ne comporte plus qu'une feuille de calcul : celle nommée "Encais Janv09".

Conclusion : la macro de "recherche" fonctionne bien lorsque je n'ai qu'une seule feuille de calcul, mais voilà mon fichier en contient 12 nommées "Encais Mois09".

Comment peut-on rectifier le tir.

Pour le forum, la macro est placée dans le module de code du formulaire "Rechercher".

Merci de votre aide Cibleo
 

Pièces jointes

  • 2009bis.zip
    48.5 KB · Affichages: 65

Lii

XLDnaute Impliqué
Re : Sumproduct

Bonsoir,

à première vue : avec son emplacement, DerliR = 1 à chaque tour donc tu ne vois que la dernière feuille. Essaie de déplacer cette ligne
Code:
...
[B]   DerLiR = 1[/B]
  For Each Ws In ThisWorkbook.Worksheets
...
De plus, pour ne pas avoir d'erreur, j'ai dû changer ces 3 lignes
Code:
With ShtR.Cells(DerLiR, 3).Characters(Start:=Pos, Length:=Len(VSearch))
          ShtR.Cells(DerLiR, 3).Font.FontStyle = "normal"
          ShtR.Cells(DerLiR, 3).Font.ColorIndex = 3
Des With imbriqués peuvent poser des problèmes.
 

cibleo

XLDnaute Impliqué
Re : Sumproduct

Bonsoir Lii,

J'ai effectué la première modification et apparemment cela fonctionne, j'emploie le mot "apparemment" parce que j'évite de m'emballer désormais :D

Concernant la 2 ème modification, cela me colore tous les mots en rouge dans la colonne C donc je laisse comme initialement où seul le mot saisi apparaissait en rouge.

Merci pour ta contribution Lii, je continue les tests, on ne sais jamais.

Bonne soirée à tous Cibleo
 

Discussions similaires

Statistiques des forums

Discussions
312 236
Messages
2 086 481
Membres
103 232
dernier inscrit
logan035