Microsoft 365 Correction Code VBA

Thomi

XLDnaute Nouveau
Bonjour, ci joint mon fichier excel sur lequel j'ai un souci

Ma macro "Bon de commande T9" a pour objectif de creer un bon de commande selon les données de la feuille Trame et avec la mise en forme de la feuille Gabarit.
Tout fonctionne correctement.... ou presque.

Une page du bon de commande est supposée correspondre à une catégorie de la feuille Trame et ne peut contenir que 10 codes par page. Si j'ai +10 codes d'une meme catégorie, une nouvelle page se créée avec le(s) code(s) manquant(s) puis change de page & de catégorie des que l'on change de catégorie. Mon souci survient dès que mon nombre de code d'une meme catégorie complète une feuille ( un multiple de 10). Une page se créée avec aucun code dedans (catégorie Eaux-BSA / catégorie Epicerie Sucrée).

Je n'arrive pas à modifier mon code sans casser toute la logique en réglant ce souci de page vide.

J'espere que mon probleme est clair et je vous remercie de votre aide ( toutes les données sensibles ont été retirées).
 

Pièces jointes

  • Fichier Bon de commande test.xlsm
    244 KB · Affichages: 10
Solution
j'ai modifié ton bout de code qui vérifie si la feuille de bon de commande existe pour la vider...
tel quel, ca faisait planter ma proposition
du coup,
je supprime la feuille et la recréé.. et la. plus de souci

j'ai remis en forme le bon de commande avec les sauts de page et la vue "mise en forme"
Oke je vois le rendu, dans l'idée ca me va mais du coup j'ai toujours des "pages" vides entre les catégories et a l'impression ca donne des feuilles blanche.

De mon côté j'ai cherché et j'ai reussi a obtenir qqch qui me convient, j'ai restructuré mon code sur tes conseils pour éviter les boucles, puis a la fin j'ai ajouté une fonction qui supprime toutes les series de 50 lignes vides (soit mes feuilles vides qui m'embetaient). Du...

vgendron

XLDnaute Barbatruc
Bonjour

en jetant un oeil, il me semble que ton code fait beaucoup de boucles remplacables par UNE ligne de code
ensuite, tu n'exploites pas les tables structurées que tu as créées sur ton fichier d'ou encore des boucles avec des indices redondants

ensuite, je pense que l'algo utilisé n'est pas top
si je comprend bien:
UNE page du bon de commande = 10 lignes max d'une MEME catégorie de la table "Trames"
si nb de ligne d'une catégorie<=10 ca donne UNE page
si plus de 10 ca donne une page supplémentaire par lot de 10

à chaque nouvelle catégorie==> on commence une nouvelle page (avec les entetes, lesquelles ne sont mises qu'en PREMIERE page de catégorie.)

Ce que j'aurais fait (si j'ai bien compris)
pour chaque ligne de la table "Trames"
lire catégorie
si nouvelle catégorire
nouvelle page + inscription de l'entete + on se place en haut de page
sinon, si nb ligne>10
nouvelle page + on se place en haut de page
sinon
on se place à la dernière ligne de la page en cours
 

vgendron

XLDnaute Barbatruc
Une proposition en PJ

j'ai repris la quasi totalité du code
commenté toute la partie "barre de progression"
commenté tout un tas de macros devenues inutiles

à partir d'une feuille "Bon de commande" INEXISTANTE, l'execution du code se fait en 9s chez moi

Reste juste à faire le mode "page" avec 56 lignes.. un truc que je n'ai jamais su faire...
 

Pièces jointes

  • Fichier Bon de commande test.xlsm
    141.6 KB · Affichages: 3

Thomi

XLDnaute Nouveau
Bonjour vgendron, merci a toi pour ta proposition,

En effet tu as bien compris ce qu'est censé faire la macro, mais en utilisant un 'gabarit' je suis bloqué et je ne peux faire que des pages de 10 codes, qu'ils soient vides ou renseigné mais cela ne me dérange pas.

Ma problématique vient exclusivement du fait que dans le cas de l'epicerie sucrée par exemple, je remplis exactement 5 feuilles soit 50 codes.
Or la feuille suivante n'a pas de raison d'etre une feuille "EPICERIE SUCREE" étant donnée que je n'ai plus de code de cette catégorie. Mais si j'ai 49 codes et donc ma derniere feuille pas complete, je n'ai plus le probleme.

As tu la possibilité de me joindre un screen du rendu que te fait ta macro ? Je l'ai lancé mais ca change le resultat de ce que j'avais avec des lignes de vide et du coup ca chamboule completement l'application du gabarit. J'ai surement fait une erreur dans l'adaptation de ta proposition😅.

Merci a toi l'ami

(Ci-joint le rendu sur la 2nd feuille soit la catégorie 'Charcuterie')
 

Pièces jointes

  • Capture d’écran 2024-07-30 094642.png
    Capture d’écran 2024-07-30 094642.png
    36.5 KB · Affichages: 2

Thomi

XLDnaute Nouveau
hello

bah... avant de vouloir adapter, il suffit de lancer la macro de mon fichier et voir ce que ca donne directement ..non??
Tu te doutes bien que j'ai essayé, mais je suis sur un pc d'entreprise avec des restrictions groupe qui m'empeche d'utiliser une macro externe. J'ai donc remis ta macro sur mon fichier mais j'avais un message d'erreur dans la partie Gabarit=Range.("Gabarit") ce que j'ai du ajuster pour que cela se lance correctement
 

vgendron

XLDnaute Barbatruc
j'ai modifié ton bout de code qui vérifie si la feuille de bon de commande existe pour la vider...
tel quel, ca faisait planter ma proposition
du coup,
je supprime la feuille et la recréé.. et la. plus de souci

j'ai remis en forme le bon de commande avec les sauts de page et la vue "mise en forme"
 

Pièces jointes

  • Fichier Bon de commande test.xlsm
    226.8 KB · Affichages: 1

Thomi

XLDnaute Nouveau
j'ai modifié ton bout de code qui vérifie si la feuille de bon de commande existe pour la vider...
tel quel, ca faisait planter ma proposition
du coup,
je supprime la feuille et la recréé.. et la. plus de souci

j'ai remis en forme le bon de commande avec les sauts de page et la vue "mise en forme"
Oke je vois le rendu, dans l'idée ca me va mais du coup j'ai toujours des "pages" vides entre les catégories et a l'impression ca donne des feuilles blanche.

De mon côté j'ai cherché et j'ai reussi a obtenir qqch qui me convient, j'ai restructuré mon code sur tes conseils pour éviter les boucles, puis a la fin j'ai ajouté une fonction qui supprime toutes les series de 50 lignes vides (soit mes feuilles vides qui m'embetaient). Du coup tout se fait comme avant et cela supprime mes feuilles vides et donc je suis nickel.

Merci a toi pour ton investissement et tes propositions, J'ai pu mettre au propre mon code qui fonctionne du coup plus rapidement aussi et est plus lisible.
 

vgendron

XLDnaute Barbatruc
Je pense que les pages "vides" sont dues au fait que à la fin de la macro, les sections débordent sur la page de droite

en ajoutant une mise à l'échelle, avec mon fichier, je n'ai aucune page vide

VB:
Private Sub MettreEnForme()
'Application.ScreenUpdating = False
Set wsBCT9 = Sheets("Bon de commande T9")
Set Gabarit = Range("Gabarit")
    With wsBCT9
        lastLine = .UsedRange.Rows.Count
        For i = 1 To lastLine
            If .Range("A" & i).MergeCells Then
                Gabarit.Copy
                .Range("A" & i).Resize(5, 9).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                If .Range("A" & i) = "Visuel Article" Then
                    Set rngFusion = .Range("B" & i + 4).Resize(, 4)
                    With rngFusion
                        .Font.Color = RGB(0, 0, 0) ' Appliquer la couleur noire au texte
                        .Font.Size = 10
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlBottom
                        .WrapText = False
                        .Orientation = 0
                        .AddIndent = False
                        .IndentLevel = 0
                        .ShrinkToFit = False
                        .ReadingOrder = xlContext
                        .MergeCells = True
                        .Value = "Eligibilité enseigne: SUP-EXP-CIT-CMK-PS"
                    End With
                End If
                i = i + 4
            Else 'on est sur une ligne de catégorie
                Set rngFusion = .Range("A" & i).Resize(1, 4)
                With rngFusion
                    .Merge
                    .Font.Bold = True
                    .Font.Color = RGB(0, 0, 0) ' Appliquer la couleur noire au texte
                    .Font.Size = 10
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlBottom
                    .WrapText = False
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = False
                    .ReadingOrder = xlContext
                End With
            End If
        Next i
      
       'on set tous les sauts de page pour n'avoir que 56 lignes par feuille
        ActiveWindow.View = xlPageBreakPreview 'affichage en mode "sauts de page"
        lastLine = .UsedRange.Rows.Count
        NumSp = 1
        i = NumSp
        While i < lastLine
            Set .HPageBreaks(NumSp).Location = .Range("A" & NumSp * 56 + 1)
            NumSp = NumSp + 1
            i = NumSp * 56 + 1
        Wend
        .PageSetup.Zoom = 80
        ActiveWindow.View = xlPageLayoutView 'affichage mode "mise en page"

    End With
    'Application.ScreenUpdating = True
End Sub
 

Thomi

XLDnaute Nouveau
Je pense que les pages "vides" sont dues au fait que à la fin de la macro, les sections débordent sur la page de droite

en ajoutant une mise à l'échelle, avec mon fichier, je n'ai aucune page vide

VB:
Private Sub MettreEnForme()
'Application.ScreenUpdating = False
Set wsBCT9 = Sheets("Bon de commande T9")
Set Gabarit = Range("Gabarit")
    With wsBCT9
        lastLine = .UsedRange.Rows.Count
        For i = 1 To lastLine
            If .Range("A" & i).MergeCells Then
                Gabarit.Copy
                .Range("A" & i).Resize(5, 9).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                If .Range("A" & i) = "Visuel Article" Then
                    Set rngFusion = .Range("B" & i + 4).Resize(, 4)
                    With rngFusion
                        .Font.Color = RGB(0, 0, 0) ' Appliquer la couleur noire au texte
                        .Font.Size = 10
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlBottom
                        .WrapText = False
                        .Orientation = 0
                        .AddIndent = False
                        .IndentLevel = 0
                        .ShrinkToFit = False
                        .ReadingOrder = xlContext
                        .MergeCells = True
                        .Value = "Eligibilité enseigne: SUP-EXP-CIT-CMK-PS"
                    End With
                End If
                i = i + 4
            Else 'on est sur une ligne de catégorie
                Set rngFusion = .Range("A" & i).Resize(1, 4)
                With rngFusion
                    .Merge
                    .Font.Bold = True
                    .Font.Color = RGB(0, 0, 0) ' Appliquer la couleur noire au texte
                    .Font.Size = 10
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlBottom
                    .WrapText = False
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = False
                    .ReadingOrder = xlContext
                End With
            End If
        Next i
     
       'on set tous les sauts de page pour n'avoir que 56 lignes par feuille
        ActiveWindow.View = xlPageBreakPreview 'affichage en mode "sauts de page"
        lastLine = .UsedRange.Rows.Count
        NumSp = 1
        i = NumSp
        While i < lastLine
            Set .HPageBreaks(NumSp).Location = .Range("A" & NumSp * 56 + 1)
            NumSp = NumSp + 1
            i = NumSp * 56 + 1
        Wend
        .PageSetup.Zoom = 80
        ActiveWindow.View = xlPageLayoutView 'affichage mode "mise en page"

    End With
    'Application.ScreenUpdating = True
End Sub
En effet cela semble mieux fonctionner comme cela, merci pour la proposition
 

Statistiques des forums

Discussions
313 866
Messages
2 103 082
Membres
108 521
dernier inscrit
manouba