VBA Paie

 



IMPRIMER_Click

Private Sub IMPRIMER_Click()

    ' Vérifie que la feuille active est bien Bull_Paie
    If ActiveSheet Is Bull_Paie Then

        ' Vérifie que le numéro du bulletin est bien renseigné
        If Bull_Paie.Range("O2").Value <> "" Then

            Dim tbl As ListObject
            Set tbl = Liste_Paie_Personel.ListObjects("Liste_Paie_Personel")

            Dim lastRow As Range
            Dim newRow As ListRow

            ' Crée le nom du document (sécurisé)
            Dim nomDocument As String
            nomDocument = NettoyerNomFichier(Bull_Paie.Range("Q2").Value & "_" & Bull_Paie.Range("E18").Value)

            ' Crée le chemin du dossier où enregistrer le PDF
            Dim dossierAdresse As String
            dossierAdresse = Liste_Paie_Personel.Range("B1").Value & "\"

            ' Crée le dossier s'il n'existe pas
            If Dir(dossierAdresse, vbDirectory) = "" Then
                On Error Resume Next
                MkDir dossierAdresse
                If Err.Number <> 0 Then
                    MsgBox "Erreur lors de la création du dossier : " & dossierAdresse, vbCritical
                    Exit Sub
                End If
                On Error GoTo 0
            End If

            ' Vérifie si le fichier existe déjà pour éviter d'écraser
            If Dir(dossierAdresse & nomDocument & ".pdf") <> "" Then
                MsgBox "Ce bulletin existe déjà. Veuillez changer le nom ou supprimer l'ancien fichier.", vbExclamation
                Exit Sub
            End If

            ' Étape 1 : Ajouter une nouvelle ligne à la fin du tableau
            Set newRow = tbl.ListRows.Add

            ' Étape 2 : Copier les formules de la ligne précédente
            If tbl.ListRows.Count > 1 Then
                Set lastRow = tbl.ListRows(tbl.ListRows.Count - 1).Range
                lastRow.Copy
                newRow.Range.PasteSpecial Paste:=xlPasteFormulas
                Application.CutCopyMode = False
            End If

            ' Étape 3 : Supprimer les valeurs statiques copiées
            Dim cell As Range
            For Each cell In newRow.Range
                On Error Resume Next
                If Not cell.HasFormula And cell.Value <> "" Then
                    cell.Value = ""
                End If
                On Error GoTo 0
            Next cell

            ' Étape 4 : Remplir les données dans les colonnes concernées
            With newRow.Range
                .Cells(1, tbl.ListColumns("Nom document").Index).Value = nomDocument
                .Cells(1, tbl.ListColumns("DOCUMENT").Index).Value = dossierAdresse & nomDocument & ".pdf"
                .Cells(1, tbl.ListColumns("Recherche").Index).Value = Bull_Paie.ListObjects("Recherche_paie").DataBodyRange.Cells(1, 1).Value
                .Cells(1, tbl.ListColumns("Periode").Index).Value = Bull_Paie.ListObjects("periode_bulletin_paie_Ds_BP").ListColumns("periode").DataBodyRange.Cells(1, 1).Value
            End With

            ' Étape 5 : Ajouter un lien hypertexte vers le PDF
            With Liste_Paie_Personel.Hyperlinks.Add( _
                Anchor:=newRow.Range.Cells(1, tbl.ListColumns("DOCUMENT").Index), _
                Address:=dossierAdresse & nomDocument & ".pdf", _
                TextToDisplay:="Consulter")
                .Range.Font.Name = "Montserrat"
                .Range.Font.Color = RGB(60, 65, 205)
                .Range.Font.Size = 11
            End With

            ' Étape 6 : Préparer et exporter en PDF
            Dim feuille As Worksheet
            Set feuille = Bull_Paie

            Application.ScreenUpdating = False
            With feuille.PageSetup
                .PrintArea = "$C$8:$M$64"
                .FitToPagesTall = 1
                .FitToPagesWide = 1
                .LeftMargin = Application.InchesToPoints(0)
                .RightMargin = Application.InchesToPoints(0)
                .TopMargin = Application.InchesToPoints(0)
                .BottomMargin = Application.InchesToPoints(0)
            End With

            feuille.Visible = xlSheetVisible
            feuille.Activate
            feuille.ExportAsFixedFormat _
                Type:=xlTypePDF, _
                Filename:=dossierAdresse & nomDocument & ".pdf", _
                Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, _
                OpenAfterPublish:=True

            Application.ScreenUpdating = True

        Else
            MsgBox "Veuillez saisir un numéro de bulletin de paie dans la cellule O2.", vbExclamation
        End If

    Else
        MsgBox "Il faut être dans la feuille 'Bull_Paie' pour lancer l'impression.", vbExclamation
    End If

End Sub

🔧 Fonction complémentaire : NettoyerNomFichier

Place cette fonction dans un module standard ou dans le même module que la macro :

Public Function NettoyerNomFichier(nom As String) As String

    Dim invalide As Variant

    For Each invalide In Array("\", "/", ":", "*", "?", """", "<", ">", "|")

        nom = Replace(nom, invalide, "_")

    Next

    NettoyerNomFichier = nom

End Function

🖨️ Macro IMPRIMER_Click – Génération automatique de bulletin de paie en PDF

Cette macro permet d’automatiser totalement l’enregistrement et l’exportation d’un bulletin de paie personnalisé au format PDF, à partir d’un modèle pré-rempli dans la feuille Bull_Paie.

Elle effectue les étapes suivantes :

  1. Vérification : Elle s'assure que l'utilisateur se trouve bien sur la feuille Bull_Paie et que le numéro du bulletin (cellule O2) est bien renseigné.

  2. Ajout automatique : Une nouvelle ligne est ajoutée au tableau Liste_Paie_Personel pour enregistrer les informations du bulletin.

  3. Conservation des formules : Les formules de la ligne précédente sont copiées, mais toutes les valeurs fixes sont effacées pour éviter des doublons ou erreurs.

  4. Remplissage automatique : Les informations importantes comme le nom du document, le lien PDF, la période de paie et l’identifiant de recherche sont automatiquement insérées dans les colonnes du tableau.

  5. Lien hypertexte cliquable : Un lien “Consulter” est inséré dans la colonne "DOCUMENT", avec une mise en forme personnalisée, permettant d’ouvrir le PDF directement depuis Excel.

  6. Création du dossier et export en PDF : Si le dossier d’enregistrement n’existe pas, il est automatiquement créé. Ensuite, le bulletin est exporté en PDF (zone d’impression : C8:M64) avec les bonnes marges et dimensionnements.

  7. Nom sécurisé : Le nom du fichier PDF est nettoyé pour éviter tout caractère interdit, grâce à une petite fonction personnalisée intégrée dans le module.

🔐 Bonus sécurité : Si un fichier PDF avec le même nom existe déjà, la macro bloque l’opération pour éviter toute écrasement accidentel.

 Ajouter_Click

Private Sub Ajouter_Click()

    If Liste_Paie_Personel_calcule.Range("A1").Value = "P" And Liste_Paie_Personel_calcule.Range("E3").Value <> "" Then

        Dim tbl As ListObject
        Dim lastRow As Range
        Dim newRow As ListRow
        Dim i As Integer
        Dim colName As String
        Dim colIndex As Long

        Set tbl = Liste_Paie_Personel_calcule.ListObjects("Tbl_Liste_Paie_Personel_calcule")

        ' Étape 1 : Ajouter une nouvelle ligne vide
        Set newRow = tbl.ListRows.Add

        ' Étape 2 : Copier les formules depuis la ligne précédente
        If tbl.ListRows.Count > 1 Then
            Set lastRow = tbl.ListRows(tbl.ListRows.Count - 1).Range
            lastRow.Copy
            newRow.Range.PasteSpecial Paste:=xlPasteFormulas
            Application.CutCopyMode = False
        End If
        
        ' Étape 3 : effacer les zonne
        With newRow.Range
                    
                    For i = 2 To 9
                    colName = Liste_Paie_Personel_calcule.Range("D" & i).Value
                    colIndex = tbl.ListColumns(colName).Index
                    .Cells(1, colIndex).Value = ""
                    Next i
                    For i = 2 To 9
                    colName = Liste_Paie_Personel_calcule.Range("F" & i).Value
                    colIndex = tbl.ListColumns(colName).Index
                    .Cells(1, colIndex).Value = ""
                     Next i

                     colName = Liste_Paie_Personel_calcule.Range("H2").Value
                    colIndex = tbl.ListColumns(colName).Index
                    .Cells(1, colIndex).Value = ""

        End With
        ' Étape 3 : Remplir les données dans les colonnes concernées
        With newRow.Range
            .Cells(1, tbl.ListColumns("Date").Index).Value = Liste_Paie_Personel_calcule.Range("E2").Value
            .Cells(1, tbl.ListColumns("Matricule").Index).Value = Liste_Paie_Personel_calcule.Range("E3").Value
            .Cells(1, tbl.ListColumns("NB jour").Index).Value = Liste_Paie_Personel_calcule.Range("E4").Value
            .Cells(1, tbl.ListColumns("NB jour Congé").Index).Value = Liste_Paie_Personel_calcule.Range("E5").Value

            ' Champs dynamiques D6:D9 => E6:E9
            For i = 6 To 9
                If Liste_Paie_Personel_calcule.Range("E" & i).Value <> "" Then
                    colName = Liste_Paie_Personel_calcule.Range("D" & i).Value
                    colIndex = tbl.ListColumns(colName).Index
                    .Cells(1, colIndex).Value = Liste_Paie_Personel_calcule.Range("E" & i).Value
                  
                End If
            Next i

            ' Champs dynamiques F2:F9 => G2:G9
            For i = 2 To 9
                If Liste_Paie_Personel_calcule.Range("G" & i).Value <> "" Then
                    colName = Liste_Paie_Personel_calcule.Range("F" & i).Value
                    colIndex = tbl.ListColumns(colName).Index
                    .Cells(1, colIndex).Value = Liste_Paie_Personel_calcule.Range("G" & i).Value
                      
                End If
            Next i

            ' Champ H2 => I2
            If Liste_Paie_Personel_calcule.Range("I2").Value <> "" Then
                colName = Liste_Paie_Personel_calcule.Range("H2").Value
                colIndex = tbl.ListColumns(colName).Index
                .Cells(1, colIndex).Value = Liste_Paie_Personel_calcule.Range("I2").Value
            End If
        End With

        ' Nettoyage des champs de saisie
        Liste_Paie_Personel_calcule.Range("F1").Value = ""
        Dim r As Range
        For Each r In Liste_Paie_Personel_calcule.Range("E2:E9,G2:G9,I2:I9")
            r.Value = ""
        Next r

        MsgBox "Élément ajouté avec succès", vbInformation

    Else
        MsgBox "Veuillez remplir les informations client avant d’ajouter.", vbExclamation
    End If

End Sub
-->

💡 Objectif de la macro Ajouter_Click

Cette macro permet d'ajouter une nouvelle ligne dans un tableau Excel nommé Tbl_Liste_Paie_Personel_calcule, en :

  1. Copiant automatiquement les formules de la ligne précédente.

  2. Remplissant uniquement les champs saisis manuellement par l’utilisateur (par exemple : le matricule, la date, le nombre de jours, certaines indemnités, etc.).

  3. Préservant les formules dynamiques comme le nom et prénom, qui dépendent d’autres tableaux via INDEX ou RECHERCHEV.


🧠 Étapes détaillées du code

1. Vérification avant insertion

vba If Liste_Paie_Personel_calcule.Range("A1").Value = "P" And Liste_Paie_Personel_calcule.Range("E3").Value <> "" Then

Cette ligne vérifie que le mode est bien en "P" (paiement ou présence) et que le matricule est bien rempli (obligatoire).


2. Ajout d’une nouvelle ligne

vba Set newRow = tbl.ListRows.Add

On ajoute une ligne vide à la fin du tableau.


3. Copier les formules de la ligne précédente

vba If tbl.ListRows.Count > 1 Then
Set lastRow = tbl.ListRows(tbl.ListRows.Count - 1).Range lastRow.Copy newRow.Range.PasteSpecial Paste:=xlPasteFormulas

On récupère les formules exactes de la ligne juste au-dessus (par exemple : nom et prénom calculés automatiquement via le matricule) et on les colle dans la nouvelle ligne, sans modifier les valeurs.


4. Remplir uniquement les champs manuels

vba .Cells(1, tbl.ListColumns("Matricule").Index).Value = ...

Ici, on saisit uniquement les données de l'utilisateur, comme le matricule, la date, etc.

Pour les champs dynamiques (comme les indemnités ou primes) :

vba If Liste_Paie_Personel_calcule.Range("E" & i).Value <> "" Then

On vérifie qu’un champ de saisie n’est pas vide avant de l’écrire, pour ne pas écraser une formule par erreur.


5. Nettoyer les zones de saisie

vba For Each r In Liste_Paie_Personel_calcule.Range("E2:E9,G2:G9,I2:I9")
r.Value = ""

Une fois l’ajout effectué, on efface les cellules de saisie pour préparer l’entrée suivante.


✅ Résultat final

  • Les colonnes automatiques (ex. nom & prénom) restent avec leur formule.

  • Les colonnes saisies sont correctement enregistrées.

  • Les utilisateurs n’ont plus besoin de manipuler les formules eux-mêmes.

insérer une ligne au-dessus de la première ligne de données du tableau

insérer une ligne au-dessus

Dim tbl As ListObject

Dim newRow As ListRow


Set tbl = Liste_Paie_Personel_calcule.ListObjects("Tbl_Liste_Paie_Personel_calcule")


' Insérer une ligne dans le tableau, en 1re position

Set newRow = tbl.ListRows.Add(1)


' Effacer contenu + mise en forme pour éviter d'hériter de l'en-tête

With newRow.Range

    .ClearContents

    .ClearFormats

    .Interior.ColorIndex = xlColorIndexNone

End With

Commentaires

Posts les plus consultés de ce blog

🛠 Utilisation de CustomUIEditor pour Personnaliser le Ruban Excel

🗓️ Simulateur de Congés et Calendrier Collaboratif sous Google Sheets

Explication VBA : Facturation automatique Gestion client