Microsoft 365 Découper fichier bulletin de paie

clem312

XLDnaute Nouveau
Bonjour,

J'ai un fichier avec de multiples bulletin de paie. Toutes les 30 lignes, il y a un nouveau bulletin.
Je dois générer un fichier par bulletin tout en respectant la mise en page qui contient des cellules fusionnées...
Je n'y arrive pas !


Clément
 

Pièces jointes

  • Fiches de paie.xlsx
    16.4 KB · Affichages: 37
Solution
Bonjour le fil, bonjour le forum,

À améliorer pour le nom et le chemin d'accès mais c'est fonctionnel. À placer dans le fichier original Excel :

VB:
Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim BE As Variant 'déclare la variable BE (Boîte d'Entrée)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CS = ThisWorkbook...

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Clem, bonjour le forum,

Perso, plutôt que de mettre tous les bulletins dans le même onglet les uns en-dessous des autres, j'aurais créé un onglet Modèle contenant un seul bulletin de salaire. Tu pourras le copier à souhait avec une macro pour chacun de tes salarié soit dans un nouveau fichier ou pourquoi pas dans un nouvel onglet du même fichier...
Mais j'dis rat, j'dis sien...
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Clem, Robert

Moi, je dis Word, j'dis Publispotage
Dans une base Excel, les élements pour remplir les bulletin de salaire
1 ligne= 1 salarié
Un document Word (formaté en bulletin de salaire) avec les champs de fusion nécéssaires

L'avantage de cette optique, c'est qu'on peut générer les bulletins:
• pour tous les salariés
• par service
• pour un mois donné
• pour une année donnée (en cas de duplicata à faire par exemple)
• pour un seul salarié
etc...
 

clem312

XLDnaute Nouveau
Bonjour Clem, bonjour le forum,

Perso, plutôt que de mettre tous les bulletins dans le même onglet les uns en-dessous des autres, j'aurais créé un onglet Modèle contenant un seul bulletin de salaire. Tu pourras le copier à souhait avec une macro pour chacun de tes salarié soit dans un nouveau fichier ou pourquoi pas dans un nouvel onglet du même fichier...
Mais j'dis rat, j'dis sien...
Bonjour Robert,

J'aimerais bien mais le logiciel de paie Pegase ne me propose que l'export d'un fichier pdf contenant tous les bulletins de paie. Pour l'instant, je n'ai pas d'autre choix que de le transformer en fichier Excel pour le découper.
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

À améliorer pour le nom et le chemin d'accès mais c'est fonctionnel. À placer dans le fichier original Excel :

VB:
Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim BE As Variant 'déclare la variable BE (Boîte d'Entrée)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets(1) 'définit l'onglet source OS (à adapter à ton cas)
CA = CS.Path & "\" 'définit le chemin d'accès CA
DL = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row + 20 'définit la dernière ligne DL
For I = 1 To DL Step 30 'boucle sur toutes les lignes I de 1 à DL par pas de 30
    Set CD = Workbooks.Add 'définit le classeur destination CD (en ouvrant un classeur vierge)
    Set OD = CD.Worksheets(1) 'définit l'onglet destination OD
    OS.Range(OS.Cells(I, 1), OS.Cells(I + 29, "G")).Copy OD.Range("A1") 'copy la plage de 30 lignes
    OD.Rows(10).RowHeight = 167.5
    OD.Rows(11).RowHeight = 60.25
    OD.Rows(12).RowHeight = 258
ici: 'étiquette
    BE = Application.InputBox("Taper le nom du fichier sans extension.", "NOM", Type:=2) 'définit la boîte d'entrée BE
    If BE = False Then CD.Close False: GoTo suite 'si bouton [Annuler], ferme le classeur destination sans enregistrer, va à l'étiquette "suite"
    If BE = "" Then 'condition : si BE n'est pas renseignée
        MsgBox "Sans le nom le fichier se sera pas enregistrer !" 'message
        GoTo ici 'va à l'étiquette "ici"
    End If 'fin de la condition
    CD.SaveAs CA & BE, 51 'sauve le classeur destination dans le dossier ayant CA comme chemin d'accès
    CD.Close False 'ferme le classeur distination sans enregistrer
suite: 'étiquette
Next I 'prochain pack de 30 lignes
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Pour l'instant, je n'ai pas d'autre choix que de le transformer en fichier Excel pour le découper.
Avec quoi fais-tu cela ?

Au boulot, je dispose d'Acrobat Standard DC

(il ne s'agit pas du lecteur)
Et donc si j'ai un PDF qui fait 30 pages, Adobe sait splitter le PDF en 30 PDF d'une page
(donc si tes bulletins tiennent sur 1 seule page sur lePDF global, c'est une possiblitié à envisager car Adobe fait cela très rapidement)

Cochez [x] Extraire les pages sous forme de fichiers distincts
 

clem312

XLDnaute Nouveau
Bonjour le fil, bonjour le forum,

À améliorer pour le nom et le chemin d'accès mais c'est fonctionnel. À placer dans le fichier original Excel :

VB:
Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim BE As Variant 'déclare la variable BE (Boîte d'Entrée)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets(1) 'définit l'onglet source OS (à adapter à ton cas)
CA = CS.Path & "\" 'définit le chemin d'accès CA
DL = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row + 20 'définit la dernière ligne DL
For I = 1 To DL Step 30 'boucle sur toutes les lignes I de 1 à DL par pas de 30
    Set CD = Workbooks.Add 'définit le classeur destination CD (en ouvrant un classeur vierge)
    Set OD = CD.Worksheets(1) 'définit l'onglet destination OD
    OS.Range(OS.Cells(I, 1), OS.Cells(I + 29, "G")).Copy OD.Range("A1") 'copy la plage de 30 lignes
    OD.Rows(10).RowHeight = 167.5
    OD.Rows(11).RowHeight = 60.25
    OD.Rows(12).RowHeight = 258
ici: 'étiquette
    BE = Application.InputBox("Taper le nom du fichier sans extension.", "NOM", Type:=2) 'définit la boîte d'entrée BE
    If BE = False Then CD.Close False: GoTo suite 'si bouton [Annuler], ferme le classeur destination sans enregistrer, va à l'étiquette "suite"
    If BE = "" Then 'condition : si BE n'est pas renseignée
        MsgBox "Sans le nom le fichier se sera pas enregistrer !" 'message
        GoTo ici 'va à l'étiquette "ici"
    End If 'fin de la condition
    CD.SaveAs CA & BE, 51 'sauve le classeur destination dans le dossier ayant CA comme chemin d'accès
    CD.Close False 'ferme le classeur distination sans enregistrer
suite: 'étiquette
Next I 'prochain pack de 30 lignes
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Bonjour @Robert

Merci.
C'est presque ca. Le script me demander de nommer chaque nouveau bulletin. Il y en a une centaine.
Peut-on les appeler bulletin-001, bulletin 002 automatiquement?

Clément
 

clem312

XLDnaute Nouveau
Re


Avec quoi fais-tu cela ?

Au boulot, je dispose d'Acrobat Standard DC

(il ne s'agit pas du lecteur)
Et donc si j'ai un PDF qui fait 30 pages, Adobe sait splitter le PDF en 30 PDF d'une page
(donc si tes bulletins tiennent sur 1 seule page sur lePDF global, c'est une possiblitié à envisager car Adobe fait cela très rapidement)

Cochez [x] Extraire les pages sous forme de fichiers distincts
Bonjour @Staple1600

Merci de l'idée mais on a vraiment besoin de le passer en excel. On passe ensuite d'autres traiements sur la gestion des heures.

Clément
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Juste pour infos
Acrobat Standard DC permet d'exporter un PDF en Excel
NB: J'ai parlé d'Acrobat après avoir lu ceci
J'aimerais bien mais le logiciel de paie Pegase ne me propose que l'export d'un fichier pdf contenant tous les bulletins de paie. Pour l'instant, je n'ai pas d'autre choix que de le transformer en fichier Excel pour le découper.
Donc si chaque bulletin tient sur une page (dans le PDF issu de Pégase)
Le splitter en N pages, c'est bien obtenir N bulletins de salaire, non ?
Ensuite (si besoin), clic-droit -> Modifier dans Acrobat -> Exporter vers -> Classeur Excel
 

Discussions similaires

Réponses
4
Affichages
281
Réponses
2
Affichages
147

Statistiques des forums

Discussions
312 082
Messages
2 085 169
Membres
102 804
dernier inscrit
edaguo