Creer des petits tableaux a partir d un grand

Squoltahthx94

XLDnaute Occasionnel
Bonjour,

J'ai le pb suivant : j’extraie un tableau Onglet "Jour" composé d'information quotidienne que que je souhaite différencier de la façon mis dans l'onglet régionalisation mais je n'ai pas la moindre idée de comment faire...
quelqu'un pourrait m'aider???

Merci
 

Pièces jointes

  • Classeur2.xlsm
    19.9 KB · Affichages: 47
  • Classeur2.xlsm
    19.9 KB · Affichages: 51
  • Classeur2.xlsm
    19.9 KB · Affichages: 50

david84

XLDnaute Barbatruc
Re : Creer des petits tableaux a partir d un grand

Bonjour,
le problème n'est pas tant d'obtenir ce résultat en lui-même que d'envisager le fait que tes données vont évoluer et devoir être actualisées.
Si tu veux le faire par formules ou utiliser le filtre avancé, il est préférable de créer un onglet par code.
Si tu veux le tout sur une même feuille, il est alors préférable de passer par du VBA ou utiliser des TCD.
Tu peux également placer différents tableaux (au sens Excel 2007 ou 2010) les uns en dessous des autres et appliquer un filtre sur chaque code.
Enfin bref, tu as plein de pistes différentes à exploiter.
A+
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Creer des petits tableaux a partir d un grand

Re
merci de ta réponse mais je sais qu'il faut utiliser le VBA puisque je veux que les résultats soit tous sur la même page, je demande au forums comment faire....
Tu m'as mal lu ou je me suis mal exprimé : tu peux utiliser le VBA mais si tu ne sais pas comment faire, il serait plus simple pour toi d'utiliser des tableaux croisés dynamiques ou des tables Excels avec un filtre sur chaque code.
A+
 

Squoltahthx94

XLDnaute Occasionnel
Re : Creer des petits tableaux a partir d un grand

re

J'ai bien repris un code déjà utilisé :
Code:
Private Sub CommandButton4_Click()
Dim derlig&, plage As Range, i&, t, d As Object
derlig = [B1].End(xlDown).Row
If derlig = Rows.Count Then Exit Sub
Application.ScreenUpdating = False
Set plage = Range("A1:m" & derlig)
'---tableau préparatoire trié---
Range("A" & derlig + 1 & ":I" & Rows.Count).Delete xlUp 'RAZ
plage.Copy Cells(derlig + 1, 1)
Set plage = plage.Offset(plage.Rows.Count)
For i = 2 To plage.Rows.Count 'pour la 2ème clé de tri
  t = Trim(plage.Cells(i, 13))
  If t = "rouge" Then plage.Cells(i, 13) = 1
  If t = "orange" Then plage.Cells(i, 13) = 2
  If t = "jaune" Then plage.Cells(i, 13) = 3
  If t = "" Then plage.Cells(i, 13) = 4
Next
plage.Sort [B1], xlAscending, [m1], , xlAscending, [h1], xlAscending, xlYes
'---liste des titres des tableaux---
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To plage.Rows.Count
  d(plage.Cells(i, 2).Value) = plage.Cells(i, 2).Value
Next
'---création des tableaux---
ActiveSheet.AutoFilterMode = False
For Each t In d.keys
  derlig = Cells(Rows.Count, 2).End(xlUp).Row
  Cells(derlig + 3, 2) = t
  Cells(derlig + 3, 2).Borders.LineStyle = 1 'bordures
  plage.AutoFilter 2, t 'filtre automatique
  plage.SpecialCells(xlCellTypeVisible).Copy Cells(derlig + 5, 1)
  plage.AutoFilter
Next
ActiveSheet.AutoFilterMode = False
plage.Delete xlUp
End Sub

Donc je connais le VB mais là je n'ai pas besoin d'onglet ni de filtre avec jaune, orange et rouge. (comme le montre le code ci-dessus) Je cherchais du code VBA pour cette procedure automatisée mais je n'ai pas envoyé le classeur qui est un peu gros.

Merci de tes retour en tout cas:cool::cool::cool:
 

david84

XLDnaute Barbatruc
Re : Creer des petits tableaux a partir d un grand

Re
Ci-joint code à tester :
Code:
Sub Tableaux()
Dim Plage, Entetes As Range, dico As Object, code, c, temp, T()
Dim i&, j&, k&, l&, m As Byte, n&, DerLig&

With Sheets("jour")
    Set Plage = .Range("A2").CurrentRegion.Offset(1).Resize(.Range("A2").CurrentRegion.Rows.Count - 1, _
    .Range("A2").CurrentRegion.Columns.Count - 1)
    Set Entetes = .Range(.Cells(1, 1), .Cells(1, Plage.Columns.Count))
    code = .Range("G2:G" & Plage.Rows.Count + 1)
    Set dico = CreateObject("scripting.dictionary")
    For Each c In code
        dico(c) = dico(c)
    Next c
    temp = dico.keys
    Call tri(temp, LBound(temp), UBound(temp))
End With

With Sheets("Regionalisation")
    .Range(.Cells(1, 1), .Cells(10000, Plage.Columns.Count)).Clear
    For i = 1 To dico.Count
        For j = LBound(code) To UBound(code)
            If code(j, 1) = temp(i - 1) Then n = n + 1
        Next j
        
        For j = 1 To UBound(code)
            If code(j, 1) = temp(i - 1) Then
                ReDim T(1 To n, 1 To Plage.Columns.Count)
                m = 1
                For k = 1 To Plage.Rows.Count
                    If code(k, 1) = temp(i - 1) Then
                        For l = LBound(T, 2) To UBound(T, 2)
                            T(m, l) = Plage(k, l)
                        Next l
                        m = m + 1
                    End If
                Next k
            End If
        Next j
        
        DerLig = .Range("A" & .Rows.Count).End(xlUp).Row
        .Range("A" & DerLig + 1) = temp(i - 1)
        .Range("A" & DerLig + 2).Resize(, Plage.Columns.Count) = Entetes.Value
        .Range("A" & DerLig + 3).Resize(UBound(T), UBound(T, 2)) = T
        n = 0
    Next i
End With
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub
A+
 

david84

XLDnaute Barbatruc
Re : Creer des petits tableaux a partir d un grand

Bonsoir,
code plus rapide je pense (adaptation d'une méthode de tri de Jacques Boisgontier) :
Code:
Sub Tableaux()
Dim Plage, Entetes As Range, dico As Object, code, c, T(), clé, borne
Dim i&, j&, k&, l&, m As Byte, DerLig&

With Sheets("jour")
    Set Plage = .Range("A2").CurrentRegion.Offset(1).Resize(.Range("A2").CurrentRegion.Rows.Count - 1, _
    .Range("A2").CurrentRegion.Columns.Count - 1)
    Set Entetes = .Range(.Cells(1, 1), .Cells(1, Plage.Columns.Count))
    code = .Range("G2:G" & Plage.Rows.Count + 1)
    Set dico = CreateObject("scripting.dictionary")
    For Each c In code
        dico(c) = dico(c) + 1
    Next c
    clé = dico.keys
    borne = dico.items
Call Tri(clé, borne, 1, UBound(clé))
End With

With Sheets("Regionalisation")
    .Range(.Cells(1, 1), .Cells(10000, Plage.Columns.Count)).Clear
    For i = 1 To dico.Count
        For j = 1 To UBound(code)
            If code(j, 1) = clé(i - 1) Then
                ReDim T(1 To borne(i - 1), 1 To Plage.Columns.Count)
                m = 1
                For k = 1 To Plage.Rows.Count
                    If code(k, 1) = clé(i - 1) Then
                        For l = LBound(T, 2) To UBound(T, 2)
                            T(m, l) = Plage(k, l)
                        Next l
                        m = m + 1
                    End If
                Next k
            End If
        Next j
        
        DerLig = .Range("A" & .Rows.Count).End(xlUp).Row
        .Range("A" & DerLig + 1) = clé(i - 1)
        .Range("A" & DerLig + 2).Resize(, Plage.Columns.Count) = Entetes.Value
        .Range("A" & DerLig + 3).Resize(UBound(T), UBound(T, 2)) = T
    Next i
End With
End Sub
Sub Tri(clé, borne, gauc, droi) ' Quick sort
 Dim ref, g, d, temp
   ref = clé((gauc + droi) \ 2)
   g = gauc: d = droi
   Do
      Do While clé(g) < ref: g = g + 1: Loop
      Do While ref < clé(d): d = d - 1: Loop
        If g <= d Then
           temp = clé(g): clé(g) = clé(d): clé(d) = temp
           temp = borne(g): borne(g) = borne(d): borne(d) = temp
           g = g + 1: d = d - 1
        End If
    Loop While g <= d
    If g < droi Then Call Tri(clé, borne, g, droi)
    If gauc < d Then Call Tri(clé, borne, gauc, d)
End Sub
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth