Structure Tableau Excel en VBA

Parce que j’ai mis des chiffres aléatoires pour tester les tableaux … :confused:

Pas fan des TDC mais je peux essayer avec ta formule .. (çà actualise automatiquement?)

Pour la récap CA par mois, est-ce que ce résultat est correct ?

J’avais le cout de production de la société pris dans le CA … donc il y aura des écart mais je ferais la manipulation.

Peut-on faire une macro qui récupère les données dans la listing OF directement ?
Client / Mois / CA / Marge

Récap CA par client ?

Récap CA par mois ?

Récap marge par client ?

Récap marge par mois ?

Voici la macro Récap CA par mois. Résultats sur la feuille CA, en S3. Sais-tu pourquoi le total sans mois indiqué est complètement différent de celui sur la feuille CA ?

Sub RecapCAParMois()
  Dim Dico As Object, C As Range, TblM(), TblCA(), Ctr As Long
  Ctr = -1
  Set Dico = CreateObject("scripting.Dictionary")
  With Sheets("Listing OF")
    For Each C In .Range("I3", .Cells(.Rows.Count, 9).End(xlUp))
      If Not Dico.exists(C.Value) Then
        Dico.Add C.Value, C.Value
        Ctr = Ctr + 1
        ReDim Preserve TblM(Ctr)
        TblM(Ctr) = C.Value
      End If
    Next C
    ReDim TblCA(Ctr)
    For I = 0 To UBound(TblM)
      TblCA(I) = Application.SumIf(.[I3:I1000], TblM(I), .[R3:R1000])
    Next I
  End With
  With Sheets("CA")
    .[S3].Resize(UBound(TblM) + 1) = Application.Transpose(TblM)
    .[T3].Resize(UBound(TblCA) + 1) = Application.Transpose(TblCA)
    .Range("S3:T3").Resize(UBound(TblM) + 1).Sort .[S3], xlAscending, Header:=xlNo
  End With
End Sub

Daniel

Oublie cette question puisque tu as fait autrement dans ta macro en allant chercher directement dans l’onglet listing les informations …

J’avais fait des modif hier et aujourd’hui en fonction de tes remarques ..
Il y avait un incohérence car meme quand le projet n’etait pas facturé çà indiquait un CA .. donc si y a un CA mais pas de date çà ne pouvait pas tenir les comptes correctement ..

J’ai donc fait un tableau de CA, un tableau de cout de prod et un tableau de marge ..

Voici le fichier à jour avec ta macro ..
Copie de PILOTAGE (TEST 2 François).xlsm (624,1 Ko)

Juste une question : comment je fais pour faire un TS (par exemple dans l’onglet CA) dans la macro (comme celle que tu as faite)?

Et si on ne veut pas du total ?

Pour le CA par mois, j’ai créé manuellement un TS appelé “CAparMOIS” :

J’ai modifié la macro comme suit :

Sub CA_MOIS()

Sheets("CA").Unprotect
onglets = "CA"
Sheets("CA").Select

  Dim Dico As Object, C As Range, TblM(), TblCA(), Ctr As Long
  Ctr = -1
  Set Dico = CreateObject("scripting.Dictionary")
  ActiveSheet.ListObjects("CAparMOIS").DataBodyRange.Delete
  With Sheets("Listing OF")
    For Each C In .Range("I3", .Cells(.Rows.Count, 9).End(xlUp))
      If C.Value <> "" Then
        If Not Dico.exists(C.Value) Then
          Dico.Add C.Value, C.Value
          Ctr = Ctr + 1
          ReDim Preserve TblM(Ctr)
          TblM(Ctr) = C.Value
        End If
      End If
    Next C
    ReDim TblCA(Ctr)
    For i = 0 To UBound(TblM)
      TblCA(i) = Application.SumIf(.[I3:I5000], TblM(i), .[R3:R5000])
    Next i
  End With
  With Sheets("CA")
    .[E3].Resize(UBound(TblM) + 1) = Application.Transpose(TblM)
    .[F3].Resize(UBound(TblCA) + 1) = Application.Transpose(TblCA)
    With .ListObjects("CAparMOIS")
      .Sort.SortFields.Clear
      .Sort.SortFields.Add2 _
        Key:=Range("CAparMOIS[[#All],[Mois]]"), SortOn:=xlSortOnValues, Order:= _
        xlAscending, DataOption:=xlSortNormal
      With .Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
      End With
    End With
  End With
  
  Sheets("CA").Protect

End Sub

Daniel

J’ai voulus transposer ton code pour faire le Recap CA par Clients ..
J’ai fais mon TS CAparCLIENT ..

Sub CA_CLIENTS()

Sheets("CA").Unprotect
onglets = "CA"
Sheets("CA").Select

  Dim Dico As Object, C As Range, TblM(), TblCA(), Ctr As Long
  Ctr = -1
  Set Dico = CreateObject("scripting.Dictionary")
  ActiveSheet.ListObjects("CAparCLIENT").DataBodyRange.Delete
  With Sheets("Listing OF")
    For Each C In .Range("B3", .Cells(.Rows.Count, 2).End(xlUp))
      If C.Value <> "" Then
        If Not Dico.exists(C.Value) Then
          Dico.Add C.Value, C.Value
          Ctr = Ctr + 1
          ReDim Preserve TblM(Ctr)
          TblM(Ctr) = C.Value
        End If
      End If
    Next C
    ReDim TblCA(Ctr)
    For i = 0 To UBound(TblM)
      TblCA(i) = Application.SumIf(.[B3:B5000], TblM(i), .[R3:R5000])
    Next i
  End With
  With Sheets("CA")
    .[B3].Resize(UBound(TblM) + 1) = Application.Transpose(TblM)
    .[C3].Resize(UBound(TblCA) + 1) = Application.Transpose(TblCA)
    With .ListObjects("CAparCLIENT")
      .Sort.SortFields.Clear
      .Sort.SortFields.Add2 _
        Key:=Range("CAparCLIENT[[#All],[CLIENTS]]"), SortOn:=xlSortOnValues, Order:= _
        xlAscending, DataOption:=xlSortNormal
      With .Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
      End With
    End With
  End With
  
  Sheets("CA").Protect

End Sub

J’ai une erreur et je n’arrive pas à la trouver … :confused:
Idem si je le transpose dans un TS PRODparMOIS en modifiant juste le nom du TS et les colonnes de destinations

Tu l’as créé où, le TS ?

Daniel

J’ai créé un TS CAparCLIENT En B2 et C2 mais j’ai du faire une erreur quelque part …
Copie de PILOTAGE (TEST 2 François).xlsm (597,9 Ko)

Bonjour,

Ca fonctionne sauf si le TS est vide. J’ai modifié :

Sub CA_CLIENTS()

Sheets("CA").Unprotect
onglets = "CA"
Sheets("CA").Select

  Dim Dico As Object, C As Range, TblM(), TblCA(), Ctr As Long
  Ctr = -1
  Set Dico = CreateObject("scripting.Dictionary")
  With Sheets("CA").ListObjects("CAparCLIENT")
    If .ListRows.Count > 0 Then
      .DataBodyRange.Delete
    End If
  End With
  With Sheets("Listing OF")
    For Each C In .Range("B3", .Cells(.Rows.Count, 2).End(xlUp))
      If C.Value <> "" Then
        If Not Dico.exists(C.Value) Then
          Dico.Add C.Value, C.Value
          Ctr = Ctr + 1
          ReDim Preserve TblM(Ctr)
          TblM(Ctr) = C.Value
        End If
      End If
    Next C
    ReDim TblCA(Ctr)
    For i = 0 To UBound(TblM)
      TblCA(i) = Application.SumIf(.[B3:B5000], TblM(i), .[R3:R5000])
    Next i
  End With
  With Sheets("CA")
    .[B3].Resize(UBound(TblM) + 1) = Application.Transpose(TblM)
    .[C3].Resize(UBound(TblCA) + 1) = Application.Transpose(TblCA)
    With .ListObjects("CAparCLIENT")
      .Sort.SortFields.Clear
      .Sort.SortFields.Add2 _
        Key:=Range("CAparCLIENT[[#All],[CLIENTS]]"), SortOn:=xlSortOnValues, Order:= _
        xlAscending, DataOption:=xlSortNormal
      With .Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
      End With
    End With
  End With
  
  Sheets("CA").Protect
  
End Sub

Important : Je reçois des messages d’insultes de la part du forum (pas des utilisateurs) parce que je suis seul à poster dans cette discussion. Ouvre une autre discussion.

Daniel

Ca fonctionne nickel merci

j’ouvre un nouveau sujet pour les indicateurs ..

bizarre, je n’ai jamais rencontré ce type de soucis…

Daniel,

j’ai, dans mes tableau des recap par mois au 01/01/2026 et un autre au 02/01/2026 …
je ne comprends pas trop sachant que dans la colonne I de l’onglet « Listing OF » c’est une formule qui transforme la date en mois sous la forme MM-AAAA …

Mets-tu ma parole en doute ? Ca doit se déclencher au 50e message s’il n’y a eu qu’un interlocuteur. Mais peut-être sais-tu mieux ?

Daniel

Non, je dis juste que je n’ai jamais eu le cas !

Alors pourquoi tu dis que c’est bizarre ?

parce que je trouve bizarre qu’un forum soit paramétré pour envoyer des messages d’insultes…

Bonjour,

Ce n’était pas à prendre au premier degré. Simplement pour dire que le message, même s’il était courtois était intempestif et me gênait pour répondre sur le fond. Tout comme le message qui indique que le sujet est résolu à chaque fois que je poste dans cette discussion.

Daniel

Ca doit etre de ma faute car j’ai coché « solution » sur un de tes messages où tu me donnais le code pour CAparMOIs … (entre autre).

pardon :confused: