XL 2016 Mise en forme d'un fichier Excel, création onglets

ninieg

XLDnaute Nouveau
Bonjour,
J'ai un fichier brut d'inventaire et je voudrais qu'un onglet soit créé pour chaque niveau de famille 3. Dans mon fichier tout est en ligne et les familles sont indiquées de cette façon : "MP / AC / 42CD4T / ROND : ROND" et je voudrais un onglet qui s'appellerait "42CD4T" avec tous les articles concernés. Je ne sais pas si je suis claire, je vous joins le fichier brut.
 

Pièces jointes

  • INV-0007.xls
    420.5 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Ninieg, wDog,
Pourquoi ne pas demander à chatGPT pour ce genre de chose
Encore faut il que ChatGPT puisse répondre sans erreur, ce qui en VBA est rarement le cas. :)
Ensuite, répondre à des problèmes XL, c'est l'essence même d' XLD. 😅

@ninieg
Le problème sera d'identifier la page à créer.
Par ex pour MP / AC / 42CD4T / ROND : ROND on prend 42CD4T soit l'avant dernière chaine.
Mais quand vous avez :
MP / AC / C45 : C45 : Vous prenez AC ? Ce qui m'étonnerait
car vous avez ensuite : MP / AC / C45 / Plat : Plat qui correspondrait à C45.

En PJ j'ai mis en colonne O toutes les chaines en italique de la colonne A.
J'ai mis en rouge quelques appellations dont je ne comprends pas quelle feuille il faudrait créer.
Un peu d'éclaircissements seraient les bienvenus.
 

Pièces jointes

  • INV-0007.xls
    425 KB · Affichages: 1

ninieg

XLDnaute Nouveau
Bonjour Ninieg, wDog,

Encore faut il que ChatGPT puisse répondre sans erreur, ce qui en VBA est rarement le cas. :)
Ensuite, répondre à des problèmes XL, c'est l'essence même d' XLD. 😅

@ninieg
Le problème sera d'identifier la page à créer.
Par ex pour MP / AC / 42CD4T / ROND : ROND on prend 42CD4T soit l'avant dernière chaine.
Mais quand vous avez :
MP / AC / C45 : C45 : Vous prenez AC ? Ce qui m'étonnerait
car vous avez ensuite : MP / AC / C45 / Plat : Plat qui correspondrait à C45.

En PJ j'ai mis en colonne O toutes les chaines en italique de la colonne A.
J'ai mis en rouge quelques appellations dont je ne comprends pas quelle feuille il faudrait créer.
Un peu d'éclaircissements seraient les bienvenus.
Merci beaucoup, en effet je voudrais la troisième famille, c'est bien celle que vous avez identifiée, lorsqu'il n'y a pas de 4ème famille dans le cas MP / AC / C45 : C45, on prend C45 idem pour les autres, le top du top serait d'avoir dans le nom de l'onglet AC C45 ou AC 42CD4T.
 

wDog66

XLDnaute Occasionnel
@sylvanu bonjour,

Bien souvent, si ChatGPT ne répond pas correctement, c'est que la demande n'est pas assez explicite 🤔 :rolleyes:
Perso, je l'utilise assez régulièrement pour du code et c'est plutôt bluffant 😜

Ceci dit, je suis d'accord, les forums sont là pour répondre plus précisément aux questions et surtout pour les néophytes.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Un essai en PJ avec ces macros :
VB:
Public ListeFeuilles, Factive
Sub ConstruireFichier()
Dim L%
Set Factive = ActiveSheet
Application.StatusBar = "Suppression des feuilles.": SupprimerFeuilles
Application.StatusBar = "Faire la Liste des Feuilles.": FaireListeFeuilles
Application.ScreenUpdating = False
For L = 1 To UBound(ListeFeuilles)
    If ListeFeuilles(L, 1) = "" Then Exit For
    CreerRemplirFeuilles (L)
Next L
Application.StatusBar = ""
End Sub
Sub CreerRemplirFeuilles(L)
'Créer une feuille, la renomme, la remplit
On Error GoTo FinCréer
Dim Nom$, Début%, Fin%, Taille%
Nom = ListeFeuilles(L, 1)
Début = ListeFeuilles(L, 2)
Fin = ListeFeuilles(L + 1, 2)
Taille = Fin - Début
Application.StatusBar = "Création de la feuille " & Nom
Sheets.Add After:=Sheets(Sheets.Count): ActiveSheet.Name = Nom
With Sheets(Nom)
    Range(.Cells(1, "A"), .Cells(Taille, "J")) = Range(Factive.Cells(Début, "A"), Factive.Cells(Fin, "J")).Value
    .Columns.AutoFit
End With
Factive.Select
FinCréer:
End Sub
Sub SupprimerFeuilles()
'Supprime toutes les feuilles sauf celle active.
Dim F
Application.DisplayAlerts = False
For Each F In Worksheets
    If F.Name <> Factive.Name Then Sheets(F.Name).Delete
Next F
Application.DisplayAlerts = True
End Sub
Sub FaireListeFeuilles()
Dim Ligne%, L%
'Fait la liste de tous les noms de feuilles à créer
ReDim ListeFeuilles(1 To 1000, 1 To 2)
Ligne = 1
With ActiveSheet
    For L = 1 To .[A60000].End(xlUp).Row
        If Cells(L, "A").Font.Italic = True And Cells(L, "A").Font.Bold = True Then ' Si cellule gras/italique
            Nom = ConstruireNom(.Cells(L, "A"))
            If Nom <> "" Then
                ListeFeuilles(Ligne, 1) = Nom   ' Nom de la feuille à créer
                ListeFeuilles(Ligne, 2) = L     ' Numéro de la 1ere ligne à sauvegarder
                Ligne = Ligne + 1
            End If
        End If
    Next L
    ListeFeuilles(Ligne, 2) = L                 ' Dernière ligne à sauvegarder pour la dernière feuilles
End With
End Sub
Function ConstruireNom(Nom)
Dim T, Fin%
ConstruireNom = ""
T = Split(Nom, "/"): Fin = UBound(T)
If T(Fin) <> "" Then
    If Fin = 1 Then
        ConstruireNom = T(Fin - 1) & "-" & Split(T(Fin), ":")(1)
    Else
        ConstruireNom = T(Fin - 2) & "-" & T(Fin - 1) & "-" & Split(T(Fin), ":")(1)
    End If
    ConstruireNom = Replace(ConstruireNom, "  ", " ")
    ConstruireNom = Trim(ConstruireNom)
    If Len(ConstruireNom) > 31 Then ConstruireNom = Mid(ConstruireNom, 1, 31)
End If
End Function
 

Pièces jointes

  • INV-0007 V2.xlsm
    222.2 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bien souvent, si ChatGPT ne répond pas correctement, c'est que la demande n'est pas assez explicite
D'accord avec vous.
Cependant 9 fois sur 10, une question posée sur XLD est suivie d'une ou plusieurs demandes d'éclaircissement.
Donc la question initiale posée sur ChatGPT ou Aria ou Bard se solderait pas un échec.
Par ex ici sans la précision du post #4 même un humain ne pourrait résoudre le problème.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Il est navrant de voir que vous semblez si allergique l'IA générative... il faut savoir vivre avec son temps
Allergique, non.
Mais il faut savoir interpréter les résultats des IA et ne pas les prendre au pied de la lettre.
De plus elles ne génèrent pas souvent du code optimisé.
Par ex, à la question :
Ecrire un programme en VBA Excel pour remplir les cellules de A1 à A20 avec "Essai"
ChatGPT réponds :
VB:
Sub RemplirCellules()
    Dim i As Integer
    For i = 1 To 20
        Cells(i, 1).Value = "Essai"
    Next i
End Sub
alors qu'il y a plus optimisé :
Code:
Sub Test()
    [A1:A20]="Essai"
End Sub
Alors pour s'inspirer quand on sèche, ok. Pour l'utiliser pour tout un code, certainement pas.
 

ninieg

XLDnaute Nouveau
Re,
Un essai en PJ avec ces macros :
VB:
Public ListeFeuilles, Factive
Sub ConstruireFichier()
Dim L%
Set Factive = ActiveSheet
Application.StatusBar = "Suppression des feuilles.": SupprimerFeuilles
Application.StatusBar = "Faire la Liste des Feuilles.": FaireListeFeuilles
Application.ScreenUpdating = False
For L = 1 To UBound(ListeFeuilles)
    If ListeFeuilles(L, 1) = "" Then Exit For
    CreerRemplirFeuilles (L)
Next L
Application.StatusBar = ""
End Sub
Sub CreerRemplirFeuilles(L)
'Créer une feuille, la renomme, la remplit
On Error GoTo FinCréer
Dim Nom$, Début%, Fin%, Taille%
Nom = ListeFeuilles(L, 1)
Début = ListeFeuilles(L, 2)
Fin = ListeFeuilles(L + 1, 2)
Taille = Fin - Début
Application.StatusBar = "Création de la feuille " & Nom
Sheets.Add After:=Sheets(Sheets.Count): ActiveSheet.Name = Nom
With Sheets(Nom)
    Range(.Cells(1, "A"), .Cells(Taille, "J")) = Range(Factive.Cells(Début, "A"), Factive.Cells(Fin, "J")).Value
    .Columns.AutoFit
End With
Factive.Select
FinCréer:
End Sub
Sub SupprimerFeuilles()
'Supprime toutes les feuilles sauf celle active.
Dim F
Application.DisplayAlerts = False
For Each F In Worksheets
    If F.Name <> Factive.Name Then Sheets(F.Name).Delete
Next F
Application.DisplayAlerts = True
End Sub
Sub FaireListeFeuilles()
Dim Ligne%, L%
'Fait la liste de tous les noms de feuilles à créer
ReDim ListeFeuilles(1 To 1000, 1 To 2)
Ligne = 1
With ActiveSheet
    For L = 1 To .[A60000].End(xlUp).Row
        If Cells(L, "A").Font.Italic = True And Cells(L, "A").Font.Bold = True Then ' Si cellule gras/italique
            Nom = ConstruireNom(.Cells(L, "A"))
            If Nom <> "" Then
                ListeFeuilles(Ligne, 1) = Nom   ' Nom de la feuille à créer
                ListeFeuilles(Ligne, 2) = L     ' Numéro de la 1ere ligne à sauvegarder
                Ligne = Ligne + 1
            End If
        End If
    Next L
    ListeFeuilles(Ligne, 2) = L                 ' Dernière ligne à sauvegarder pour la dernière feuilles
End With
End Sub
Function ConstruireNom(Nom)
Dim T, Fin%
ConstruireNom = ""
T = Split(Nom, "/"): Fin = UBound(T)
If T(Fin) <> "" Then
    If Fin = 1 Then
        ConstruireNom = T(Fin - 1) & "-" & Split(T(Fin), ":")(1)
    Else
        ConstruireNom = T(Fin - 2) & "-" & T(Fin - 1) & "-" & Split(T(Fin), ":")(1)
    End If
    ConstruireNom = Replace(ConstruireNom, "  ", " ")
    ConstruireNom = Trim(ConstruireNom)
    If Len(ConstruireNom) > 31 Then ConstruireNom = Mid(ConstruireNom, 1, 31)
End If
End Function
Merci beaucoup
 

Discussions similaires

M
Réponses
9
Affichages
754
Maikales
M

Statistiques des forums

Discussions
315 132
Messages
2 116 581
Membres
112 797
dernier inscrit
zouzou50