Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

11 réponses
Avatar
romanroman
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

10 réponses

1 2
Avatar
LSteph
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





On 10 août, 11:10, romanroman wrote:
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 plac e une
macro qui me fasse une seconde base de données. C'est à dire que le n om de
chaque colonnes deviennent une clé qui apparaissent à toutes les lign es 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
Avatar
romanroman
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
Avatar
LSteph
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


On 10 août, 13:15, romanroman wrote:
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é.
>                                 mois1an née1 mois2année1 ......
> champ1                       .....                    ......          
> .......
> champ2                       .....                     ......            
> ......

> Il y énormement de lignes et de colonnes. Je souhaiterai mettre en pl ace
> 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 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 -
Avatar
LSteph
...un détail

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, 15) & Format(Now, "yymmddhhnn")
Application.ScreenUpdating = True
End Sub



On 10 août, 15:09, LSteph wrote:
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

On 10 août, 13:15, romanroman wrote:



> 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é.
> >                                 mois1 anné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 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 -
Avatar
romanroman
LSteph a écrit le 10/08/2010 à 15h13 :
...un détail

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, 15) & Format(Now, "yymmddhhnn")
Application.ScreenUpdating = True
End Sub



On 10 août, 15:09, LSteph wrote:
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

On 10 août, 13:15, romanroman wrote:



> 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é.
> >                  
              mois1 anné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 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
Avatar
romanroman
romanroman a écrit le 10/08/2010 à 16h06 :
LSteph a écrit le 10/08/2010 à 15h13 :
...un détail

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, 15) & Format(Now, "yymmddhhnn")
Application.ScreenUpdating = True
End Sub



On 10 août, 15:09, LSteph wrote:
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

On 10 août, 13:15, romanroman wrote:



> 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é.
> >                  
              mois1 anné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 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
Avatar
LSteph
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
Romain- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -
Avatar
LSteph
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

On 10 août, 16:22, romanroman wrote:
romanroman a écrit le 10/08/2010 à 16h06 :



> LSteph a écrit le 10/08/2010 à 15h13 :
>> ...un détail

>> 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, 15) & Format(Now, "yymmddhhnn")
>> Application.ScreenUpdating = True
>> End Sub

>> On 10 août, 15:09, LSteph  wrote:
>>> 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

>>> On 10 août, 13:15, romanroman  wrote:

>>> > 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é.
>>> > >                  
>>>               mois1 anné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 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 -
Avatar
romanroman
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

On 10 août, 16:22, romanroman wrote:
romanroman a écrit le 10/08/2010 à 16h06 :



> LSteph a écrit le 10/08/2010 à 15h13 :
>> ...un détail

>> 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, 15) & Format(Now, "yymmddhhnn")
>> Application.ScreenUpdating = True
>> End Sub

>> On 10 août, 15:09, LSteph  wrote:
>>> 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

>>> On 10 août, 13:15, romanroman  wrote:

>>> > 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é.
>>> > >                
 
>>>               mois1
anné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 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
Avatar
romanroman
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

On 10 août, 16:22, romanroman wrote:
romanroman a écrit le 10/08/2010 à 16h06 :



> LSteph a écrit le 10/08/2010 à 15h13 :
>> ...un détail

>> 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, 15) & Format(Now, "yymmddhhnn")
>> Application.ScreenUpdating = True
>> End Sub

>> On 10 août, 15:09, LSteph  wrote:
>>> 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

>>> On 10 août, 13:15, romanroman  wrote:

>>> > 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é.
>>> > >                
 
>>>               mois1
anné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 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
1 2