XL 2013 VBA Grouper valeur

Kidcarotte

XLDnaute Junior
Bonjour a tous et a toutes

Je souhaiterai mentionne par avance que cela fait deux heures que je tourne en rond sur les forums et que je ne trouve rien de concluant, c'est donc pour cela que je m'adresse ici. J'ai vu le nombre de sujet ouvert, mais les codes proposes ne fonctionne pas et mes connaissances VBA sont tres limites.

J'ai une colonne B de plusieurs noms ( il y en a un peu pres une trentaine et le fichier fais 5000 lignes.)
CK Underwear
CK Underwear
CK Underwear
TH Accessories
CK Underwear
CK Underwear
CK Underwear
CK Underwear
CK Underwear
CK Underwear
CK Underwear
TH Accessories
TH Accessories
TH Accessories
TH Accessories
TH Accessories
TH Accessories
TH Accessories
CK Jeans

Je voudrais les regrouper par similirate
Donc CK Underwear, TH Accessories etc.
Je sais qu'il y a des formules pour cela, cependant je creer un tableau analytique a partir d une enorme base de donnees.
Donc l'idee est: Lorsque l'utilisateur appuie sur le bouton "Create report" au lieu d'avoir les 1500000 lignes, les 25 grands groupes sont regroupes

Des suggestions ?

Cordialement
 

danielco

XLDnaute Accro
Essaie comme ça. J'ai juste rectifié la position du total. Y a-t-il autre chose ?

VB:
Sub TCD()
  Dim C As Range, Plage As Range, Ligne As Long, Col As Long
  With Sheets("Database")
    Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
  End With
  With Sheets("Expected (2)")
    Set C = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1)
    If C.Column = 2 Then
      C.Value = Date
    Else
      C.Value = DateAdd("ww", 1, Date)
    End If
    C.NumberFormat = "d/mm/yy"
    Col = C.Column
    For Each C In Plage
      Ligne = Application.Match(C.Value, .[A:A], 0)
      .Cells(Ligne, Col) = Cells(Ligne, Col) + 1
    Next C
    Ligne = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(Ligne, Col) = Application.Sum(.Range(.Cells(2, Col), .Cells(Ligne - 1, Col)))
  End With
End Sub

Daniel
 

danielco

XLDnaute Accro
Ca signifie qu'il y a une division de la feuille Database qui n'existe pas sur la feuille Expected (2). Quand la ligne est surlignée en jaune, passe la souris au-dessus de "C.Value" pour connaître cette valeur. Je peux gérer ce cas de figure, soit en ignorant la valeur et en l'indiquant par un message, soit en ajoutant la valeur sur la feuille Expected (2).

Daniel
 

danielco

XLDnaute Accro
Je ne peux pas mettre 0 puisqu'elle ne figure pas sur la feuille Expected (2) ? Pour l'ignorer :

VB:
Sub TCD()
  Dim C As Range, Plage As Range, Ligne As Variant, Col As Long
  With Sheets("Database")
    Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
  End With
  With Sheets("Expected (2)")
    Set C = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1)
    If C.Column = 2 Then
      C.Value = Date
    Else
      C.Value = DateAdd("ww", 1, Date)
    End If
    C.NumberFormat = "d/mm/yy"
    Col = C.Column
    For Each C In Plage
      Ligne = Application.Match(C.Value, .[A:A], 0)
      If IsNumeric(Ligne) Then
        .Cells(Ligne, Col) = Cells(Ligne, Col) + 1
      End If
    Next C
    Ligne = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(Ligne, Col) = Application.Sum(.Range(.Cells(2, Col), .Cells(Ligne - 1, Col)))
  End With
End Sub

Daniel
 

danielco

XLDnaute Accro
Désolé :( il fallait pas l'appeler good macro...

VB:
Sub TCD_Good_Macro()

 Dim C As Range, Plage As Range, Ligne As Variant, Col As Long
 With Sheets("Database")
    Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
 End With
With Sheets("Expected (2)")
    Set C = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1)
    If C.Column = 2 Then
        C.Value = Date
    Else
        C.Value = DateAdd("ww", 1, Date)
    End If
    C.NumberFormat = "d/mm/yy"
    Col = C.Column
    For Each C In Plage
        Ligne = Application.Match(C.Value, .[A:A], 0)
        If IsNumeric(Ligne) Then
        .Cells(Ligne, Col) = .Cells(Ligne, Col) + 1
        End If
    Next C
    Ligne = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(Ligne, Col) = Application.Sum(.Range(.Cells(2, Col), .Cells(Ligne - 1, Col)))
 End With

End Sub

En plus, comme il n'y a plus de ligne total, celui-ci se met sur la ligne "CK Legwear". Je suppose qu'il faut le supprimer ?

Daniel
 

Kidcarotte

XLDnaute Junior
Je ne suis pas sur egalement de voir la difference entre cette Macro et la version precedente

Cordialement

Sub TCD_Good_Macro() Dim C As Range, Plage As Range, Ligne As Variant, Col As Long With Sheets("Database") Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) End With With Sheets("Expected (2)") Set C = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1) If C.Column = 2 Then C.Value = Date Else C.Value = DateAdd("ww", 1, Date) End If C.NumberFormat = "d/mm/yy" Col = C.Column For Each C In Plage Ligne = Application.Match(C.Value, .[A:A], 0) If IsNumeric(Ligne) Then .Cells(Ligne, Col) = .Cells(Ligne, Col) + 1 End If Next C Ligne = .Cells(.Rows.Count, 1).End(xlUp).Row .Cells(Ligne, Col) = Application.Sum(.Range(.Cells(2, Col), .Cells(Ligne - 1, Col))) End With End Sub
 

danielco

XLDnaute Accro
Si tu ajoutes un libellé sur la feuille Expected (2) pour le total, alors il n'y a rien à changer. Si la cellule A25 reste vide :

VB:
Sub TCD_Good_Macro()

 Dim C As Range, Plage As Range, Ligne As Variant, Col As Long
 With Sheets("Database")
    Set Plage = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
 End With
With Sheets("Expected (2)")
    Set C = .Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1)
    If C.Column = 2 Then
        C.Value = Date
    Else
        C.Value = DateAdd("ww", 1, Date)
    End If
    C.NumberFormat = "d/mm/yy"
    Col = C.Column
    For Each C In Plage
        Ligne = Application.Match(C.Value, .[A:A], 0)
        If IsNumeric(Ligne) Then
        .Cells(Ligne, Col) = .Cells(Ligne, Col) + 1
        End If
    Next C
    Ligne = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
    .Cells(Ligne, Col) = Application.Sum(.Range(.Cells(2, Col), .Cells(Ligne - 1, Col)))
 End With

End Sub

Daniel
 

danielco

XLDnaute Accro
Je ne suis pas sur egalement de voir la difference entre cette Macro et la version precedente

Cordialement

Il y a juste un point ajouté après "Cells" :
VB:
.Cells(Ligne, Col) = .Cells(Ligne, Col) + 1
au lieu de :
Code:
.Cells(Ligne, Col) = Cells(Ligne, Col) + 1

Petite cause, grands effets. Sans le point, "Cells" est la cellule de la feuille Database. Avec, elle appartient à la feuille Expected (2) puisque :
Code:
With Sheets("Expected (2)")
indique que tout ce qui commence par un point appartient à la feuille Expected (2)

Daniel
 

Discussions similaires

Réponses
6
Affichages
1 K

Statistiques des forums

Discussions
312 330
Messages
2 087 347
Membres
103 526
dernier inscrit
HEC