XL 2016 alimenter des onglets en fonction du nom figurant en colonne G

eastwick

XLDnaute Accro
Bonjour à toutes et tous,
Souci VBA bien pointu.
Je caresse l'espoir d'obtenir un code VBA via Userform (ou autre) qui va m'alimenter au fur et à mesure toute l'année les onglets dont le nom se retrouve dans la colonne G de "planning".
Cependant, la récupération des données doit se faire selon le modèle mis en B1C1M1 en jaune (concaténation de certaines données).
Le tableau planning va évoluer en nombre de lignes, 12 lignes par jour, pour info.
Un grand merci pour ce travail dont l'accomplissement reste pour moi chimérique.
P.S. : les matrices me font ramer grave, j'ai déjà essayé.
 

Pièces jointes

  • xxxxxxx.xlsm
    45 KB · Affichages: 19

job75

XLDnaute Barbatruc
Bonjour eastwick, chris, Jacky67,

Voyez le fichier joint et cette macro dans ThisWorkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim lig&, r As Range
Application.ScreenUpdating = False
With Sheets("planning")
    If Sh.Name = .Name Then Exit Sub
    .[A:K].AutoFilter 7, Sh.Name 'filtre automatique
    lig = 2
    For Each r In .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows
        Sh.Cells(lig, 1) = r.Cells(1).MergeArea(1)
        Sh.Cells(lig, 2) = r.Cells(3)
        Sh.Cells(lig, 3) = r.Cells(8)
        Sh.Cells(lig, 4) = r.Cells(9)
        lig = lig + 1
    Next
    .[A:K].AutoFilter 'RAZ
End With
Sh.Range("A" & lig & ":D" & Sh.Rows.Count).ClearContents 'RAZ en dessous
Sh.[A:A].NumberFormat = "dddd dd/mm/yyyy"
End Sub
Elle se déclenche quand on active une feuille autre que "planning".

Les cellules fusionnées ne posent aucun problème.

A+
 

Pièces jointes

  • Ventiler planning(1).xlsm
    58 KB · Affichages: 12

eastwick

XLDnaute Accro
Merci Job75, je réitère toute mon admiration et mes remerciements pour ce forum qui nous apporte des solutions bureautiques bénévolement, et tout ceci nous facilite grandement la vie, la professionnelle pour le moins ! Donc encore merci et chapeau à ce groupe TOTALEMENT indispensable
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à @eastwick :) , @chris :), @Jacky67:) ,@job75 :),

Juste pour le fun, une version avec un tableau.
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim t, BCM, n&, i&, deb!
   deb = Timer
   Application.ScreenUpdating = False
   With Sheets("planning")
      If Sh.Name = .Name Then Exit Sub
      If .FilterMode Then .ShowAllData
      t = .Range("a1").Resize(.Cells(.Rows.Count, "g").End(xlUp).Row, 9)
   End With
   i = 1: t(i, 2) = t(i, 3): t(i, 3) = t(i, 8): t(i, 4) = t(i, 9):  BCM = Sh.Name: n = n + 1
   For i = 2 To UBound(t)
      If t(i, 1) = "" Then t(i, 1) = t(i - 1, 1)
      If t(i, 7) = BCM Then n = n + 1: t(n, 1) = t(i, 1): t(n, 2) = t(i, 3): t(n, 3) = t(i, 8): t(n, 4) = t(i, 9)
   Next i
   With Sh
      .Range(.Range("a2"), .Cells(.Rows.Count, 5)).ClearContents
      .Range("a2").Resize(n, 4) = t
   End With
   MsgBox Format(Timer - deb, "0.000\ sec.")
End Sub
 

Pièces jointes

  • eastwick- Ventiler planning- v1.xlsm
    214 KB · Affichages: 9
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir mapomme,

Oui les solutions par tableaux VBA sont généralement les plus rapides :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim tablo, critere$, i&, n&, dat
With Sheets("planning")
    If Sh.Name = .Name Then Exit Sub
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    tablo = .Range("A1:I" & .Range("G" & .Rows.Count).End(xlUp).Row).Value2 'matrice, plus rapide
End With
critere = UCase(Sh.Name)
For i = 2 To UBound(tablo)
    If UCase(tablo(i, 7)) = critere Then
        n = n + 1
        If tablo(i, 1) <> "" Then dat = tablo(i, 1)
        tablo(n, 1) = dat: tablo(n, 2) = tablo(i, 3): tablo(n, 3) = tablo(i, 8): tablo(n, 4) = tablo(i, 9)
    End If
Next
'---restitution---
If Sh.FilterMode Then Sh.ShowAllData 'si la feuille est filtrée
Sh.[A:A].NumberFormat = "dddd dd/mm/yyyy" 'au cas où
With Sh.[A3] '1ère cellule de destination, à adapter
    If n Then .Resize(n, 4) = tablo
    .Offset(n).Resize(Sh.Rows.Count - n - .Row + 1, 4).ClearContents 'RAZ en dessous
End With
End Sub
Sur 96 000 lignes => 0,14 seconde chez moi.

A+
 

Pièces jointes

  • Ventiler planning(2).xlsm
    59.2 KB · Affichages: 6

eastwick

XLDnaute Accro
Bonjour à toutes et tous,
Je reviens vers vous, hélas, suite à la connaissance de nouvelles infos. 2 nouveaux onglets sont à ajouter qui s'appelleront TPG et API, ce même nom se retrouvera en colonne G de l'onglet planning. Ainsi les onglets TPG et API récupèreront leurs renseignement spécifiques de la même façon que que les autres onglets (B1C1M1 etc) à savoir sur 4 colonnes. Merci de ce que vous pourrez faire et navré de vous solliciter à nouveau...
 

Pièces jointes

  • ifas_rajout.xlsm
    465 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonjour eastwick, mapomme,

Une solution est d'introduire la colonne supplémentaire "TPG/API" avec cette formule en H2 :
Code:
=SI(OU(D2="";E2="";F2="");REPT(G2;OU(G2="TPG";G2="API"));CONCATENER("B";D2;"C";E2;"M";F2))
Remplacer aussi 7, 8, 9 par 8, 9, 10 dans la macro.

A+
 

Pièces jointes

  • ifas_rajout(1).xlsm
    521.4 KB · Affichages: 4

eastwick

XLDnaute Accro
Merci, j'ai trouvé. Effectivement l'ajout d'onglets API et TPG fonctionne.
Formule en G : =SI(D3="API";"API";SI(D3="TPG";"TPG";SI(OU(D3="";E3="";F3="");"";CONCATENER("B";D3;"C";E3;"M";F3))))
Ainsi, pas besoin de colonne supplémentaire.
Encore merci pour votre aide précieuse.
 

eastwick

XLDnaute Accro
Merci job75. Je reviendrai vers vous prochainement car je souhaite perfectionner ce fichier en calculant le nombre d'heures annuelles par onglet. Ce qui implique de rajouter des colonnes heure de début heure de fin et donc durée... J'ai bien essayé en solo mais lamentable résultat...
 

Statistiques des forums

Discussions
314 662
Messages
2 111 638
Membres
111 242
dernier inscrit
Oyam