Convertir un tableau en matrice en tableau de base de données

shadowspirit Messages postés 2 Statut Membre -  
via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'écris ce post afin de solliciter votre aide, je bloque sur la réalisation d'une macro pour exploiter des fichiers propre à mon boulot.

Je vous joint un fichier avec des extraits de feuilles pour présenter la situation et mieux exprimer mes attentes

Contexte :
La feuille "planning matricielle" est celle qui est utilisée pour définir l'emploi du temps du personnel sur l'année.
Je l'ai appelée matriciel par rapport à sa configuration: en ligne les dates et en colonne les noms du personnel. Les données dans la matrice correspondent au planning en 3*8 des 3 équipes (A, B, C).
De cette feuille est crée la feuille "planning rotation" qui sert au placement du personnel chaque semaine.

Mon souhait :
- Automatiser la feuille "planning rotation" qui est faite hebdomadairement.
Pour cela il faudrait que la feuille se trouve sous forme de base de donnée, comme la feuille "planning bdd" (toutes les informations en colonne : date, jour, nom, etc).
- Une fois fait, je pourrais faire un tableau croisé dynamique qui serait l'équivalent du "planning rotation" et permettrait une automatisation du fichier par un simple rafraichissement de celui-ci.

Mon attente :
- Une macro qui récupère les informations de la feuille "planning matricielle" pour les mettre tous en colonne dans la feuille "planning bdd" (c'est vraiment ce qui me bloque actuellement).

Lien fichier excel : http://www.cjoint.com/c/FEqtc5Aix1N

3 réponses

  1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonsoir shadowspirit

    A priori pas besoin de macro, la formule :
    =INDEX('Planning matrice'!$E$6:$M$372;EQUIV(C16;'Planning matrice'!$D$6:$D$372;0);EQUIV(D16;'Planning matrice'!$E$5:$N$5;0)) en E16 de bdd puis étirée vers la bas doit retourner la lettre correspondant à l'équipe

    Cdlmnt
    Via
    0
  2. shadowspirit Messages postés 2 Statut Membre
     
    Bonsoir,

    Merci pour ta réponse Via55.
    Effectivement ta formule me permet d'avoir les informations par rapport au placement en équipe du personnel.
    Seulement la feuille "planning bdd" n'existe pas au départ et par la suite elle n'est pas figée (la feuille utilisé en interne est la feuille "planning matrice" et ce n'est pas près de changer pour l'instant. des personnes peuvent y être rajoutées ou enlevées).
    C'est pour ça que j'ai besoin d'une macro, pour qu'à chaque fois que je travaille dessus, je mets à jour la feuille "planning bdd".

    Ma maitrise étant limitée, je suis parti d'un enregistrement de macro pour connaitre le code des mouvements que je souhaitais faire. Ce qui me manque c'est la définition de boucle pour ne pas avoir à répéter le code pour chaque personne et chaque colonne dans la feuille "planning matrice".

    Sub Planning_bdd()
    '
    ' Planning_bdd Macro
    '
    'Copier_coller colonne
    'Copier_coller 1ere colonne
    Sheets("Planning matrice").Select
    Range("E6:E393").Select
    Selection.Copy
    Sheets("Planning bdd").Select
    Range("F6").Select
    ActiveSheet.Paste

    'Copier_coller 2eme colonne
    Sheets("Planning matrice").Select
    Range("F6:F393").Select
    Selection.Copy
    Sheets("Planning bdd").Select
    Range("F6").End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste

    'Copier_coller 3eme colonne
    Sheets("Planning matrice").Select
    Range("G6:G393").Select
    Selection.Copy
    Sheets("Planning bdd").Select
    Range("F6").End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste

    'Copier_coller 4eme colonne
    Sheets("Planning matrice").Select
    Range("H6:H393").Select
    Selection.Copy
    Sheets("Planning bdd").Select
    Range("F6").End(xlDown).Offset(1, 0).Select
    ActiveSheet.Paste

    Ceci correspond à la formule que tu as fait, j'aimerais ne pas la réécrire pour chaque colonne mais y mettre une boucle.

    En plus de cela, j'aurais aussi besoin du code pour créer la colonne D de la feuille "planning bdd" (le nom de la personne correspondante) avec une boucle pour ne pas avoir à le réécrire aussi.

    J'espère t'avoir assez bien décrit mon besoin, dis le moi si il n'est pas clair et où...
    Merci d'avance pour ta contribution

    End Sub
    0
  3. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour,

    Essaie cette macro

    Sub mise_a_jour()
    Dim LigneM As Long, ligneB As Long, col As Integer
    '1ere ligne vide de bdd
    ligneB = Sheets("Planning bdd").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1
    'efface bbd
    Sheets("Planning bdd").Range("A6:E" & ligneB).ClearContents
    
    'dernière ligne de matrice
    LigneM = Sheets("Planning matrice").Columns(4).Find("*", , , , xlByColumns, xlPrevious).Row
    'nombre de lignes de matrice
    nbl = LigneM - 5
     'dernière colonne de matrice
     col = Sheets("Planning matrice").Rows(5).Find("*", , , , xlByRows, xlPrevious).Column
     
     'desactive rafraichissement ecran
     Application.ScreenUpdating = False
     'Boucle sur colonnes noms de matrice
     For y = 5 To col
     'nom personnel
     nom = Sheets("Planning matrice").Cells(5, y)
    Sheets("Planning matrice").Select
    ' premiere ligne vide bdd
    ligneB = Sheets("Planning bdd").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1
     'copie les 3  colonnes de matrice correpondant à date
     Range("B6:D" & LigneM).Select
     Selection.Copy
     Sheets("Planning bdd").Select
     Range("A" & ligneB).Select
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     'copie le nom
     Sheets("Planning bdd").Range("D" & ligneB & ":" & "D" & ligneB + nbl - 1) = nom
     'copie la colonne équipe
     Sheets("Planning matrice").Select
     Range(Cells(6, y), Cells(LigneM, y)).Select
     Selection.Copy
     Sheets("Planning bdd").Select
     Range("E" & ligneB).Select
     ActiveSheet.Paste
     Next y
     
     'reactive rafraichissement ecran
     Application.ScreenUpdating = True
    End Sub


    Cdlmnt
    Via
    0