Transformation d'un tableau

  • Initiateur de la discussion Initiateur de la discussion UJAP
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

UJAP

XLDnaute Occasionnel
Bonjour,
Dans le cadre de mon travail, je dois transmettre un tableau de données variables pour le service des Ressources Humaines afin que les informations contenues dans ce tableau soient injectées directement dans le logiciel RH au niveau des données variables d’un agent pour constituer sa paie.

Le tableau que j’ai transmis ne peut être exploité car celui ne correspond pas au modèle exigé par le logiciel RH.

Le service RH me demande de refaire mon tableau en suivant le modèle (tableau 2 en pièce jointe).

Ma question : Peut-on transformer le tableau 1 sous le format du tableau 2 en pièce jointe ? Merci d’avance et quelle est la procédure ?

Je vous transmets un exemple en pièce jointe, car l'original contient de nombreuses lignes,

Merci pour vos réponses,

Christophe
 

Pièces jointes

Re : Transformation d'un tableau

Oui, tu as entièrement raison, sauf que je viens d'avoir cette information après la réalisation,

Et au lieu de recommencer mon tableau (qui est lourd) je préfère d'abord poser cette question,

Merci,
 
Re : Transformation d'un tableau

Bonjour
Bise à JCGL 🙂

Tu ne précises pas si ce besoin est ponctuel ou si tu devras le faire régulièrement.

Je vois 3 possibilités :
  • si ponctuel :
    • utiliser l'astuce décrite ici Ce lien n'existe plus en sélectionnant la plage des 3 colonnes Matricule, Heures Ménage, Heures garderie
    • une fois l'extraction réussie, utiliser INDEX + EQUIV pour remettre les noms
  • si ponctuel ou régulier : on peut
    • soit faire une requête union avec MSQuery
    • soit créer une procédure VBA

A noter que, de façon générale, la disposition du tableau 2, conforme à la logique base de données, est meilleure et peut être exploitée par Tableau et graphique croisés dynamiques pour les synthèses alors que la première entraîne des limites d'exploitation et est moins évolutive.
 
Dernière édition:
Re : Transformation d'un tableau

Bonjour,

cf PJ

Code:
Sub TransformeBD()
  a = Sheets("Feuil1").Range("A3:D" & [A65000].End(xlUp).Row)
  Set f1 = Sheets("feuil1")
  ligBD = 2
  colBD = 8
  For ligne = 2 To UBound(a, 1)
    For col = 3 To UBound(a, 2)
        f1.Cells(ligBD, colBD) = a(ligne, 1)
        f1.Cells(ligBD, colBD + 1) = a(ligne, 2)
        f1.Cells(ligBD, colBD + 2) = a(1, col)
        f1.Cells(ligBD, colBD + 3) = a(ligne, col)
        ligBD = ligBD + 1
    Next col
  Next ligne
End Sub

ou

Code:
Sub TransformeBD2()
  a = Sheets("Feuil1").Range("A3:D" & [A65000].End(xlUp).Row)
  Dim b()
  ReDim b(1 To UBound(a) * 2, 1 To UBound(a, 2))
  Set f1 = Sheets("feuil1")
  ligBD = 1
  colBD = 1
  For ligne = 2 To UBound(a, 1)
    For col = 3 To UBound(a, 2)
        b(ligBD, colBD) = a(ligne, 1)
        b(ligBD, colBD + 1) = a(ligne, 2)
        b(ligBD, colBD + 2) = a(1, col)
        b(ligBD, colBD + 3) = a(ligne, col)
        ligBD = ligBD + 1
    Next col
  Next ligne
  [H2].Resize(UBound(b), UBound(b, 2)) = b
End Sub

JB
 

Pièces jointes

Dernière édition:
Re : Transformation d'un tableau

Bonsoir le forum,

Comme j'avais potassé, je poste.
VB:
Sub Transpose()
Dim a, b(), i As Long, j As Byte, x As Long, y As Byte
    Application.ScreenUpdating = False
    With Range("A2").CurrentRegion
        a = .Value
        For i = 2 To UBound(a, 1)
            For j = 1 To 2
                x = x + 1
                ReDim Preserve b(1 To 4, 1 To x)
                For y = 1 To 4
                    Select Case y
                        Case 1, 2
                            b(y, x) = a(i, y)
                        Case 3
                            b(y, x) = a(1, j + 2)
                        Case 4
                            b(y, x) = a(i, j + 2)
                    End Select
                Next
            Next
        Next
        With .Offset(, .Columns.Count + 2)
            .CurrentRegion.Clear
            .Resize(, 4) = [{"Nom - Prénom", "Mat", "Type","Total"}]
            .Offset(1).Resize(UBound(b, 2), UBound(b, 1)) = _
            Application.Transpose(b)
            With .CurrentRegion
                .Offset(, 1).Resize(.Rows.Count, .Columns.Count - 1).HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .BorderAround ColorIndex:=1, Weight:=xlThin
                .Borders(xlInsideVertical).Weight = xlThin
                .Interior.ColorIndex = 36
                .Columns(1).Interior.ColorIndex = 6
                .Columns.AutoFit
                With .Rows(1)
                    .RowHeight = 20
                    .BorderAround ColorIndex:=1, Weight:=xlThin
                    .Interior.ColorIndex = 44
                    .Font.Underline = xlUnderlineStyleSingle
                    .WrapText = True
                End With
            End With
        End With
    End With
    Application.ScreenUpdating = True
End Sub
 

Pièces jointes

Re : Transformation d'un tableau

bonsoir toutes 🙂, tous 🙂
une autre facon d'ecrire egalement

Code:
Sub es()
  Dim t(), t1(), x As Long, i As Long, k As Long, z As Byte, b, c
  t = Range("a4:d" & Cells(Rows.Count, 1).End(3).Row)
  For i = 1 To UBound(t)
  For z = 1 To 2
  If z = 1 Then c = t(i, 4): b = t(i, 3): t(i, 3) = "Heures ménage" _
  : t(i, 4) = b Else t(i, 3) = "Heures Garderie": t(i, 4) = c
  x = x + 1
  ReDim Preserve t1(1 To 4, 1 To x)
  For k = 1 To 4
  t1(k, x) = t(i, k)
  Next k:  Next z: Next i
  [m2].Resize(x, 4) = Application.Transpose(t1)
 End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
6
Affichages
823
Retour