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

Fermé
shadowspirit Messages postés 2 Date d'inscription lundi 16 mai 2016 Statut Membre Dernière intervention 17 mai 2016 - Modifié par shadowspirit le 16/05/2016 à 21:03
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 - 18 mai 2016 à 02:47
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

via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
16 mai 2016 à 21:24
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
shadowspirit Messages postés 2 Date d'inscription lundi 16 mai 2016 Statut Membre Dernière intervention 17 mai 2016
17 mai 2016 à 21:58
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
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
18 mai 2016 à 02:47
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