Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Transformer un tableau croisé dynamique en une nouvelle base de données

306 views
Skip to first unread message

romanroman

unread,
Aug 10, 2010, 5:10:28 AM8/10/10
to
Bonjour,

Je possède un tableau croisé dynamique issu d'une première base de données.
Les lignes constituent les libellées et les colonnes la périodicité.
mois1année1 mois2année1 ......
champ1 ..... ......
.......
champ2 ..... ......
......

Il y énormement de lignes et de colonnes. Je souhaiterai mettre en place une
macro qui me fasse une seconde base de données. C'est à dire que le nom de
chaque colonnes deviennent une clé qui apparaissent à toutes les lignes dans une
nouvelle colonne.

Champ1 mois1année1 ............
Champ2 mois1année1.............
.................................................
Champ1 mois2année1..............
Champ2 mois2année1..............
.................................................

J'éspère que ma question est compréhensible.

Merci par avance.
Romain

LSteph

unread,
Aug 10, 2010, 5:54:22 AM8/10/10
to

Bonjour,

Pour repliquer la base à partir d'un tcd il suffi de doublecliquer sur
le total général.
Mais toi ce que tu veux si j'ai bien compris c'est réorganiser tes
données en créant
un enregistrement pour chaque Mois Année au lieu de les avoir en
colonnes

Il faut évaluer d'abord la conséquence en nombre de lignes qui vont
être bien plus nombreuses:

Champ A,Champ B...ChampN MOIS Année
Aitem1,Bitem1, truc ..n1,mois 1 année1
Aitem1,Bitem1, truc ..n1,mois 2 année1
Aitem 1,Bitem1, truc ..n1,mois 3 année1
...
TrucAitemX, BitemY, truc...nZ, mois12, année?


donc pour faire simple le principe de la macro serait de répliquer la
partie gauche de ta base autant de fois que de colonnes mois année et
supprimer les autres colonnes (décalées à chaque fois) à droite.

exemple si tu as déjà mille lignes dans ta base et des colones pour 5
an s
tu aura désormais une base avec d'autant moins de colonne (5*12) mais
5*12*1000 lignes soit de 1000 on passe à 60000 lignes.....???????

Selon toute alternative mettre un lien vers ton tableau dans ce fil
après l'avoir déposé sut http://cjoint.fr

Cordialement.

--
LSteph

romanroman

unread,
Aug 10, 2010, 7:15:35 AM8/10/10
to
romanroman a écrit le 10/08/2010 à 11h10 :
> Bonjour,
>
> Je possède un tableau croisé dynamique issu d'une première
> base de données.
> Les lignes constituent les libellées et les colonnes la
> périodicité.
> mois1année1 mois2année1 ......
> champ1 ..... ......
> .......
> champ2 ..... ......
> ......
>
> Il y énormement de lignes et de colonnes. Je souhaiterai mettre en place
> une macro qui me fasse une seconde base de données. C'est à dire
> que le nom de chaque colonnes deviennent une clé qui apparaissent
> à toutes les lignes dans une nouvelle colonne.
>
> Champ1 mois1année1 ............
> Champ2 mois1année1.............
> ..................................................
> Champ1 mois2année1..............
> Champ2 mois2année1..............
> ..................................................

>
> J'éspère que ma question est compréhensible.
>
> Merci par avance.
> Romain
Tout d'abord merci, je vous joins le fichier.

Le lien est http://cjoint.com/?iknllFd3jh.

Le but de la manoeuvre est de mettre sur chaque feuilles, les colonnes en
lignes et garder le titre de la colonne en clé de liaison.

Voyez vous ce que je veux dire?

Merci.
Romain

LSteph

unread,
Aug 10, 2010, 9:09:12 AM8/10/10
to
Bonjour,

(Attention les noms de feuilles en dur dans le Select Case
correspondent à ton classeur exemple)

Tu fera un doubleclic dans la feuille à croiser pour utiliser, après
avoir mis
dans le thisworkbook de ce classeur:

'''''''''
Private Sub Workbook_SheetBeforeDoubleClick(ByVal _
Sh As Object, ByVal Target As Range, Cancel As Boolean)

Dim i As Long, LastC As Long, LastR As Long

Select Case Sh.Name
Case "UF", "POLE", "SERVICE"
Cancel = True
Application.ScreenUpdating = False
ThisWorkbook.Sheets.Add after:=Sheets(Sheets.Count)
With Sh
.[a:b].Copy [a1]
[c1] = "Période"
[d1] = "Montant"
LastC = .[iv1].End(xlToLeft).Column
LastR = .[a65536].End(xlUp).Row
For i = LastC To 3 Step -1
Range("c2", "c" & LastR) = .Cells(1, i)
.Range(.Cells(2, i), _
.Cells(LastR, i)).Copy [d2]
Range("a2", "d" & LastR).Copy
Range("a2", "d" & LastR).Insert _
Shift:=xlDown
Next
End With
Range("a2", "d" & LastR).EntireRow.Delete
Case Else
Exit Sub
End Select
Columns(4).AutoFit
ActiveSheet.Name = "Cross" & _
Left(Sh.Name, 25) & Format(Now, "yymmddhhnn")
Application.ScreenUpdating = True
End Sub
''''''
'LSteph

> Le lien esthttp://cjoint.com/?iknllFd3jh.


>
> Le but de la manoeuvre est de mettre sur chaque feuilles, les colonnes en
> lignes et garder le titre de la colonne en clé de liaison.
>
> Voyez vous ce que je veux dire?
>
> Merci.

> Romain- Masquer le texte des messages précédents -
>
> - Afficher le texte des messages précédents -

LSteph

unread,
Aug 10, 2010, 9:13:32 AM8/10/10
to
...un détail

Left(Sh.Name, 15) & Format(Now, "yymmddhhnn")


Application.ScreenUpdating = True
End Sub

> > - Afficher le texte des messages précédents -- Masquer le texte des messages précédents -

romanroman

unread,
Aug 10, 2010, 10:06:55 AM8/10/10
to
>> On 10 août, 13:15, romanroman wrote:
>>
>>
>>
>> > romanroman a écrit le 10/08/2010 à 11h10 :
>>
>> > > ..................................................
>> > > Champ1 mois2année1..............
>> > > Champ2 mois2année1..............
>> > > ..................................................
>>
>> > > J'éspère que ma question est compréhensible.
>>
>> > > Merci par avance.
>> > > Romain
>>
>> > Tout d'abord merci, je vous joins le fichier.
>>
>> > Le lien esthttp://cjoint.com/?iknllFd3jh.
>>
>> > Le but de la manoeuvre est de mettre sur chaque feuilles, les colonnes
>> en
>> > lignes et garder le titre de la colonne en clé de liaison.
>>
>> > Voyez vous ce que je veux dire?
>>
>> > Merci.
>> > Romain- Masquer le texte des messages précédents -
>>
>> > - Afficher le texte des messages précédents -- Masquer le
>> texte des messages précédents -
>>
>> - Afficher le texte des messages précédents -
Je vous remercie par contre je suis un gros naze et je comprend rien aux
instructions que vous m'avez donné.

Excusez-moi.

Pouvez vous me donner plus de détail?

Merci
Romain

romanroman

unread,
Aug 10, 2010, 10:22:45 AM8/10/10
to
>>> > > ..................................................
>>> > > Champ1 mois2année1..............
>>> > > Champ2 mois2année1..............
>>> > > ..................................................
>>>
>>> > > J'éspère que ma question est compréhensible.
>>>
>>> > > Merci par avance.
>>> > > Romain
>>>
>>> > Tout d'abord merci, je vous joins le fichier.
>>>
>>> > Le lien esthttp://cjoint.com/?iknllFd3jh.
>>>
>>> > Le but de la manoeuvre est de mettre sur chaque feuilles, les colonnes
>>> en
>>> > lignes et garder le titre de la colonne en clé de liaison.
>>>
>>> > Voyez vous ce que je veux dire?
>>>
>>> > Merci.
>>> > Romain- Masquer le texte des messages précédents -
>>>
>>> > - Afficher le texte des messages précédents -- Masquer le
>>> texte des messages précédents -
>>>
>>> - Afficher le texte des messages précédents -
>>>
>>
> Je vous remercie par contre je suis un gros naze et je comprend rien aux
> instructions que vous m'avez donné.
>
> Excusez-moi.
>
> Pouvez vous me donner plus de détail?
>
> Merci
> Romain
En fait, j'ai déjà une macco qui fait le même type d'opération. Je vous l'ai
mis sur ce lien : http://cjoint.com/?ikqrkQmk37.

Celle-ci copie toutes les feuilles d'un nombre incalculable de fichiers dans un
même fichier, les unes en dessous les autres et en mettant le nom du fichier
d'origine dans une nouvelle colonne à gauche.

Le principe de cette nouvelle macro et de faire la même chose avec les
colonnes.

Merci.
Romain

LSteph

unread,
Aug 10, 2010, 11:07:56 AM8/10/10
to
D'accord plus de détails..

Comment s'y prendre:

tu copie le code que je t'ai donné (surligne et ctrl+C)
Ensuite dans excel depuis le classeur exemple que tu as proposé
tu vas dans le VisualBasic Editor (alt+F11)
sur ta gauche se trouve l'explorateur de projet
(s'il n'y est pas affiche le via menu affichage du VBE)
Dedans il y a le nom de projet de ton classeur
dévellope le contenu tu y trouve ThisWorkBook (fais un DblClic dessus)

dans le module qui apparaît dans la fenêtre centrale tu positionne le
curseur de ta souris
et tu y colle le Code (Ctrl+V)
vérifie qu'il n'y a pas de lignes en rouge (elles peuvent parfois
être copée par renvoi à la ligne lors de la copie
au besoin tu les remets d'un seul tenant.

Tu referme maintenant le VBE avec sa croix rouge en haut à droite
(attention celle de VBE pas celle d'Excel

Ensuite de retour dans ton classeur tu effectue un doubleclic dans une
de tes feuilles UF Service ou POLE

Une feuille sera générée avec les disposition que tu as demandé.

Comment ce code fonctionne:

'''Dans le thisWorkbook du classeur


Private Sub Workbook_SheetBeforeDoubleClick(ByVal _
Sh As Object, ByVal Target As Range, Cancel As Boolean)

'cet évennement est une procédure privée qui réagit
'sur doubleclic dans feuille du classeur
'Sh désigne la feuille
'Target la cellule cliquée
'Cancel selon quil est vrai ou faux propose l'annulation
'de l'effet habituel du doubleclic


Dim i As Long, LastC As Long, LastR As Long

'On définit les variables
'i sera l'incrément de boucle
' LastC la dernière colonne utilisée
' LastR la dernière ligne remplie

Select Case Sh.Name
'On selectionne un cas de nom de feuille cliquée


Case "UF", "POLE", "SERVICE"

'Si ce cas est un de ces nom
Cancel = True
'Annuler l'action originelle du doubleclic est vrai
Application.ScreenUpdating = False
'la mise à jour écran à faux
'ca va plus vite
ThisWorkbook.Sheets.Add after:=Sheets(Sheets.Count)
'on ajoute une feuille à la fin du compte des feuilles de ce classeur
'quand on fait cela cette feuille devient active(*)
With Sh
'On démarre un boc "Avec" c'est à dire
'avec l'objet désigné Sh, soit , la feuille cliquée
'les instruction commençant par un point
'concerneront cet objet ainsi


.[a:b].Copy [a1]

'on copie les colonnes A et b de la feuille doublecliquée
'vers la cellule a1 de la nouvelle feuille , celle active(*)


[c1] = "Période"
[d1] = "Montant"

'on écrit les tires en c1 et d1


LastC = .[iv1].End(xlToLeft).Column

'LastC notre variable doit désigner la dernière colonne
'on part donc de completemet à droite pour revenir vers la gauche
'comme quand au clavier on fait ctrl et fleche à gauche
'de cette cellule on retient le numéro de colonne Column
'ce repérage s'effectue dans la feuille désignée dans notre Avec
'puisqu'on a mit un point avant le [iv]


LastR = .[a65536].End(xlUp).Row

'idem en partant d'en bas pour le numéro de ligne


For i = LastC To 3 Step -1

'on démarre une boucle d'instructions
'For dont l'incrément i commence à LastC ,
'donc la dernière colonne et va jusqu'à 3
'par pas régressifs Step-1
'donc -1 colonne à chaque fois


Range("c2", "c" & LastR) = .Cells(1, i)

'de C2 jusqu'à la dernière ligne de C
'on écrit le titre de la colonne


.Range(.Cells(2, i), _
.Cells(LastR, i)).Copy [d2]

'on copie le contenu de la colonne d'origine
'en d de la nouvelle feuille, donc les montants
'ici i désigne le numéro de colonne traité
'l'espace suivi d'un underscore c'est juste pour
'pouvoir passer à la ligne au milieu d'une instruction


Range("a2", "d" & LastR).Copy
Range("a2", "d" & LastR).Insert _
Shift:=xlDown

'On fait un copier insérer de tout le bloc
'que l'on renvoie vers le bas
'avant de passer au suivant (la colonne d'avant)
'c'est juste pour garder les intitulés à droite
' C et d seront écrasés par les valeurs de colonne suivantes
'ainsi de suite on fait tout en remontant
Next
'Suivant jusqu'à la fin on repart de For
End With
'Fin du Avec


Range("a2", "d" & LastR).EntireRow.Delete

'On supprime le dernier bloc inséré puisqu'il n'y a plus de colonnes à
traiter
Case Else
'Si la feuille à un autre nom que ceux désigner dans le Case
Exit Sub
'On sort de la procédure sans rien avoiir executé
End Select
' Fin du select case
Columns(4).AutoFit
' On ajuste la colonne 4 où les montants peuvent être à l'étroit


ActiveSheet.Name = "Cross" & _
Left(Sh.Name, 15) & Format(Now, "yymmddhhnn")

'on choisit un nom pour la feuille ainsi ajoutée
'au hasard cross puis 15 premiers chr du nom et dateheurminute
'pour éviter les doublons de nom
Application.ScreenUpdating = True
'on réactive la mise à jour écran
End Sub
'Fin

'LSteph


>
> Excusez-moi.
>
> Pouvez vous me donner plus de détail?
>
> Merci

LSteph

unread,
Aug 10, 2010, 11:20:36 AM8/10/10
to
Si tu peux comprendre ce code là je ne vois pas pourquoi
tu m'a demandé plus de précision tu devrais lire le mien assez
facilement.

Nota dans ce code je vois ceci (je n'ai pas approfondi)
Dim nbl As Integer ' nombre de lignes

pour un nb de lignes mieux vaudrait as Long comme ici
Dim mxl As Long ' maximum lignes feuille

comme cela on peut exceder la moitié de la feuille.


;o)) A+

--
LSteph

romanroman

unread,
Aug 11, 2010, 2:57:10 AM8/11/10
to
LSteph a écrit le 10/08/2010 à 17h20 :
> Si tu peux comprendre ce code là je ne vois pas pourquoi
> tu m'a demandé plus de précision tu devrais lire le mien assez
> facilement.
>
> Nota dans ce code je vois ceci (je n'ai pas approfondi)
> Dim nbl As Integer ' nombre de lignes
>
> pour un nb de lignes mieux vaudrait as Long comme ici
> Dim mxl As Long ' maximum lignes feuille
>
> comme cela on peut exceder la moitié de la feuille.
>
>
> ;o)) A+
>
> --
> LSteph
>
>> >>> > > ..................................................
>> >>> > > Champ1 mois2année1..............
>> >>> > > Champ2 mois2année1..............
>> >>> > > ..................................................
>>
>> >>> > > J'éspère que ma question est
>> compréhensible.
>>
>> >>> > > Merci par avance.
>> >>> > > Romain
>>
>> >>> > Tout d'abord merci, je vous joins le fichier.
>>
>> >>> > Le lien esthttp://cjoint.com/?iknllFd3jh.
>>
>> >>> > Le but de la manoeuvre est de mettre sur chaque feuilles,
>> les colon nes
>> >>> en
>> >>> > lignes et garder le titre de la colonne en clé de
>> liaison.
>>
>> >>> > Voyez vous ce que je veux dire?
>>
>> >>> > Merci.
>> >>> > Romain- Masquer le texte des messages
>> précédents -
>>
>> >>> > - Afficher le texte des messages précédents --
>> Masquer le
>> >>> texte des  messages précédents -
>>
>> >>> - Afficher le texte des messages précédents -
>>
>> > Je vous remercie par contre je suis un gros naze et je comprend rien au x
>> > instructions que vous m'avez donné.
>>
>> > Excusez-moi.
>>
>> > Pouvez vous me donner plus de détail?
>>
>> > Merci
>> > Romain
>>
>> En fait, j'ai déjà une macco qui fait le même type
>> d'opération. J e vous l'ai

>> mis sur ce lien :http://cjoint.com/?ikqrkQmk37.
>>
>> Celle-ci copie toutes les feuilles d'un nombre incalculable de fichiers d
ans
>> un
>> même fichier, les unes en dessous les autres et en mettant le nom du fi
>> chier
>> d'origine dans une nouvelle colonne à gauche.
>>
>> Le principe de cette nouvelle macro et de faire la même chose avec les
>> colonnes.
>>
>> Merci.
>> Romain- Masquer le texte des messages précédents -
>>
>> - Afficher le texte des messages précédents -
Tout d'abord, bonjour.

Merci beaucoup, ça marche très bien. Est ce que je peux vous embetez encore et
vous demander si vous connaissez un code global qui marchera toujours.

Ou est ce que ce code marchera pour tous les classeurs que j'ai?

Merci.
Romain

romanroman

unread,
Aug 11, 2010, 3:08:15 AM8/11/10
to
>> >>> > > ..................................................
>> >>> > > Champ1 mois2année1..............
>> >>> > > Champ2 mois2année1..............
>> >>> > > ..................................................
>>
>> >>> > > J'éspère que ma question est
>> compréhensible.
>>
>> >>> > > Merci par avance.
>> >>> > > Romain
>>

LSteph

unread,
Aug 11, 2010, 5:13:13 AM8/11/10
to
Bonjour,

A-Tu as certainement remarqué deux points particuliers figurant en dur
dans ce code

- Le nom des feuilles ( donc à adapter obligatoirement) dans le Select
Case
- Le fait que l'on a toujours dans tes feuilles le même nombre de
colonnes libellé à gauche (2)
d'ou l'indice 3 limitant la boucle depuis LastC la dernière colonne.
Le cas échéant à adapter également et par voie de conséquence le
traitement des colonnes c et d pourrait aussi devoir être décalé.

B- tu as bien noté je suppose la condition préalable que j'ai
mentionnée dans mon premier post de ce fil
avant de vouloir procèder à l'execution d'un tel code

>Il faut évaluer d'abord la conséquence en nombre de lignes ...

>exemple... mille lignes dans ta base et des colones pour 5 an s


>tu aura désormais une base avec d'autant moins de colonne (5*12) mais
>5*12*1000 lignes soit de 1000 on passe à 60000 lignes.....???????


Il est donc totalement exclu de vouloir généraliser ce code à
n'importe quel fichier.

Cela est toutefois tout à fait possible dès lors que tu traites de
fichiers
répondant à la même structure que ton exemple et sous les réserves
évoquées
voir d'autres particularités auxquelles je n'aurais pas songé.

Cordialement.

--
LSteph


On 11 août, 09:08, romanroman <romanro...@domain-xyz.in> wrote:

0 new messages