SOMME.SI (Macro ???)

  • Initiateur de la discussion Initiateur de la discussion LocSta
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

LocSta

XLDnaute Occasionnel
Salut à tous, j'ai un petit probleme.

Introduction au probléme:
J'ai une feuille de saisie qui me permet de généré une archive (création d'une nouvelle ligne) à chaque clique sur le bouton de la macro.

Probléme:
Je voudrais que lorsque que deux lignes de l'archive correspondent aux meme client, à la meme affaire et à la meme machine les valeurs des cases suivantes soient additionner dans une des deux lignes et que l'autre ligne se supprime.

Exemple:
Ligne1:ClientA/Affaire1999/Machine01 - ValeurA1 - ValeurA2 ...
Ligne2:ClientB/Affaire2000/Machine02 - ValeurB1 - ValeurB2...
Ligne3:ClientB/Affaire2000/Machine02 - ValeurC1 - ValeurC2 ...

Je souhaiterais que dans le cas présent: Les lignes 2 et 3 soit regroupées en une seule, comme ceci:
Ligne3:ClientB/Affaire2000/Machine02 - ValeurB1+ValeurC1 - ValeurB2+ValeurC2 etc...

Si ça ne vous parait pas tres clair regarder mon fichier joint ça sera sans doute beaucoup plus explicite.

Merci
 

Pièces jointes

Dernière édition:
Re : SOMME.SI (Macro ???)

Salut,

Si j'ai bien compris ce que tu veux faire :

Code:
Private Sub CommandButton2_Click()
Dim NumLigne As Long, I As Long
Dim Trouve As Boolean
NumLigne = Sheets("Archive").Range("D65536").End(xlUp).Row + 1
With Sheets("Archive")
  .Range("A" & NumLigne) = .Range("A" & NumLigne - 1) + 1
  .Range("B" & NumLigne) = CDate(Range("A3"))
  .Range("C" & NumLigne) = Range("B3")
  .Range("D" & NumLigne) = Range("C3")
  .Range("E" & NumLigne) = Range("D3")
  .Range("F" & NumLigne) = Range("E3")
  For I = 3 To NumLigne - 1
    If .Range("D" & I) = Range("C3") And .Range("E" & I) = Range("D3") And .Range("F" & I) = Range("E3") Then
      .Range("G" & NumLigne) = .Range("G" & I) + Range("F3")
      .Range("I" & NumLigne) = .Range("I" & I) + Range("G3")
      .Range("K" & NumLigne) = .Range("K" & I) + Range("H3")
      '...etc
      .Range("A" & I).EntireRow.Delete
      Trouve = True
      Exit For
    End If
  Next
  If Trouve = False Then
    .Range("G" & NumLigne) = Range("F3")
    .Range("I" & NumLigne) = Range("G3")
    .Range("K" & NumLigne) = Range("H3")
    '...etc
  End If
End With
End Sub

A+
Horatio
 

Pièces jointes

Re : SOMME.SI (Macro ???)

Salut Lord Nelson, j'ai essayer t'as macro, mais il doit y avoir une erreur de calcul quelque par, les sommes ne sont pas bonne. Sinon t'as bien compri le principe de ce que j'veux faire.
L'idéal serait que les lignes soit créees a chaque fois dans l'onglet Archive (une ligne à chaque archive y compris pour les doublons) et que dans la feuille Archive Finale il ne reste qu'une ligne pour chaque Client/Affaire/Machine avec la somme dans les différentes catégories, j'espére que jme suis exprimé de maniére compréhensible.

L'idéal seré simplement de créer une macro qui permette de passer de Archive à Archive Finale.


Voici le code que j'utilise pour l'archivage:
Option Explicit
Sub Archiver()
Dim lig As Long, Tablo As Variant, i As Byte, N As Byte
' Mise en tableau
Calculate
With Sheets("Saisie")
If .Range("C3") = "" Then MsgBox "Pas de données à archiver ?": Exit Sub
Tablo = .Range("A3:T3")
' Report des données
With Sheets("Archives")
lig = .Range("B65536").End(xlUp).Row + 1
' Première données
For i = 1 To 5
.Cells(lig, i + 1) = Tablo(1, i)
Next i
' Secondes données
For i = 6 To 20
.Cells(lig, i + 1 + N) = Tablo(1, i)
N = N + 1
Next i
End With
.Range("F3:T3").ClearContents
End With
End Sub
 
Re : SOMME.SI (Macro ???)

Bonjour,

Un essai par formules

Une formule renvoyant le n° de la dernière ligne où les critères sont respectés
Formule matricielle, à valider par ctrl, maj et entrée

Report des valeurs trouvées dans la dernière feuille
Formule matricielle aussi

Index Equiv pour récupérer les valeurs des 1ères colonnes

SommeProd pour les autres valeurs
(Somme.Si n’accepte pas plusieurs critères)
 

Pièces jointes

Re : SOMME.SI (Macro ???)

Merci PierreJean le tiens est tout simplement magique!! lol
Ca marche nikel aucun souci.
Il serait possible que la macro envoi les lignes dans la feuille archivage finale?

Merci en tous cas PierreJean, t'es un boss.
 
Re : SOMME.SI (Macro ???)

Re PierreJean
Est t'il possible d'adapter ton ancien code (voir ci-dessous) pour qu'il s'execute aprés ma macro (tout en bas) et donc qu'il remplace les lignes dans "Archive Finale" comme il le fesait trés bien dans ton 1er fichier, comme ça en saisissant une ligne à archiver elle sera copier dans "Archive" et dans "Archive Finale" puis les doublons seront modifier à l'aide de ton code dans la feuille "Archive Finale. Merci

Code pour le remplacement des lignes:
Dim lignes As Collection
Set lignes = New Collection
MsgBox (Range("A65536").End(xlUp).Row)
For n = 3 To Range("A65536").End(xlUp).Row
For m = n + 1 To Range("A65536").End(xlUp).Row
If Range("D" & n) & Range("E" & n) & Range("F" & n) = Range("D" & m) & Range("E" & m) & Range("F" & m) Then
Range("G" & n) = Range("G" & n) + Range("G" & m)
Range("I" & n) = Range("I" & n) + Range("I" & m)
Range("K" & n) = Range("K" & n) + Range("K" & m)
lignes.Add m
End If



Mon Code D'archivage:

Option Explicit
Sub Archiver()
Dim lig As Long, Tablo As Variant, i As Byte, N As Byte
' Mise en tableau
Calculate
With Sheets("Saisie")
If .Range("C3") = "" Then MsgBox "Pas de données à archiver ?": Exit Sub
Tablo = .Range("A3:T3")
' Report des données
With Sheets("Archives")
lig = .Range("B65536").End(xlUp).Row + 1
' Première données
For i = 1 To 5
.Cells(lig, i + 1) = Tablo(1, i)
Next i
' Secondes données
For i = 6 To 20
.Cells(lig, i + 1 + N) = Tablo(1, i)
N = N + 1
Next i
End With
With Sheets("Archives Finale")
lig = .Range("B65536").End(xlUp).Row + 1
' Première données
For i = 1 To 5
.Cells(lig, i + 1) = Tablo(1, i)
Next i
' Secondes données
For i = 6 To 20
.Cells(lig, i + 1 + N) = Tablo(1, i)
N = N + 1
Next i
End With
.Range("F3:T3").ClearContents
End With
End Sub
Next m
Next n
For n = lignes.Count To 1 Step -1
Rows(lignes(n)).Delete
Next n
 
Re : SOMME.SI (Macro ???)

J'ai simplement ouvert ton fichier joint auquel j'ai ajouter une macro et affecté ton code, j'ai eu le message que j'ai cité précédemment et le débogeur me surligne
Range("A3").select
La cellule A3 n'est pas fusionné
ça marche sur ton ordi?
 
Re : SOMME.SI (Macro ???)

re

a la lecture rapide de ton code je m'apercois que les archives y sont plurielles
dans le fichier sur lequel j'ais travaillé elles étaient au singulier !!
y-a-t-il lien de cause a effet ???
je n'ais plus le temps d'aller plus loin aujourd'hui, je continuerais demain
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour