Macro VBA - Transformer tableau 1 en tableau 2

Bonjour,

J'ai une feuille excel où se trouve mon tableau 1 qui est le résultat d'un export et je voudrais le transformer en tableau 2 (en ce moment taper à la main) pour illustrer le résultat que je recherche. J'ai essayé de mon côté, je peux poster le code ici car je ne comprends pas pourquoi ma feuille 2 se créer avec le tableau 2 mais qui est vide. J'ai aussi une troisième feuille où je montre un tableau 3 où il faudrait faire un 2ème module VBA pour que le tableau 1 se transforme en tableau 3 comme illustrer dans mon fichier également. Je vous joins le code pour la transformation en tableau 2 que j'ai pour le moment:

Sub CreerNouvelleFeuilleAvecCondition()

    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim lastRow As Long
    Dim newRow As Long
    Dim dateMin As Date
    Dim dateMax As Date
    Dim increment As Long
    Dim nomPrenom As String
    Dim currentNomPrenom As String

    ' Spécifiez le nom de la feuille source où se trouvent les données d'origine
    Set wsSource = ThisWorkbook.Sheets("Détail")

    ' Spécifiez le nom de la feuille de destination où les nouvelles données seront créées
    Set wsDest = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    wsDest.Name = "Récap"

    ' Spécifiez la première ligne à partir de laquelle les données seront lues
    Dim startRow As Long
    startRow = 2

    ' Initialise les variables
    newRow = 2
    increment = wsSource.Cells(startRow, "G").Value ' Colonne 7 (7ème colonne) pour l'incrément
    dateMin = wsSource.Cells(startRow, "E").Value ' Colonne 5 (5ème colonne) pour la date min
    dateMax = wsSource.Cells(startRow, "F").Value ' Colonne 6 (6ème colonne) pour la date max
    nomPrenom = wsSource.Cells(startRow, "C").Value ' Colonne 4 (4ème colonne) pour le nom et prénom

    ' Boucle pour parcourir les données de la feuille source
    For lastRow = startRow To wsSource.Cells(Rows.Count, "A").End(xlUp).Row

        ' Vérifie si la condition est respectée (cellule vide et même nom et prénom)
        currentNomPrenom = wsSource.Cells(lastRow, "C").Value
        If IsEmpty(wsSource.Cells(lastRow, "A").Value) And currentNomPrenom = nomPrenom Then
            ' Met à jour les valeurs de DateMin, DateMax et incrément si nécessaire
            If wsSource.Cells(lastRow, "E").Value < dateMin Then
                dateMin = wsSource.Cells(lastRow, "E").Value
            End If
            If wsSource.Cells(lastRow, "F").Value > dateMax Then
                dateMax = wsSource.Cells(lastRow, "F").Value
            End If
            increment = increment + wsSource.Cells(lastRow, "G").Value ' Ajoute l'incrément
            dataH = dataH & ", " & wsSource.Cells(lastRow, "H").Value ' Concatène la valeur de la colonne H

        Else
            ' Écrit les données dans la feuille de destination
            wsDest.Cells(newRow, "A").Value = wsSource.Cells(startRow, "A").Value ' Valeur de la colonne A
            wsDest.Cells(newRow, "B").Value = wsSource.Cells(startRow, "B").Value ' Valeur de la colonne B
            wsDest.Cells(newRow, "C").Value = nomPrenom ' Valeur de la colonne "Nom + Prénom"
            wsDest.Cells(newRow, "D").Value = wsSource.Cells(startRow, "D").Value ' Valeur de la colonne C
            wsDest.Cells(newRow, "E").Value = dateMin ' Valeur de la colonne "DateMin"
            wsDest.Cells(newRow, "F").Value = dateMax ' Valeur de la colonne "DateMax"
            wsDest.Cells(newRow, "G").Value = increment ' Valeur de la colonne incrément
            wsDest.Cells(newRow, "H").Value = wsSource.Cells(startRow, "H).Value ' Valeur de la colonne H

            newRow = newRow + 1 ' Passe à la prochaine ligne

            ' Réinitialise les variables pour la prochaine itération
            startRow = lastRow
            increment = wsSource.Cells(lastRow, "G").Value ' Colonne 7 (7ème colonne) pour l'incrément
            dateMin = wsSource.Cells(lastRow, "E").Value ' Colonne 5 (5ème colonne) pour la date min
            dateMax = wsSource.Cells(lastRow, "F").Value ' Colonne 6 (6ème colonne) pour la date max
            nomPrenom = currentNomPrenom
        End If
    Next lastRow

    ' Écrit les dernières données de la dernière ligne
    wsDest.Cells(newRow, "A").Value = wsSource.Cells(startRow, "A").Value
    wsDest.Cells(newRow, "B").Value = wsSource.Cells(startRow, "B").Value
    wsDest.Cells(newRow, "C").Value = wsSource.Cells(startRow, "C").Value
    wsDest.Cells(newRow, "D").Value = nomPrenom
    wsDest.Cells(newRow, "E").Value = dateMin
    wsDest.Cells(newRow, "F").Value = dateMax
    wsDest.Cells(newRow, "G").Value = increment
    wsDest.Cells(newRow, "H").Value = wsSource.Cells(startRow, "H").Value

    MsgBox "Opération terminée avec succès !"

End Sub

En vous remerciant d'avance pour votre aide. il faut savoir que dans mon fichier excel dans mon exemple il y a le même nom et prénom mais qu'il pourrait y avoir d'autres personnes donc je fais (dois) faire une vérification par Nom et Prénom quand je le récupère dans le 2 ème tableau et 3 ème tableau. Biensûr mon code doit fonctionner pour d'autres export du même type mais avec de nouvelles informations mais avec les mêmes en-tête de colonne. N'hésiter pas à me demander des clarifications avec plaisir... cela fait un petit moment que je bloque déjà.

Bonjour men777 et bienvenue sur XLP ,

Je n'ai pas compris pourquoi un tableau 1 et un tableau 2.

Chaque tableau correspondrait-il à un nom-Prénom ou à une division ou bien à un service ou à autre chose ?

Comment s'assure-t-on qu'on ne fait pas deux fois le même traitement ?

Bonjour, je te remercie pour ton accueil et pour ton retour. Alors le Tableau 1 de la feuille "Détail" est le résultat d'un export que j'effectue depuis un logiciel. Le tableau 2 de la feuille "Récap" est le résultat que je dois avoir suite à une demande en interne.

Dans le tableau "Détail" dans mon exemple il y a qu'un nom-prénom mais il faut imaginer qu'il peut y avoir 100 personnes différentes. Ce tableau montre les personnes ainsi que toutes les dates comme un calendrier. La colonne H représente 1 jour de maladie par ligne sauf comme on peut le voir il y a des cases vides. Ces cases vides signifie simplement que la personne n'est pas malade et qu'elle est de retour. C'est pourquoi sur le Tableau 2 ils n'y sont pas. Les valeurs 7 - 1 - 1 - 5 ce sont enfaite les jours avec des dates cumulées. Sur le tableau 1 on peut voir qu'il y a 7 jours d'affilés où la personne est malade et ce qui met un stop c'est que le système rencontre des cases vides et ainsi de suite. C'est pour cela que j'essaie de vérifier que la case n'est pas vide et que le nom-Prénom est le même pour faire une incémentation.

J'essaie d'être au plus clair avec ma demande n'ayant pas une énorme expérience avec les Macro VBA d'excel. N'hésite pas à revenir vers moi si + de clarification merci. :)

Je ne sais pas si cette information est nécessaire pour la compréhension. Mais ça serait une macro lancer tous les mois pour les 12 derniers mois. Sur un nouvelle export à chaque fois.

capture d ecran

Bonjour et bienvenu sur le forum

Pour la feuille Recap ci joint ma solution

Mais je n'ai pas compris ce que tu souhaitais pour l'autre feuille

A+ François

Bonjour François,

J'essaie d'ouvrir ton fichier et de lancer la macro pour voir mais j'ai une sécurité qui m'empêche d'exécuter et qui bloque la macro externe. Pourrais-tu me copier coller le code et je l'essaie sur une copie de fichier de mon côté ? Merci d'avance.

Concernant le troisième tableau c'est simplement une autre récap mais en reprenant un itération de chaque colonnes sauf pour date début et date fin qui pour la date fin représente le dernier jour du mois et le date début le premier jour du mois d'après. Le nombre de cas quant à lui est simplement un récap du mois en question combien de fois la personne est malade avec le type +3jrs et pareil pour le -3jrs comme tu peux le voir sur le 1er tableau la personne est malade à 2 reprise donc 2 cas et pareil pour l'autre type (-3jrs).

Dans l'attente d'une solution ou d'un code pour pouvoir tester de mon côté le deuxième tableau et en espérant être clair pour le 2 ème tableau merci.

PS: j'ai déjà essayé en allant dans les propriétés du fichier et débloquer le fichier rien n'y fait. Merci d'avance.

Bonjour

ATTENTION! les tableaux ont été renommée...

Feuil1: T_Data et Recap: t_recap

Sub recap()
Dim i As Long, lig As Long, col As Byte, suiv As Date, nbjour As Byte, ctrl As Boolean
On Error Resume Next
If [T_recap].Item(1, 1) <> "" Then [T_recap].Delete 'on efface recap
ctrl = True
For i = 1 To [T_Data].Rows.Count
If [T_Data].Item(i, 8) = "" Then
ctrl = True
Else
If ctrl = True Then
If [T_recap].Item(1, 1) <> "" Then lig = [T_recap].Rows.Count + 1 Else lig = 1 'RECAP premiere ligne vide
For col = 1 To 8: [T_recap].Item(lig, col) = [T_Data].Item(i, col): Next
nbjour = 1
[T_recap].Item(lig, 7) = nbjour
ctrl = False
Else
nbjour = nbjour + 1
[T_recap].Item(lig, 7) = nbjour
[T_recap].Item(lig, 6) = [T_Data].Item(i, 6)
End If
End If
Next
End Sub

Exact excuse DAN....

A+ François

Bonjour

@Fanfan38,

Merci d'utiliser les balises de code lorsque vous postez un code. Click sur l'icone </> puis coller le code dans la fenêtre.

Merci d'amender votre post.

Cordialement

7rapport.xlsm (19.79 Ko)

Bonjour François,

Je te remercie pour tes retours et désoler pour la mienne tardive. :)

Ton code à merveille mais pour mon cas c'est presque :). Je te renvoie aussi un fichier excel un peu modifier pour t'illustrer la chose avec une modification de ton code originale mais que je n'arrive pas à faire fonctionner pour l'incrémentation comme tu le verras sur les 2 dernières lignes du tableau récap l'incrémentation est faux lorsque je change de nom et qu'il n'y a pas de ligne avec cette cellule vide. Toutes les colonnes ressortent juste sauf celle là. Elle m'indique à l'avant dernière ligne "6,00" au lieu de "5,00" comme on peut le voir dans le premier tableau et à la dernière ligne "4,00" au lieu de "5,00" comme le montre le premier tableau également merci d'avance. Je pense qu'il faut ajouter une condition en plus qui vérifie le nom-prénom également mais je me trompe peut-être. Merci d'avance.

Resalut, concernant la question pour le 3ème tableau. Cela doit reprendre comme le 2ème tableau certaines colonnes mais cette fois-ci il ne faudrait retourner le nombre de jours de la personne. Mais plutot le nombre de cas ça veut dire sur une ligne le nombre de fois ou tel personne à été en type +3j et le nombre de fois ou il a été en type -3j.

Donc cela devrait donné comme dans mon exemple de troisième tableau 2 cas +j et 2 cas -3j. Car plusieurs jours cumulatives équivaut à 1 cas 7 jours consécutif et les 5 jours consécutifs qui tous les deux sont en +3j et deux jours séparé aussi en type -3j donc il faudrait réussir à incrémenter selon les deux types de maladies et par noms.

Merci d'avance.

Bonjour

Ci joint ma solution

10rapport.xlsm (28.70 Ko)

A+ François

Bonjour François,

Je te remercie énormément pour ta persévérance à m'aider. J'ai juste modifié les noms de tableaux pour correspondre aux noms des miens et cela fonctionne finalement. Je dois juste vérifier de mon côté si j'ai tout pris en compte (car je ne suis pas sûr pour la date de début et de fin du troisième tableau), et si c'est le cas, je clôturerai donc ce ticket. :)

Bonne journée.

Bonjour François,

Je reviens vers toi cas j'ai 2-3 spécificité en plus.

Il faut savoir (même si ton code le fait déjà je crois) manque juste à modifier la bonne colonne pour le troisième tableau c'est que la colonne Date début période et Date de fin reprennent 2 éléments copier-coller de deux colonnes en plus sur le premier tableau en colonne I et J. Je reviens également vers toi car le tableau 2 et 3 dont les feuilles elles-mêmes n'existe pas dans les exports de base alors il faudrait que la macro VBA puisse créer ces 2 feuilles en même créer ces 2 tableaux avec leurs en-têtes respectif que tu peux retrouver dans l'ancien exemple rien ne change et ensuite les compléter avec le code que tu m'as donné (en faisant attention à ce que la colonne I et J du tableau 1 équivaut à date début période et date période fin) exemple de colonne I 01.07.2023 et J 31.08.2023 (mais ça serait simplement de reprendre la valeur de ces 2 cases comme ce qui est fait pour division etc) les feuilles s'appeleraient Nb jours et Nb cas donc les tableaux respectivement nbjours et nbcas. Alors j'ai réussi créer les 2 feuilles et j'ai tenté de m'aventurer et de réaliser des bouts de code mais cela n'aboutit à rien et au contraire les feuilles ne se créer pas.

En te remerciant d'avance.

Bonsoir

Il suffit de demander... lol... (Si les feuilles n'existent pas il les crées (feuil3 s'appelle TYPE)

11rapport.xlsm (43.54 Ko)

A+ François

Bonjour François,

Navré de revenir vers toi j'ai regardé ton fichier, j'avais oublié de te joindre le fichier d'exemple du résultat attendu, il y a deux colonnes en plus dans le premier tableau qui viennent s'ajouter comme tu pourras le voir dans le tableau 3 mais pas dans le 2 et il viendra remplacer les valeurs dont les en-têtes seront Date début rapport et Date fin rapport ces valeurs reprennent simplement les valeurs de l'autre tableau que l'export générera.

La feuille 1 sera d'office en "Feuil1" et les deux autres feuilles dont les 2 autres tableaux seront créer. En lançant et en regardant ton code cela me créer bien la feuille 2 "Nb jours" avec le tableau en question "nbjours" mais pour la 3ème feuille cela se créer bel et bien et les en-têtes du tableau aussi mais les champs restent vide je pense que je dois sûrement passer à côté de quelque chose pour ce troisième tableau pour ça. Cependant, je te transmets quand même un fichier d'exemple pour que tu comprennes. Merci d'avance et bonne journée :)

Bonjour

Ci joint ma solution

A+ François

Bonjour François,

Quand j'exécute la macro VBA (j'ai juste modifié les noms de tableaux et des feuilles dans le code). Cependant, sur la feuille Résultat attendu que je t'ai envoyé je ne sais pas si tu as remarqué que dans le tableau 2 nbjours la colonne I et J n'y sont pas et dans le tableau 3 la Colonne I et J n'y sont pas non plus sauf que sur ce 3ème tableaux ils viennent remplacer la colonne E et F dont les en-têtes sont repris aussi. J'ai tenté de modifier le code en conséquence pour que avoir ce résultat mais cela créer des problématiques.

Car pour le moment si j'exécute le code tel quel en tableau 2 et 3 la Colonne I et J viennent s'ajouter en En-têtes même si les cases sont vides. Donc le résultat que j'attends et celui que j'ai décris plus tôt je ne sais pas si tu aurais une idée. Sinon les feuilles et les tableaux eux se créer bien avec les bonnes données etc bon noms etc après modification juste pas les colonnes I et J du tableau détail qui dans le tableau 2 nbjours sont pas là donc " supprimer " et dans le tableau 3 nbcas ils doivent être en colonne E et F avec les en-têtes modifier en conséquence.

Je te remercie d'avance et je m'excuse 'avance avec toutes mes questions :)

PS: Voici le résultat pour le moment lors du lancement de la macro pour le tableau 2 et 3 :

DivisionServiceNom-PrénomTemps dûDate débutDate finNb jourType maladieDate début rapportDate fin rapport
XyDavid Joe8,00lun 03.07.23mar 11.07.237,00Maladie +3J
XyDavid Joe8,00mar 11.07.23mar 11.07.231,00Maladie -3J
XyDavid Joe8,00jeu 20.07.23jeu 20.07.231,00Maladie -3J
XyDavid Joe8,00lun 24.07.23ven 28.07.235,00Maladie +3J

et de mon 3ème tableau :

DivisionServiceNom-PrénomTemps dûDate débutDate finNb CasType maladieDate début rapportDate fin rapport
XyDavid Joe8,00lun 03.07.23ven 28.07.232,00Maladie +3J
XyDavid Joe8,00mar 11.07.23jeu 20.07.232,00Maladie -3J

Alors que le résultat devrait être comme afficher dans mon fichier " résultat attendu" (Alors biensûr c'est un exemple rapide de mon côté qui n'a pas été lancé sur Résultat attendu mais sur un fichier similaire)

Bonjour

Me serai je trompé de fichier car moi je n'ai pas le même résultat

A+ François

Bonjour François,

Désoler pour ce retour tardif.

J'ai eu quelques nouveautés par rapport à ce rapport.

1. C'est qu'au final le premier tableau de la première feuille est brut (c'est à dire qu'il y a une ligne d'en-têtes avec les informations en dessous sauf que ce n'est pas un tableau au départ). Donc m'a question est la suivante est-il possible de le transformer en tableau avec le code VBA pour qu'il fasse la suite comme jusqu'à maintenant car le code fonctionne pour le moment mais seulement si le tableau est crée et porte un nom. (Biensûr c'est les mêmes en-têtes sauf que Nb Jours devient Durée)

2. L'en-tête "Nb jour" du premier et deuxième tableau se nomme "Durée" et dans le deuxième tableau cela résulte plutôt d'une addition comme jusqu'à maintenant de cette colonne à la suite sauf que vu que c'est une "durée" il faudrait que ça fasse un calcul en faisant ("Durée" de chaque ligne diviser par "Temps dû" de chaque ligne diviser par la ). Donc le résultat à chaque fois dans la colonne durée du deuxième tableau et l'addition de ce résultat à la suite.

Merci d'avance n'hésite pas en cas de question

Bonjour

Ci joint ma solution

A+ François

Bonjour François,

J'ai lancé la macro mais cela ne donne pas le résultat attendu je pense. Je te joins un fichier ça sera plus simple pour que tu comprennes il faudrait dans le premier tableau que à chaque fois la "valeur de la cellule "Durée" représente des Heures soit diviser par la cellule "Temps dû" des Heures et si tu te rends sur le tableau 2 le résultat est l'addition du résultat à chaque fois car une personne peut-être malade une demi journée donc 4h , donc cela fait 0,5 donc l'addition résulte à chaque fois du total de ces divisions comme tu peux le voir dans la colonne durée du deuxième tableau.
Je crois que la plage qui se transforme en tableau sur la première page est fixe et pas dynamique car il peut y avoir 3 lignes comme 100 lignes dans cet
export c'est pas fixe et pas de limite de ligne (les 100 lignes sont un exemple). Après un autre problème, je ne sais pas si c'est lié ou non à mon fichier de test de mon côté
mais quand je lance la macro la case durée de mon tableau 2 et case de cas dans mon tableau 3 est au format personnalisé donc est en format date personnalisé
Aurais-tu une idée si c'est simplement parce que j'ai effectué trop de test là-dessus ou bien le code à un problème quelque part ?

D'ailleurs est-il possible de regrouper en 1 module macro, le module Recap et le module macro1 ? Pour qu'un seul module fasse la macro ?

Merci d'avance.

Rechercher des sujets similaires à "macro vba transformer tableau"